Problema
Estou enfrentando um comportamento bastante estranho, em que uma rota de gateway padrão aparentemente não relacionada está causando efeitos colaterais inesperados. Consegui replicar esse problema com um exemplo mínimo. O objetivo aqui é principalmente educacional e me deparei com isso enquanto experimentava um cenário mais complexo. Resumindo, estou conseguindo me conectar a um servidor web em 192.168.0.3 quando acredito que não deveria.
Meu laptop está conectado à minha rede doméstica usando WiFi ( rede 192.168.0.0/24 ). A tabela de roteamento está listada abaixo:
kevin@kevin-UX305LA:~$ ip route
default via 192.168.0.1 dev wlp2s0 proto dhcp metric 600
169.254.0.0/16 dev wlp2s0 scope link metric 1000
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.0.0/24 dev wlp2s0 proto kernel scope link src 192.168.0.210 metric 600
Ambos curl 192.168.0.3
e curl --interface wlp2s0 192.168.0.3
atualmente funcionam e dão a seguinte resposta:
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.25.2</center>
</body>
</html>
Agora, prossigo removendo todas as rotas relacionadas à rede 192.168.0.0/24 de forma que as rotas restantes sejam:
kevin@kevin-UX305LA:~$ sudo ip route del default via 192.168.0.1
kevin@kevin-UX305LA:~$ sudo ip route del 192.168.0.0/24
kevin@kevin-UX305LA:~$ ip route
169.254.0.0/16 dev wlp2s0 scope link metric 1000
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
Além disso, ip route get
com e sem ligação a uma interface são mostrados abaixo:
kevin@kevin-UX305LA:~$ ip route get 192.168.0.3
RTNETLINK answers: Network is unreachable
kevin@kevin-UX305LA:~$ ip route get oif wlp2s0 192.168.0.3
192.168.0.3 dev wlp2s0 src 192.168.0.210 uid 1000
cache
Correr curl 192.168.0.3
dá curl: (7) Couldn't connect to server
e correr curl --interface wlp2s0 192.168.0.3
não dá nada (o curl está bloqueado). Aqui está um trecho do que o strace mostra:
setsockopt(5, SOL_SOCKET, SO_BINDTODEVICE, "wlp2s0\0", 7) = 0
connect(5, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("192.168.0.3")}, 16) = -1 EINPROGRESS (Operation now in progress)
Tudo bem e o que eu esperava, ou seja, o laptop não deveria atingir 192.168.0.3 .
Agora aqui está a parte estranha. Se eu adicionar um gateway padrão fictício (digamos, a interface docker0 por meio de um endereço aleatório), de forma que minha tabela de roteamento seja a seguinte:
kevin@kevin-UX305LA:~$ sudo ip route add default via 172.17.0.2
kevin@kevin-UX305LA:~$ ip route
default via 172.17.0.2 dev docker0 linkdown
169.254.0.0/16 dev wlp2s0 scope link metric 1000
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
A execução curl 192.168.0.3
falha, mas a execução curl --interface wlp2s0 192.168.0.3
é bem-sucedida com a resposta HTML anterior.
kevin@kevin-UX305LA:~$ curl 192.168.0.3
curl: (7) Failed to connect to 192.168.0.3 port 80 after 3068 ms: No route to host
kevin@kevin-UX305LA:~$ ip route get 192.168.0.3
192.168.0.3 via 172.17.0.2 dev docker0 src 172.17.0.1 uid 1000
cache
kevin@kevin-UX305LA:~$ curl --interface wlp2s0 192.168.0.3
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.25.2</center>
</body>
</html>
kevin@kevin-UX305LA:~$ ip route get oif wlp2s0 192.168.0.3
192.168.0.3 dev wlp2s0 src 192.168.0.210 uid 1000
cache
Pesquisei sobre SO_BINDTODEVICE
e descobri que ainda deveria estar obedecendo a tabela de roteamento. Por que a adição de um gateway padrão por meio de uma interface diferente por meio de um endereço aleatório é curl --interface wlp2s0 192.168.0.3
bem-sucedida?
Detalhes do Endereço
O comando a seguir lista os endereços associados às interfaces. Verifiquei que após cada comando executado acima, o resultado deste comando é sempre o mesmo.
kevin@kevin-UX305LA:~$ ip -br addr
lo UNKNOWN 127.0.0.1/8 ::1/128
wlp2s0 UP 192.168.0.210/24 fe80::7a03:3420:b8b0:4db7/64
docker0 DOWN 172.17.0.1/16
Em resumo , 192.168.0.210 é este laptop, 192.168.0.3 é outra máquina na rede que hospeda um servidor web e 192.168.0.1 é o gateway padrão (meu roteador).
Ambiente
Estou executando o Linux Mint. Aqui estão algumas informações.
kevin@kevin-UX305LA:~$ uname -a
Linux kevin-UX305LA 5.15.0-84-generic #93-Ubuntu SMP Tue Sep 5 17:16:10 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
kevin@kevin-UX305LA:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Linuxmint
Description: Linux Mint 21.2
Release: 21.2
Codename: victoria