Ao fazer alias de IP, como o sistema operacional determina qual endereço IP será usado como fonte para as conexões TCP / IP de saída?

15

Eu tenho um servidor executando o Ubuntu Server com quatro endereços IP com alias em uma única 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 uma questão de exemplo, suponha que estes sejam NAT-ed para um intervalo de endereços IP públicos)

Como um de nossos clientes publica seu inventário via FTP, fazemos logon todas as noites para baixar um arquivo grande do servidor. O firewall deles espera que nossa conexão FTP (passiva) seja feita a partir de 192.168.1.100.

Como meu servidor possui quatro endereços IP em um único adaptador, como o sistema operacional determina qual endereço IP é usado como fonte para as conexões TCP / IP de saída?

Digamos que eu ssh no meu servidor em 192.168.1.101 e execute o FTP interativamente. A conexão TCP / IP de saída usará 192.168.1.101 porque o sistema operacional sabe que é a interface na qual meu shell está conectado?

E se a tarefa FTP for executada de maneira não interativa por meio de um trabalho cron em que não haja shell?

Como você provavelmente pode perceber, isso me deixa bastante confuso, então espero que minhas perguntas tenham pelo menos sentido.

Editar

Para esclarecer por que estou perguntando - eu não fiz nenhuma alteração na tabela de roteamento e ela realmente lista 'eth0' como o IFace para as rotas 0.0.0.0. No entanto, todas as indicações são de que ele está realmente usando eth0: 0 como fonte.

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

Posso mexer na tabela de roteamento ou fazer com que nosso cliente altere suas regras de firewall para obter o comportamento de que preciso, mas estou tentando obter uma pequena visão de como isso funciona para saber se há um bug no sistema operacional ou apenas meu entendimento ingênuo de como todas as peças se encaixam.

obrigado

Joe Holloway
fonte

Respostas:

12

Por padrão, no Linux, se uma interface tiver vários endereços em sub-redes diferentes, o tráfego destinado às respectivas sub-redes terá o IP de origem apropriado. Ou seja, se eth0 tiver dois endereços 192.168.1.1/24 e 10.1.1.1/8, o tráfego para qualquer coisa na sub-rede 10.0.0.0 terá a origem 10.1.1.1 e o tráfego para qualquer coisa na sub-rede 192.168.1.0 terá a origem 192.168.1.1. Você também pode atribuir endereços de origem explicitamente neste caso, usando a opção "src 1.2.3.4" para "ip route".

No entanto, no seu caso, todos os seus endereços estão na mesma sub-rede, portanto o "primário" (como revelado por "lista de endereços IP dev eth0") é usado como o IP de origem para o tráfego que sai nessa interface. Eu acho que é possível controlar os IPs de origem neste caso usando apenas "ip route", mas achei mais fácil usar o iptables para reescrever os endereços de origem para o tráfego de interesse.

Se você deseja forçar um endereço de origem específico a ser usado para destinos específicos, é possível fazê-lo com uma regra 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

Portanto, se o seu IP eth0 "primário" for 192.168.100.1, mas você desejar que o tráfego para 1.2.3.4 tenha uma fonte 192.168.100.2, faça o seguinte:

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

Observe que "-s 192.168.100.1" é importante: evita que os endereços de origem do tráfego encaminhado sejam reescritos por esta regra.

Se você estiver implementando configurações complexas de rede no Linux, leia a documentação do Linux Advanced Routing and Traffic Control, http://lartc.org

user14017
fonte
Na amostra, talvez substitua "-d 1.2.3.4/0" por "-d 1.2.3.4/332" ou "-d 1.2.3.4"
Christian
5

Vejo no seu exemplo que todos os ips estão muito próximos para não estar na mesma rede

você tem certeza de que está realmente com vários nomes e não está simplesmente tendo 4 aliases de IP?

se este for o caso, você poderá definir o IP de origem em uma rota com algo semelhante a este

/ sbin / ip route show 192.168.222.0/24 dev eth0 link do escopo do kernel proto src 192.168.222.178 169.254.0.0/16 dev eth0 link do escopo padrão via 192.168.222.1 dev eth0

A rota sudo / sbin / ip substitui o padrão via 192.168.222.1 src 192.168.222.178

/ sbin / ip route show
192.168.222.0/24 link de escopo do kernel proto eth0 do dev src 192.168.222.178 169.254.0.0/16 link de escopo do eth0 do dev dev0 padrão por 192.168.222.1 dev eth0 src 192.168.222.178

veja interfaces homem sobre como torná-lo persistente entre reinicializações

