Pregunta Cuando el alias de IP, ¿cómo determina el sistema operativo qué dirección IP se usará como fuente para las conexiones TCP / IP salientes?


Tengo un servidor que ejecuta Ubuntu Server con cuatro direcciones IP con alias en una sola NIC.

eth0       192.168.1.100
eth0:0     192.168.1.101
eth0:1     192.168.1.102
eth0:2     192.168.1.103

(Usando 192.168.x.x por ejemplo, supongamos que se trata de NAT para un rango de direcciones IP públicas)

Uno de nuestros clientes publica su inventario a través de FTP, por lo que iniciamos sesión cada noche para descargar un archivo grande desde su servidor. Su firewall espera que nuestra conexión FTP (pasiva) se realice desde 192.168.1.100.

Dado que mi servidor tiene lógicamente cuatro direcciones IP en un solo adaptador, ¿cómo determina el sistema operativo qué dirección IP se usa como fuente para las conexiones TCP / IP salientes?

Digamos que estoy en mi servidor en 192.168.1.101 y ejecuto FTP de forma interactiva. ¿Utilizará la conexión TCP / IP saliente 192.168.1.101 porque el sistema operativo sabe que esa es la interfaz a través de la cual está conectado mi shell?

¿Qué sucede si la tarea FTP se ejecuta de forma no interactiva a través de un trabajo cron donde no hay shell?

Como probablemente pueda decir, esto me tiene bastante confundido, así que espero que mis preguntas tengan al menos Tuvo sentido.

Editar

Para aclarar por qué lo pregunto, no he realizado ningún cambio en la tabla de enrutamiento y, en realidad, enumera 'eth0' como el IFace para las rutas 0.0.0.0. Sin embargo, todas las indicaciones indican que en realidad está utilizando eth0: 0 como fuente.

Destination    Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0        192.168.1.1     0.0.0.0         UG    100    0        0 eth0

Puedo jugar con la tabla de enrutamiento o hacer que nuestro cliente cambie sus reglas de firewall para obtener el comportamiento que necesito, pero estoy tratando de obtener una pequeña idea de cómo funciona esto para saber si hay un error en el sistema operativo o simplemente mi comprensión ingenua De cómo encajan todas las piezas.

Gracias


15
2018-05-26 16:26


origen




Respuestas:


De forma predeterminada, en Linux, si una interfaz tiene varias direcciones que están en subredes diferentes, el tráfico destinado a las subredes respectivas tendrá la IP de origen adecuada. Es decir, si eth0 tiene dos direcciones 192.168.1.1/24 y 10.1.1.1/8, entonces el tráfico a cualquier cosa en la subred 10.0.0.0 tendrá una fuente 10.1.1.1, y el tráfico a cualquier cosa en la subred 192.168.1.0 tendrá una fuente 192.168.1.1. También puede asignar direcciones de origen explícitamente en este caso usando la opción "src 1.2.3.4" para "ip route".

Sin embargo, en su caso, todas sus direcciones están en la misma subred, de modo que la "principal" (según lo revelado por "ip addr list dev eth0") se usa como la IP de origen para el tráfico que sale de esa interfaz. Creo que es posible controlar las IP de origen en este caso simplemente usando "ip route", pero me ha resultado más fácil usar iptables para volver a escribir las direcciones de origen para el tráfico de interés.

Si desea forzar el uso de una dirección de origen específica para destinos específicos, puede hacerlo con una regla SNAT:

iptables -t nat -I POSTROUTING -o eth0 -d dest-IP-or-net/mask -s primary-IP-of-eth0 -j SNAT --to-source desired-source-IP

Entonces, si su IP eth0 "primaria" es 192.168.100.1, pero desea que el tráfico a 1.2.3.4 tenga una fuente de 192.168.100.2, entonces haga esto:

iptables -t nat -I POSTROUTING -o eth0 -d 1.2.3.4/0 -s 192.168.100.1 -j SNAT --to-source 192.168.100.2

Tenga en cuenta que el "-s 192.168.100.1" es importante: evita reenviado Las direcciones de origen del tráfico están siendo reescritas por esta regla.

Si va a implementar configuraciones de red complejas en Linux, debe leer la documentación de Control de tráfico y enrutamiento avanzado de Linux, http://lartc.org


12
2017-07-23 02:58



En la muestra, tal vez reemplace "-d 1.2.3.4/0" con "-d 1.2.3.4/332" o "-d 1.2.3.4" - Christian


Veo en tu ejemplo que todos los ips están demasiado cerca para no estar en la misma red

¿está seguro de que en realidad es multihoming y no solo tiene 4 alias de IP?

Si este último es el caso, puede configurar la IP de origen en una ruta con algo similar a este

/ sbin / ip route show   192.168.222.0/24 dev eth0 proto kernel ámbito de enlace src 192.168.222.178   169.254.0.0/16 dev eth0 alcance del enlace   predeterminado a través de 192.168.222.1 dev eth0

ruta sudo / sbin / ip reemplazar predeterminado a través de 192.168.222.1 src 192.168.222.178

