it-swarm-pt.tech

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?

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.x.x por uma questão de exemplo, suponha que estes sejam editados por NAT para vários 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 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 com a 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

15
Joe Holloway

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" (conforme revelado por "lista de endereços IP dev eth0") é usado como o IP de origem para o tráfego existente 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 o "-s 192.168.100.1" é importante: impede 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

12
user14017

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 dev eth0 link do escopo do proto kernel src 192.168.222.178 169.254.0.0/16 dev eth0 link do escopo padrão via 192.168.222.1 dev eth0 src 192.168.222.178

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

5
Aleksandar Ivanisevic

Ele usa qualquer que seja o gateway padrão da 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.

5
Kyle Brandt

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.

4
sysadmin1138

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 alternativo, mas espero que isso ajude.

4
tomoe

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, aquela com o menor custo será a usada.

1
Murali Suriar