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
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
veja interfaces homem sobre como torná-lo persistente entre reinicializações
fonte
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.
fonte
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.
fonte
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 issobind(2)
antesconnect(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.Você pode ver qual dispositivo e endereço ip src serão usados pelo comando ip route get como abaixo:
Eu não tentei isso em ambiente com alias, mas espero que isso ajude.
fonte
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.
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.
fonte