Aleksandar Ivanisevic
fonte
Você está certo. Talvez eu esteja abusando do termo multi-homing. Nosso data center nos fornece quatro endereços IP, todos na mesma sub-rede.
Joe Holloway
você sabe que pode editar sua pergunta, certo?
21279 hayalci
5

Ele usa qualquer que seja o gateway padrão na tabela de roteamento, a menos que haja uma rota específica solicitando que ele use outra: route -n

EDIT: Eu li sua pergunta muito rápido, parece ...

Como você está usando o modo passivo e o cliente sempre iniciará a conexão, acho que o campo src ip no cabeçalho IP sempre aparecerá como o IP ao qual o cliente está conectado. Se estivesse no modo ativo, o servidor estava iniciando a conexão, acho que sempre seria o IP 'Primário'. Se seus endereços estiverem na mesma sub-rede, o Linux tornará o primeiro endereço que você adicionou 'Primário' e os outros secundários.

No entanto, não tenho certeza, eu executaria o tcpdump -n e veria o que ele vê como o IP src.

EDIT2: Ok, escrevi o texto acima do ponto de vista de que você estava executando o servidor, portanto, como você é o cliente e inicia a conexão, acho que sempre parecerá vir do endereço IP principal, mas tente novamente e veja com tcpdump.

Kyle Brandt
fonte
A tabela de roteamento é apenas o padrão e há apenas uma sub-rede. Outro cartaz indicava que eu usei mal o termo multihoming. No entanto, eu ainda esperava que ele estivesse usando o alias eth0. Eu usei o wget para baixar o whatsmyip.net e isso me mostra que, de alguma forma, estou usando o eth0: 0.
Joe Holloway
Isso não faz muito sentido para mim, whatsmyip.net deve mostrar o seu ip público ...
Kyle Brandt
Para ser mais claro, ele mostra o endereço IP público que é editado por NAT para o IP privado associado ao eth0: 0, enquanto eu esperaria que ele mostrasse o endereço IP público editado para NAT para o IP privado associado ao eth0
Joe Holloway
1
Esta resposta aqui é muito votada e contém muitas edições e confunde muitas coisas e não ajuda. As respostas de tbman e jknapka são excelentes e me ajudaram muito.
Christian
4

A menos que seu trabalho de FTP tenha uma maneira de especificar a interface a ser usada para conexões, acredito que o padrão é a primeira interface física na sub-rede relevante (neste caso, eth0). Se você tivesse um servidor com duas NICs em sub-redes diferentes, ele descobriria qual interface usar com base na tabela de roteamento.

Como existe apenas uma única interface física no sistema (eth0) e quatro virtuais / aliases (eth0: 0 a eth0: 2) na mesma sub-rede, o tráfego de saída usará o endereço IP eth0 como fonte, a menos que o aplicativo seja inteligente o suficiente declarar uma interface de saída.

sysadmin1138
fonte
2
Essa foi minha suposição, mas todos os meus testes indicam que ele está usando eth0: 0 como fonte.
Joe Holloway
Talvez a rota padrão esteja configurada para usar a interface eth0: 0. Eu tenho uma instalação que usa uma ponte Ethernet e foi configurada para usar a interface da ponte virtual para a rota padrão.
sysadmin1138
Eu configurei um programa trivial em outra máquina para imprimir o IP do qual ele recebeu uma conexão. Conectar-se a ele com nc -s <ip of eth0:2>ou o que sempre mostra o endereço de origem é realmente o ip de eth0: 0, mesmo que o netcat tenha feito isso bind(2)antes connect(2). Portanto, parece que os aliases não funcionam para dar a uma máquina a capacidade de fazer conexões a partir de vários endereços de origem.
Peter Cordes
4

Você pode ver qual dispositivo e endereço ip src serão usados ​​pelo comando ip route get como abaixo:

$ /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

Eu não tentei isso em ambiente com alias, mas espero que isso ajude.

tomoe
fonte
1

Ao estabelecer uma conexão de saída, seu servidor examinará sua tabela de roteamento para determinar qual de suas quatro interfaces usar; suas conexões TCP terão um IP de origem da sua interface de saída.

netstat -rn

Fornecerá a saída da sua tabela de roteamento; procure por entradas específicas correspondentes ao IP do cliente ao qual você está tentando se conectar. Se não existir, você estará usando uma rota padrão (0.0.0.0, mascara 0.0.0.0). Se você tiver várias rotas padrão, a que tiver o menor custo será a usada.

Murali Suriar
fonte