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

15

Tengo un servidor que ejecuta Ubuntu Server con cuatro direcciones IP 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.xx por ejemplo, suponga que estos tienen NAT-ed en 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 todas las noches para descargar un archivo grande de su servidor. Su firewall espera que nuestra conexión FTP (pasiva) se realice desde 192.168.1.100.

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

Digamos que ssh en mi servidor en 192.168.1.101 y ejecuto FTP de forma interactiva. ¿La conexión TCP / IP saliente usará 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 notar, esto me tiene bastante confundido, así que espero que mis preguntas al menos tengan sentido.

Editar

Para aclarar por qué pregunto, no he realizado ningún cambio en la tabla de enrutamiento y en realidad enumera 'eth0' como IFace para las rutas 0.0.0.0. Sin embargo, todo indica que en realidad está usando 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 solo mi comprensión ingenua de cómo encajan todas las piezas.

Gracias

Joe Holloway
fuente

Respuestas:

12

De manera predeterminada, en Linux, si una interfaz tiene varias direcciones que se encuentran 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á la fuente 10.1.1.1, y el tráfico a cualquier cosa en la subred 192.168.1.0 tendrá la fuente 192.168.1.1. También puede asignar direcciones de origen explícitamente en este caso utilizando la opción "src 1.2.3.4" a "ruta ip".

Sin embargo, en su caso, todas sus direcciones están en la misma subred, por lo que la "primaria" (como revela "ip addr list dev eth0") se utiliza 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 "ruta IP", pero me ha resultado más fácil usar iptables para reescribir 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, 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 "-s 192.168.100.1" es importante: evita que esta regla reescriba las direcciones de origen del tráfico reenviado .

Si va a implementar configuraciones de red complejas en Linux, debe leer la documentación de Linux Advanced Routing and Traffic Control, http://lartc.org

usuario14017
fuente
En la muestra, puede reemplazar "-d 1.2.3.4/0" con "-d 1.2.3.4/332" o "-d 1.2.3.4"
Christian
5

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

¿estás seguro de que en realidad eres multihoming y no solo tienes 4 alias de IP?

si este es el caso, puede configurar la fuente ip en una ruta con algo similar a esto

/ sbin / ip route show 192.168.222.0/24 dev eth0 proto kernel scope link src 192.168.222.178 169.254.0.0/16 dev eth0 scope link default a través de 192.168.222.1 dev eth0

sudo / sbin / ip route reemplaza el valor 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 scope link src 192.168.222.178 169.254.0.0/16 dev eth0 scope link predeterminado a través de 192.168.222.1 dev eth0 src 192.168.222.178

vea las interfaces de hombre sobre cómo hacerlo persistente entre reinicios

Aleksandar Ivanisevic
fuente
Estás en lo correcto. Quizás 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
5

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

EDITAR: leí tu pregunta demasiado rápido, parece ...

Dado que está utilizando 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 la IP a la que se conectó el cliente. Si estuviera en modo activo, el servidor estaba iniciando la conexión, creo que siempre sería la IP 'primaria'. Si sus direcciones están en la misma subred, Linux hará que la primera dirección que agregue sea 'Primaria' y las demás secundarias.

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

EDIT2: De acuerdo, escribí lo anterior desde el punto de vista de que estaba ejecutando el servidor, por lo que dado que usted es el cliente e inicia la conexión, creo que siempre parecerá provenir de la dirección IP principal, pero nuevamente, pruébelo y vea con tcpdump.

Kyle Brandt
fuente
La tabla de enrutamiento es la predeterminada y solo hay una subred. Otro póster indicó que usé mal el término multihoming. Sin embargo, todavía espero que use el alias eth0. Solía ​​wget para descargar whatsmyip.net y me muestra que de alguna manera estoy usando eth0: 0.
Joe Holloway
Que en realidad no tiene sentido para mí, whatsmyip.net debe mostrar su IP pública ...
Kyle Brandt
Para ser más claro, muestra la dirección IP pública que es NAT-ed a la IP privada asociada con eth0: 0, mientras que esperaría que muestre la dirección IP pública que es NAT-ed a la IP privada asociada con eth0
Joe Holloway
1
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
4

A menos que su trabajo de FTP tenga una forma de especificar la interfaz que se utilizará para las conexiones, creo que por defecto es la primera interfaz física en la subred relevante (eth0 en este caso). Si tuviera un servidor con dos NIC en subredes diferentes, averiguaría qué interfaz utilizar según 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 usará la dirección IP eth0 como fuente a menos que la aplicación sea lo suficientemente inteligente para declarar una interfaz de salida.

sysadmin1138
fuente
2
Esta fue mi suposición, pero todas mis pruebas indican que está usando 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 usa 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 desde la que recibió una conexión. Conectarse con él nc -s <ip of eth0:2>o lo que sea que siempre muestre que la dirección de origen es en realidad la ip de eth0: 0, aunque netcat lo hizo bind(2)antes connect(2). Por lo tanto, 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
4

Puede ver qué dispositivo y dirección IP src serán utilizados por 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 probado esto en un entorno con alias, pero espero que esto ayude.

tomoe
fuente
1

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

netstat -rn

Le dará el resultado de su tabla de enrutamiento; busque cualquier entrada específica que coincida con la IP del cliente al que está intentando conectarse. Si no existe ninguno, utilizará una ruta predeterminada (0.0.0.0, máscara 0.0.0.0). Si tiene varias rutas predeterminadas, la que tenga el costo más bajo será la utilizada.

Murali Suriar
fuente