O que curl --interface tun0
faz? De acordo com man: Perform an operation using a specified interface. You can enter interface name, IP address or host name.
Parece estar usando SO_BINDTODEVICE para conseguir isso. Aqui está o que me deixa confuso: pelo que entendi, quando um programa quer enviar um pacote para um destino específico, cabe à tabela de roteamento decidir qual interface usar como origem. Esta opção parece substituir isso de alguma forma. Então o que acontece se não houver uma rota (na tabela de roteamento), que usaria essa interface e alcançaria esse destino?
Caso um (um túnel que foi criado pela sing-box):
ip a:
tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 9000 qdisc fq state UNKNOWN group default qlen 500
link/none
inet 172.18.0.1/30 brd 172.18.0.3 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::717d:757a:23db:789b/64 scope link stable-privacy
valid_lft forever preferred_lft forever
ip route:
172.18.0.0/30 dev tun0 proto kernel scope link src 172.18.0.1
curl example.com --interface tun0
faz o que deve fazer (como, no entanto?) e solicita example.com por meio de tun0.
Caso dois (interface wireguard):
ip a:
wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.230.116.1/24 scope global wg0
valid_lft forever preferred_lft forever
ip route:
10.230.116.0/24 dev wg0 proto kernel scope link src 10.230.116.1
O resultado é:connect to 142.44.215.161 port 80 failed: No route to host
Como ele sabe que, de fato, não há rota até lá?
Entendo que esses túneis são operados por programas de espaço do usuário (ou kernelspace). Isso é como um FuseFS onde esses programas podem simplesmente retornar "não, não permitido" quando não gostam de um IP de destino (ou "sim, posso fazer isso de qualquer maneira", mesmo que, de acordo com a tabela de roteamento, eles não devam enviar para lá)? Isso significa que a tabela de roteamento é completamente ignorada quando SO_BINDTODEVICE é usado? E se eu usasse eth0 em vez de tun0? É uma interface física, ela usaria a tabela de roteamento para descobrir se é possível rotear esse pacote? Finalmente, é possível fazer curl example.com --interface 172.18.0.1
. Surpreendentemente, isso não é equivalente a --interface tun0
, e não tem sucesso. Por que isso?