AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 552857
Accepted
larsks
larsks
Asked: 2019-11-19 16:20:15 +0800 CST2019-11-19 16:20:15 +0800 CST 2019-11-19 16:20:15 +0800 CST

Por que minhas conexões de rede estão sendo rejeitadas?

  • 772

Eu tenho um convidado CentOS 8 rodando em um host Fedora 31. O convidado está conectado a uma rede de ponte virbr0, e tem endereço 192.168.122.217. Eu posso fazer login no convidado via ssh nesse endereço.

Se eu iniciar um serviço no convidado escutando na porta 80, todas as conexões do host para o convidado falham assim:

$ curl 192.168.122.217
curl: (7) Failed to connect to 192.168.122.217 port 80: No route to host

O serviço está vinculado a 0.0.0.0:

guest# ss -tln
State    Recv-Q    Send-Q        Local Address:Port        Peer Address:Port

LISTEN   0         128                 0.0.0.0:22               0.0.0.0:*
LISTEN   0         5                   0.0.0.0:80               0.0.0.0:*
LISTEN   0         128                    [::]:22                  [::]:*

Usando tcpdump(no virbr0host ou no eth0convidado), vejo que o convidado parece estar respondendo com uma mensagem ICMP "administrador proibido".

19:09:25.698175 IP 192.168.122.1.33472 > 192.168.122.217.http: Flags [S], seq 959177236, win 64240, options [mss 1460,sackOK,TS val 3103862500 ecr 0,nop,wscale 7], length 0
19:09:25.698586 IP 192.168.122.217 > 192.168.122.1: ICMP host 192.168.122.217 unreachable - admin prohibited filter, length 68

Não há regras de firewall na INPUTcadeia no convidado:

guest# iptables -S INPUT
-P INPUT ACCEPT

A tabela de roteamento no convidado parece perfeitamente normal:

guest# ip route
default via 192.168.122.1 dev eth0 proto dhcp metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.217 metric 100

O SELinux está no modo permissivo:

guest# getenforce
Permissive

Se eu parar sshde iniciar meu serviço na porta 22, tudo funcionará conforme o esperado.

O que está causando a falha dessas conexões?


Caso alguém solicite, a saída completa iptables-savedo convidado é:

*filter
:INPUT ACCEPT [327:69520]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [285:37235]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
*security
:INPUT ACCEPT [280:55468]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [285:37235]
COMMIT
*raw
:PREROUTING ACCEPT [348:73125]
:OUTPUT ACCEPT [285:37235]
COMMIT
*mangle
:PREROUTING ACCEPT [348:73125]
:INPUT ACCEPT [327:69520]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [285:37235]
:POSTROUTING ACCEPT [285:37235]
COMMIT
*nat
:PREROUTING ACCEPT [78:18257]
:INPUT ACCEPT [10:600]
:POSTROUTING ACCEPT [111:8182]
:OUTPUT ACCEPT [111:8182]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A DOCKER -i docker0 -j RETURN
COMMIT
linux
  • 2 2 respostas
  • 18140 Views

2 respostas

  • Voted
  1. Best Answer
    larsks
    2019-11-19T18:55:35+08:002019-11-19T18:55:35+08:00

    Bem, eu percebi. E é um doozy.

    O CentOS 8 usa nftables , o que por si só não é surpreendente. Ele vem com a nftversão dos iptablescomandos, o que significa que quando você usa o iptablescomando ele mantém um conjunto de tabelas de compatibilidade em nftables.

    No entanto...

    O Firewalld -- que é instalado por padrão -- tem suporte nativo para nftables, então não faz uso da camada de compatibilidade do iptables.

    Então, enquanto iptables -S INPUTmostra a você:

    # iptables -S INPUT
    -P INPUT ACCEPT
    

    O que você realmente tem é:

            chain filter_INPUT {
                    type filter hook input priority 10; policy accept;
                    ct state established,related accept
                    iifname "lo" accept
                    jump filter_INPUT_ZONES_SOURCE
                    jump filter_INPUT_ZONES
                    ct state invalid drop
                    reject with icmpx type admin-prohibited  <-- HEY LOOK AT THAT!
            }
    

    A solução aqui (e honestamente provavelmente um bom conselho em geral) é:

    systemctl disable --now firewalld
    

    Com o firewalld fora do caminho, as regras do iptables visíveis com iptables -Sse comportarão conforme o esperado.

    • 13
  2. Alexred
    2020-04-12T21:13:56+08:002020-04-12T21:13:56+08:00

    Caso você não pretenda desabilitar o firewalld, a solução é adicionar a regra nftables mencionada abaixo no host do hipervisor.

    1. Primeiro adicione docker0 à zona interna se você não tiver usado outra específica:

      firewall-cmd --zone=internal --change-interface=docker0 --permanent
      firewall-cmd --reload
      
    2. Execute nftables para aplicar a regra para aceitar o tráfego tcp na porta 80 para a interface virbr0 com destino 192.168.122.217:

      /sbin/nft adicionar regra inet firewalld filter_FWDI_internal_allow oifname "virbr0" ip daddr 192.168.122.217 tcp dport 80 counter aceitar comentário "comentar algo"

    3. Também é necessário adicionar a regra iptables (ou convertê-la em nftables para consistência, veja abaixo):

      /usr/sbin/iptables -t filter -I FORWARD -p tcp -o virbr0 -d 192.168.122.217 --dport 80 -j ACCEPT -m comment --comment "comment something"
      

    Essas duas regras você pode agrupar com script de shell e adicionar a unidade de serviço systemd com um atraso definido para 5 segundos. Para que ele seja executado automaticamente durante a inicialização.

    Também é possível converter a regra iptables para nftables e salvar ambas no conjunto de regras nftables. Mas uma vez que você executar a regra convertida do iptables, o iptables será bloqueado e quaisquer novas alterações no iptables serão possíveis apenas com firewalld e nftables.

    Além disso, precisa ter um kernel customizado de tuntables que faça com que os pacotes que atravessam a ponte não passem pelo iptables. Net.bridge.bridge-nf-call e sysctl.conf

    sysctl net.bridge.bridge-nf-call-iptables=0
    sysctl net.bridge.bridge-nf-call-arptables=0
    sysctl net.bridge.bridge-nf-call-ip6tables=0
    

    Observe que, se você adicioná-lo ao sysctl.conf, ele pode não ser aplicado automaticamente durante a reinicialização, pois é um bug conhecido (dependendo da sua distribuição Linux).

    • 0

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve