A regra NAT não funciona

1

Eu tenho a seguinte situação no meu host:

      veth5
     10.0.0.3
        o  
        |
   ------------    -----------------                    eth0
   |   br0    |----|--o         o--|----o           o------o------ internet
   ------------    | veth3   veth6 | veth7         ppp0
                   |               |            192.168.0.2                    |   namespace   |
                   -----------------

A configuração de roteamento foi feita usando roteamento baseado em política. De acordo com isso, um pacote enviado do host para a Internet (por exemplo, usando o ping) entra na minha rede através do veth5, depois entra no namespace. A partir daqui, ele é encaminhado para veth7, depois para ppp0 e chega à Internet.

Eu quero configurar uma regra NAT que masquerade todo o endereço IP interno usando o IP ppp0 (192.168.0.2). Eu adicionei então a regra usando iptables

$ iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

No entanto, meus pacotes alcançam eth0 sem serem mascarados pela regra acima.

EDITAR

A saída do tcmpdump de vethW e eth0 é:

Saídadeiplink:

Saídadeip-4addr:

Saídadeconntrack-L:

  • fazendopingdaInternetapartirdohost

  • fazendopingnaInternetapartirdonamespace

  • fazendopingdaInternetapartirdohost,apósadicionarumaregranataonamespace

Alguém sabe o motivo?

Agradecemos antecipadamente pela ajuda.

    
por ica 18.07.2017 / 11:57

1 resposta

0

Não é uma resposta, mas uma tentativa de restringir o problema:

Eu reproduzi uma configuração similar, um pouco simplificada, e o mascaramento funciona bem. Parece assim:

+-----------+                             +----------+
|        o--|--o                  o--ptya |  ptyb--o |
|   veth0b  |  veth0a          ppp0       |     ppp0 |
| 10.0.0.1  |  10.0.0.254  10.0.3.1       | 10.0.3.2 |
|           |                             |          |
|   ns0     |                             |   ns1    |
+-----------+                             +----------+

onde a conexão ppp foi feita da seguinte maneira (o segundo pppd no namespace ns1, é claro):

socat PTY,link=/tmp/ptya PTY,link=/tmp/ptyb
sudo pppd 'readlink /tmp/ptya' noauth nocrtscts xonxoff local maxfail 0 10.0.3.1:10.0.3.2 persist
sudo pppd 'readlink /tmp/ptyb' noauth nocrtscts xonxoff local maxfail 0 10.0.3.2:10.0.3.1 persist

Mascaramento:

sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

De ns0, ping 10.0.3.2 aparece em tcpdump -i ppp0 no namespace principal como

IP 10.0.3.1 > 10.0.3.2: ICMP echo request, id 23836, seq 1, length 64
IP 10.0.3.2 > 10.0.3.1: ICMP echo reply, id 23836, seq 1, length 64

então o mascaramento claramente funciona, e não é a interface ppp que está de alguma forma agindo.

Coisas que eu tentaria em seguida:

  • Replique a configuração socat / ppp em seu servidor e veja se ele funciona ou se há algo diferente que o impeça de funcionar.

  • Eu originalmente tentei fazer uma conexão PPPoE com o espaço de usuário pppoe , mas isso é suficientemente complicado que o pppd gerado por pppoe-server continuou morrendo em mim, e eu ainda não descobri o porquê. Então, se você pode reduzir sua configuração PPPoE para uma configuração similar (e talvez me diga o que você fez), pode-se descobrir se é PPPoE que estraga as coisas de alguma forma.

  • Enquanto tentava isso, notei que os scripts fazem muita coisa nos bastidores, se você não for cuidadoso: rotas padrão, atribuições de endereço IP, entrada do iptables e outros itens. Então, eu checo duas vezes se não há regras, rotas ou o que quer que seja na sua configuração, mesmo que você não as tenha colocado lá.

por 19.07.2017 / 19:06