O ping omite as regras iptables / posttrouting?

0

Eu tenho um servidor com uma instalação proxmox e apenas uma conexão de saída (eth0).

Para fazer a rede das máquinas entre si, criei uma ponte de rede (vmbr0) na configuração das interfaces e configurei-a de acordo com o modelo de rede Proxmox (NAT de subpontos).

A bridge tem o IP 10.1.1.1 e age no meu entendimento como uma ponte entre a rede local e o mundo amplo.

Para conseguir isso, as políticas de iptable são implementadas no servidor:

Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  10.1.1.0/24          anywhere
ACCEPT     all  --  anywhere             10.1.1.0/24

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  10.1.1.0/24          anywhere             to:x.x.x.x

Quando faço ping no servidor DNS do Google a partir de uma das vms instaladas no servidor e conectadas por meio da ponte usando: ping 8.8.8.8 , a VM pode obter um resultado de ping do servidor DNS do Google para que o NAT pareça estar trabalhando.

(O nat é novamente para toda a sub-rede (10.1.1.0/24))

Se eu fizer isso: ping -I vmbr0 8.8.8.8 na máquina host, no entanto, o comando ping falhará. Esses comandos de ping usam a interface de ponte para executar ping no servidor DNS do Google e minha expectativa era de que as políticas de POSTROUTING também permitiriam a comunicação com o servidor DNS do Google.

Então, em resumo, quando outros clientes usando a ponte como gateway, eles podem se conectar à Internet, mas se a própria interface for selecionada como interface de saída, ela não conseguirá encontrar uma rota.

Então, isso me leva à minha pergunta, é explicitamente usando uma interface de alguma forma ignorando as regras de pós-venda e é realmente tomado como o ponto final absoluto para roteamento na máquina em questão? - in a sense: vmbr0 stays vmbr0 and never will be masqueraded to eth0 if you choose to ping over it -

    
por mayen 24.08.2018 / 19:29

1 resposta

1

man ping , negrito meu:

-I interface
interface is either an address, or an interface name. If interface is an address, it sets source address to specified interface address. If interface in an interface name, it sets source interface to specified interface.

O problema é forçar a interface com ping -I vmbr0 em vez de deixar o sistema escolher no final a interface certa com ping -I 10.1.1.1 .

Além disso, mesmo que isso não faça diferença com nat/POSTROUTING (veja adiante), você deve entender que você está não roteando ao executar um comando no host, então algumas cadeias (por exemplo: filter/FORWARD ) pode não se aplicar (mas nat/POSTROUTING ainda faz, veja mais adiante). Tenha em mente que isso pode dar resultados diferentes ao executar comandos no host em vez de uma VM roteada dependendo de suas regras, mesmo que não seja o caso aqui com o comando ping correto.

este Fluxo de Pacotes no Netfilter e na Rede Geral mostra esquematicamente que depois que as diferentes cadeias OUTPUT são percorridas por um pacote vindo de um processo local, nat/POSTROUTING ainda é percorrido depois, então sim, se o seu pacote estivesse saindo por eth0 ele ainda teria SNATed: usando ping -I 10.1.1.1 8.8.8.8

Em vez disso, ao forçar a interface com ping -I vmbr0 8.8.8.8 , se você executar tcpdump em vmbr0 , provavelmente verá solicitações ARP de 10.1.1.1 a 8.8.8.8, que não obterão respostas.

E para a pergunta final: sim, forçar a rota não pode deixar o pacote ir para o destino certo. Você nunca pode ter vmbr0 masqueraded, porque SNAT / MASQUERADE é feito em pacotes 'IP , não em uma interface, e seu aplicativo depende de sua rota para o destino.

    
por 24.08.2018 / 21:09