/ sbin / ip route show
  192.168.222.0/24 dev eth0 proto kernel ámbito de enlace src 192.168.222.178   169.254.0.0/16 dev eth0 alcance del enlace   predeterminado a través de 192.168.222.1 dev eth0 src 192.168.222.178

Ver las interfaces de los hombres sobre cómo hacerlo persistente entre reinicios.


5
2018-05-26 16:58



Estás en lo correcto. Tal vez estoy abusando del término multi-homing. Nuestro centro de datos nos da cuatro direcciones IP, todas en la misma subred. - Joe Holloway
Sabes que puedes editar tu pregunta, ¿verdad? - hayalci


Utiliza lo que sea la puerta de enlace predeterminada en la tabla de enrutamiento, a menos que haya una ruta específica que le indique usar otra: route -n

EDIT: leí su pregunta demasiado rápido parece ...

Ya que está usando el modo pasivo y el cliente siempre iniciará la conexión, creo que el campo src ip en el encabezado de IP siempre aparecerá como cualquier IP con la que el cliente se conectó. Si fuera el modo activo, el servidor estaba iniciando la conexión, creo que siempre sería la IP "principal". Si sus direcciones están en la misma subred, Linux hará que la primera dirección que usted agregó sea 'Primaria' y las otras secundarias.

Sin embargo, no estoy del todo seguro, ejecutaría tcpdump -n y vería lo que ve como la src IP.

EDIT2: Muy bien, escribí lo anterior desde el punto de vista de que estaba ejecutando el servidor, por lo que, dado que usted es el cliente y está iniciando la conexión, creo que siempre parecerá que proviene de la dirección IP principal, pero nuevamente, inténtelo y vea con tcpdump.


5
2018-05-26 16:30



La tabla de enrutamiento es solo la predeterminada y solo hay una subred. Otro cartel indicaba que abusé del término multihoming. Sin embargo, todavía espero que esté utilizando el alias eth0. Utilicé wget para descargar whatsmyip.net y me muestra que de alguna manera estoy usando eth0: 0 en su lugar. - Joe Holloway
Eso realmente no tiene sentido para mí, Whatsmyip.net debería mostrar su IP pública ... - Kyle Brandt♦
Para ser más claros, muestra la dirección IP pública que está NAT-ed a la IP privada asociada con eth0: 0, mientras que yo esperaría que muestre la dirección IP pública que está NAT-ed a la IP privada asociada con eth0 - Joe Holloway
Esta respuesta aquí se ha votado demasiado y contiene muchas ediciones y confunde muchas cosas y no ayuda. Las respuestas de tbman y jknapka son excelentes y me ayudaron mucho. - Christian


A menos que su trabajo de FTP tenga una forma de especificar la interfaz que se usará para las conexiones, creo que de manera predeterminada es la primera interfaz física en la subred relevante (eth0 en este caso). Si tuviera un servidor con dos NIC en diferentes subredes, podría averiguar qué interfaz utilizar en función de la tabla de enrutamiento.

Como solo hay una única interfaz física en el sistema (eth0) y cuatro virtuales / alias (eth0: 0 a eth0: 2) en la misma subred, el tráfico saliente utilizará la dirección IP eth0 como fuente a menos que la aplicación sea lo suficientemente inteligente para declarar una interfaz de salida.


4
2018-05-26 17:59



Esta fue mi suposición, pero todas mis pruebas indican que está utilizando eth0: 0 como fuente. - Joe Holloway
Entonces, tal vez la ruta predeterminada está configurada para usar la interfaz eth0: 0. Tengo una instalación que utiliza un puente de Ethernet, y se configuró para usar la interfaz del puente virtual para la ruta predeterminada. - sysadmin1138♦
Configuré un programa trivial en otra máquina para imprimir la IP de la que recibió una conexión. Conectándose a ella con nc -s <ip of eth0:2> o lo que siempre muestra la dirección de origen es en realidad la ip de eth0: 0, aunque netcat hizo una bind(2) antes de connect(2). Así que parece que los alias no funcionan para dar a una máquina la capacidad de hacer conexiones desde múltiples direcciones de origen. - Peter Cordes


Podría ver qué dispositivo y dirección IP src utilizará el comando ip route get como se muestra a continuación:

$ /sbin/ip route get 1.1.1.1
1.1.1.1 via 2.2.2.2 dev eth0  src 2.2.2.2 
    cache  mtu 1500 advmss 1460 hoplimit 64

No he intentado esto en un entorno con alias, pero espero que esto ayude.


4
2018-06-24 18:35





Al establecer una conexión de salida, su servidor buscará en su tabla de enrutamiento para determinar cuál de sus cuatro interfaces debe usar; sus conexiones TCP tendrán una IP de origen de su interfaz de salida.

netstat -rn

Le dará la salida de su tabla de enrutamiento; busque cualquier entrada específica que coincida con la IP del cliente con la que está intentando conectarse. Si no existe ninguno, entonces estará usando una ruta predeterminada (0.0.0.0, máscara 0.0.0.0). Si tiene varias rutas predeterminadas, la que tenga el menor costo será la que se use.


1
2018-05-26 18:41