Tengo dos interfaces en la máquina servidor. La salida de ip route
es la siguiente:
default via 192.168.100.1 dev enp1s0 proto static metric 100
10.8.0.0/24 dev tap0 proto kernel scope link src 10.8.0.1
192.168.100.0/24 dev enp1s0 proto kernel scope link src 192.168.100.201 metric 100
y ip address
es el siguiente (los MAC están ocultos):
...
1: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
inet 192.168.100.201/24 brd 192.168.100.255 scope global noprefixroute enp1s0
valid_lft forever preferred_lft forever
inet6 fe80::1409:66c6:eb0d:22a1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
2: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
inet 10.8.0.1/24 brd 10.8.0.255 scope global tap0
valid_lft forever preferred_lft forever
inet6 fe80::85:5fff:fe98:6cb7/64 scope link
valid_lft forever preferred_lft forever
El /proc/sys/net/ipv4/ip_forward
valor es 1; El cortafuegos está desactivado.
Lo que quiero es acceder192.168.100.1de10.8.0.100. Acceder al servidor web (que escucha todos los puertos de esta máquina) curl --interface 10.8.0.100 http://10.8.0.1
funciona bien. Pero curl --interface 10.8.0.100 http://192.168.100.201
la producción es Network unreachable
.
Curl inicia un protocolo de enlace TCP y envía un paquete a10.8.0.100interfaz. Luego, el paquete llega a la máquina servidora en10.8.0.1. El servidor mira el destino del paquete y ve que está192.168.100.201. Luego mira la tabla de enrutamiento y ve que192.168.100.201es local. Ahora la respuesta va hacia atrás. El remitente fue10.8.0.100. Al observar la tabla de enrutamiento, podemos encontrar que se puede acceder a ella a través de tap0
, que es local. Entonces ahora ingresa tap0
y llega a 10.8.0.100.
Pero en realidad -no lo es. ¿Es esto porque mi línea de pensamiento está equivocada? Pensé que la información proporcionada por la tabla descrita es suficiente para determinar cómo reenviar paquetes. ¿Está esto realmente incompleto?
Respuesta1
En primer lugar, proporcionar la dirección IP y la interfaz con el parámetro -I ping
no son sinónimos. Primero dice cuál source IP
elegir. Lo enrutará según el flujo neto, incluidas las direcciones locales y las tablas de enrutamiento. El segundo le indica que elija directamente la interfaz a la que enviar el paquete (y elegirá la primera IP asignada como fuente).
A continuación, lo que estás haciendo no tiene nada que ver con el reenvío de paquetes. Reenviar significa que el paquete tiene que llegar realmente desde "exterior". Como está generando un paquete desde este host, no hay ningún reenvío involucrado. Es un paquete generado localmente. Como su IP de destino es una de las direcciones asignadas localmente, cuando no fuerza el ping para enviar paquetes a una interfaz específica "externa" (con -I interface
opción), el kernel procesará este flujo de paquetes internamente. Simplemente no intentará enviarlo a una interfaz real ya que su destino "ya está aquí". Entonces esto es lo que sucede y por qué funciona en un caso y no en otro.
PD: consulte también la -r
opción de la ping
herramienta en caso de que sepa que lo está haciendo y ambas interfaces están conectadas al mismo dominio de transmisión (lo dudo con la interfaz TAP).
Respuesta2
El problema fue la falta de comprensión de la diferencia entre --interface IP
y --interface dev
. El primero usa la tabla de enrutamiento:
con --interface 10.8.0.100
el paquete no se reenviará a tap0
la interfaz (a la que pertenece esta ip). En cambio, de acuerdo con la tabla de enrutamiento, se reenviará a 192.168.100.58
(la interfaz LAN). Entonces la ruta es 10.8.0.100 -> 192.168.100.58 -> 192.168.100.201
. Incluso el hecho de que se entregó SYN, el servidor extrañamente no responderá con SYN-ACK; esa es la razón por la que curl falla.
Usando --interface tap0
, es decir, la dirección de la capa de enlace, funcionará según lo previsto: 10.8.0.100 -> 10.8.0.1 -> 192.168.100.201
. El SYN-ACK se devolverá utilizando la misma ruta.