Eu tenho um servidor Linux com duas interfaces Ethernet conectadas ao mesmo switch e na mesma sub-rede. A topologia é a seguinte
+--------------------+
| |
| +----------+ +----------+
| | enp1s0f0 |<======>| |
| +----------+ | ethernet |
| Server | | |
| +----------+ | switch |
| | enp1s0f1 |<======>| |
| +----------+ +----------+
| |
+--------------------+
O endereço IP dessas duas interfaces é 172.16.0.100
e 172.16.1.100
respectivamente.
$ ip addr
...
4: enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 10:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 172.16.0.100/16 brd 172.16.255.255 scope global noprefixroute enp1s0f0
valid_lft forever preferred_lft forever
5: enp1s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 10:00:00:00:01:00 brd ff:ff:ff:ff:ff:ff
inet 172.16.1.100/16 brd 172.16.255.255 scope global noprefixroute enp1s0f1
valid_lft forever preferred_lft forever
...
Agora quero enviar pacotes de enp1s0f0
para enp1s0f1
através do switch externo (para fins de teste, do ponto de vista do switch, há dois computadores individuais se comunicando). Portanto, vinculo o endereço local do soquete a 172.16.0.100 e o conecto a 172.16.1.100 (por exemplo, use telnet -b 172.16.0.100 172.16.1.100 22
o comando). No entanto, só consigo ver esses pacotes passando pela lo
interface (inspecionando os pacotes capturados), em vez dessas duas interfaces Ethernet e do switch.
Então minha primeira pergunta écomo posso forçar o Linux a enviar esses pacotes com destino local através de interface externa?
Acho que defini os endereços e a tabela de roteamento corretamente. A tabela de roteamento contém as seguintes entradas
$ ip route
...
172.16.0.0/16 dev enp1s0f0 proto kernel scope link src 172.16.0.100 metric 100
172.16.0.0/16 dev enp1s0f1 proto kernel scope link src 172.16.1.100 metric 101
E a tabela ARP também parece estar configurada corretamente
$ arp -n
Address HWtype HWaddress Flags Mask Iface
172.16.1.100 ether 10:00:00:00:01:00 CM enp1s0f0
172.16.0.100 ether 10:00:00:00:00:00 CM enp1s0f1
No entanto, o Linux ainda roteia esses pacotes através da lo
interface
$ ip route get from 172.16.0.100 172.16.1.100
local 172.16.1.100 from 172.16.0.100 dev lo uid 1000
cache <local>
$ ip route get from 172.16.1.100 172.16.0.100
local 172.16.0.100 from 172.16.1.100 dev lo uid 1000
cache <local>
Eu também tentei ping
usar essas interfaces, por exemplo ping -I enp1s0f0 172.16.1.100
. Os pacotes capturados mostram que os pacotes ICMP enviados podem chegar ao destino através do switch conforme esperado, porém não há pacotes de resposta vistos na enp1s0f1
interface. Procurei uma solução para esse problema e encontreiesseresposta, e diz que isso pode estar relacionado afiltragem de caminho reverso. Então tentei desabilitar rp_filter
definindo rp_filter
o valor padrão e das interfaces como 0 e 2, mas isso não resolveu o problema. Minha pergunta adicional éminha configuração está correta e como devo fazer o Linux responder aos pacotes de ping ICMP nesta situação?
Meu sistema operacional é Ubuntu 20.04 e as respostas ICMP funcionam bem em outras interfaces e não há entradas iptable configuradas.