iproute2 roteamento através de múltiplas redes com rt_tables

1

Esta pergunta é similar a muitos outros que eu consultei enquanto procurava uma resposta, tanto no ServerFault como em outros lugares, mas eu estou presa porque, até onde eu posso ver, configurei isso corretamente, mas não tenho alegria em trabalhar.

Configurei um ambiente simulado usando várias máquinas no VirtualBox, uma representa um servidor (para ser usado como um roteador) e a outra simula dois modems ADSL (apenas se comporta como um roteador NAT com duas portas no lado da LAN e um no lado da WAN para a Internet).

O servidor (SRV) conecta duas portas (ETH2 e ETH3) a duas redes virtuais Vbox separadas através da máquina ADSL (conectando-se às suas portas ETH2 / 3, respectivamente).

                  +----------+
                  |   SRV    |
                  +----------+
 ETH2 (192.168.1.10) |     | ETH3 (192.168.2.11)
                     |     |
                     |     |
  ETH2 (192.168.1.1) |     | ETH3 (192.168.2.1)
                  +----------+
                  |   ADSL   |
                  +----------+

As portas ADSL são ETH2 (192.168.1.1) e ETH3 (192.168.2.1).

As portas SRV são ETH2 (192.168.1.10) e ETH3 (192.168.2.11).

SRV iptables não faz nada de interesse, além de ver os comentários abaixo sobre os ajustes na rota padrão main durante o teste.

Configuração

ip route show

default via 192.168.1.1 dev eth2
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.10
192.168.2.0/24 dev eth3 proto kernel scope link src 192.168.2.11
192.168.10.0/24 dev eth1 proto kernel scope link src 192.168.10.1
192.168.13.0/24 dev admin.tinc proto kernel scope link src 192.168.13.1

Configure duas tabelas adsl1 e ads2

ip route show table adsl1

default via 192.168.1.1 dev eth2
192.168.1.0/24 dev eth2 scope link src 192.168.1.10

ip route show table adsl2

default via 192.168.2.1 dev eth3
192.168.2.0/24 dev eth3 scope link src 192.168.2.11

ip rule

0:      from all lookup local
32762:  from all to 192.168.1.0/24 lookup adsl1
32763:  from all to 192.168.2.0/24 lookup adsl2
32764:  from 192.168.2.0/24 lookup adsl2
32765:  from 192.168.1.0/24 lookup adsl1
32766:  from all lookup main
32767:  from all lookup default

Demonstrar problema

Se eu fizer ping via ETH2, não há problema.

ping -I eth2 -c 1 google.com

PING google.com (216.58.214.14) from 192.168.1.10 eth2: 56(84) bytes of 
data.
64 bytes from lhr26s05-in-f14.1e100.net (216.58.214.14): icmp_seq=1 ttl=61 
time=20.2 ms

--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 20.288/20.288/20.288/0.000 ms

Se eu fizer ping via ETH3, não haverá tráfego no ETH3.

PING google.com (216.58.213.110) from 192.168.2.11 eth3: 56(84) bytes of 
data.

--- google.com ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

Se eu alterar o gateway padrão da tabela main ...

ip route replace default via 192.168.2.1 dev eth3

ocorre o inverso (o ETH3 funciona, o ETH2 falha). Na minha opinião, isso sugere que as tabelas de roteamento adsl1 e adsl2 estão erradas ou simplesmente não estão sendo consultadas (regras estão erradas). Mas não consigo descobrir por quê?

Atualização 1

sysctl -w net.ipv4.conf.all.rp_filter=0

sysctl -w net.ipv4.conf.eth2.rp_filter=0

sysctl -w net.ipv4.conf.eth2.rp_filter=0

Repetido ping -I eth3 google.com enquanto ...

tcpdump -i eth3

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth3, link-type EN10MB (Ethernet), capture size 262144 bytes
20:26:32.207178 ARP, Request who-has lhr35s11-in-f14.1e100.net tell 192.168.2.11, length 28
20:26:33.221587 ARP, Request who-has lhr35s11-in-f14.1e100.net tell 192.168.2.11, length 28

Informações adicionais para atualizar 1

Quando o ETH3 é definido como rota padrão em main (nenhuma outra alteração), o tcpdump é:

tcpdump: listening on eth3, link-type EN10MB (Ethernet), capture size 262144 bytes
21:41:51.865488 IP (tos 0x0, ttl 64, id 31173, offset 0, flags [DF], proto ICMP (1), length 84)
    192.168.2.11 > google-public-dns-a.google.com: ICMP echo request, id 2962, seq 1, length 64
21:41:51.866542 IP (tos 0x0, ttl 64, id 18679, offset 0, flags [DF], proto UDP (17), length 71)
    192.168.2.11.36067 > one.one.one.one.domain: [bad udp cksum 0xc4f9 -> 0xb220!] 31965+ PTR? 11.2.168.192.in-addr.arpa. (43)
21:41:51.885947 IP (tos 0x0, ttl 61, id 4776, offset 0, flags [DF], proto ICMP (1), length 84)
    google-public-dns-a.google.com > 192.168.2.11: ICMP echo reply, id 2962, seq 1, length 64

Adição de informações adicionais

ip route get 8.8.8.8 oif eth3

8.8.8.8 dev eth3 src 192.168.2.11
    cache  users 1

Então, definitivamente algo danificado com roteamento (ao invés de problemas em outros lugares). Também explica a presença singular de ARP !

Ok!

Parece que quando o tráfego é direcionado para a interface ETH3, não é atribuído um endereço 'de' de 192.168.2.11 , como esperado, pelo menos não a tempo para a decisão do db da diretiva de roteamento.

Eu adicionei manualmente uma regra simples:

ip rule add to 8.8.8.8 lookup adsl2

Então

ip route get 8.8.8.8 oif eth3

8.8.8.8 via 192.168.2.1 dev eth3 table adsl2 src 192.168.2.11
    cache

Evidentemente, a tabela adsl2 está sendo usada e define corretamente o via 192.168.2.1 . Viva!

MAS se eu substituir essa regra pela regra mais específica

ip rule add to 8.8.8.8 from 192.168.2.11 lookup adsl2

Eu obtenho

ip route get 8.8.8.8 oif eth3

8.8.8.8 dev eth3 src 192.168.2.11
    cache

Volta para o estado em que via não está definido, conclusão: adsl2 table não está sendo usada. Conclusão adicional: from não é efetivo, então interface eth3 não definindo endereço src para 192.168.2.11 apesar de ip a mostrando

5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:e5:7e:eb brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.11/24 brd 192.168.2.255 scope global eth3
    valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fee5:7eeb/64 scope link
       valid_lft forever preferred_lft forever

Onde eu estraguei tudo?

    
por Marcus 16.11.2018 / 17:55

0 respostas