Aliasing IP in che modo il sistema operativo determina quale indirizzo IP verrà utilizzato come origine per le connessioni TCP / IP in uscita?


15

Ho un server che esegue Ubuntu Server con quattro indirizzi IP alias su una singola scheda 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 per esempio, supponiamo che questi siano NAT ed ed a un intervallo di indirizzi IP pubblici)

Uno dei nostri clienti pubblica il loro inventario tramite FTP, quindi effettuiamo l'accesso ogni sera per scaricare un file di grandi dimensioni dal loro server. Il loro firewall prevede che la nostra connessione FTP (passiva) verrà stabilita a partire dal 192.168.1.100.

Dato che il mio server ha logicamente quattro indirizzi IP su un singolo adattatore, in che modo il sistema operativo determina quale indirizzo IP viene utilizzato come origine per le connessioni TCP / IP in uscita?

Diciamo che ho ssh nel mio server su 192.168.1.101 ed eseguo FTP in modo interattivo. La connessione TCP / IP in uscita utilizzerà 192.168.1.101 perché il sistema operativo sa che è l'interfaccia su cui è connessa la mia shell?

Cosa succede se l'attività FTP viene eseguita in modo non interattivo tramite un processo cron in cui non è presente una shell?

Come probabilmente puoi dire, questo mi ha confuso, quindi spero che le mie domande abbiano almeno un senso.

modificare

Per chiarire il motivo per cui lo sto chiedendo: non ho apportato modifiche alla tabella di routing e in realtà elenca 'eth0' come IFace per le route 0.0.0.0. Tuttavia, tutte le indicazioni indicano che sta effettivamente utilizzando eth0: 0 come sorgente.

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 giocherellare con la tabella di routing o fare in modo che il nostro client cambi le regole del firewall per ottenere il comportamento di cui ho bisogno, ma sto cercando di ottenere un po 'di comprensione su come funziona per sapere se c'è un bug nel sistema operativo o solo la mia comprensione ingenua di come tutti i pezzi si incastrano.

Grazie

Risposte:


12

Per impostazione predefinita, su Linux, se un'interfaccia ha più indirizzi che si trovano su sottoreti diverse, il traffico destinato alle rispettive sottoreti avrà l'IP di origine corretto. Cioè, se eth0 ha due indirizzi 192.168.1.1/24 e 10.1.1.1/8, il traffico verso qualsiasi cosa nella sottorete 10.0.0.0 avrà la fonte 10.1.1.1 e il traffico verso qualsiasi cosa nella sottorete 192.168.1.0 avrà la fonte 192.168.1.1. In questo caso puoi anche assegnare esplicitamente gli indirizzi sorgente usando l'opzione "src 1.2.3.4" su "ip route".

Nel tuo caso, tuttavia, tutti i tuoi indirizzi si trovano sulla stessa sottorete, quindi quello "primario" (come rivelato da "ip addr list dev eth0") viene utilizzato come IP di origine per il traffico in uscita su quell'interfaccia. Penso che sia possibile controllare gli IP di origine in questo caso semplicemente usando "ip route", ma ho trovato più facile usare iptables per riscrivere gli indirizzi di origine per il traffico di interesse.

Se si desidera forzare l'utilizzo di un indirizzo di origine specifico per destinazioni specifiche, è possibile farlo con una regola 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

Quindi, se il tuo IP "primario" eth0 è 192.168.100.1, ma desideri che il traffico verso 1.2.3.4 abbia una fonte di 192.168.100.2, procedi nel seguente modo:

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

Si noti che "-s 192.168.100.1" è importante: impedisce che gli indirizzi di origine del traffico inoltrato vengano riscritti da questa regola.

Se hai intenzione di implementare complesse configurazioni di rete su Linux, dovresti leggere la documentazione di Linux Advanced Routing and Traffic Control, http://lartc.org


Nell'esempio, forse sostituire "-d 1.2.3.4/0" con "-d 1.2.3.4/332" o "-d 1.2.3.4"
Christian

5

Vedo nel tuo esempio che tutti gli ips sono troppo vicini per non essere nella stessa rete

sei sicuro di essere in realtà multihoming e non hai semplicemente 4 alias IP?

in quest'ultimo caso, è possibile impostare l'ip sorgente su una route con qualcosa di simile a questo

/ 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 tramite 192.168.222.1 dev eth0

La route sudo / sbin / ip sostituisce il valore predefinito tramite 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 default tramite 192.168.222.1 dev eth0 src 192.168.222.178

vedere le interfacce man su come renderlo persistente tra i riavvii


Hai ragione. Forse sto abusando del termine multi-homing. Il nostro data center ci fornisce quattro indirizzi IP tutti sulla stessa sottorete.
Joe Holloway,

sai che puoi modificare la tua domanda, giusto?
hayalci,

5

Utilizza qualunque sia il gateway predefinito nella tabella di routing, a meno che non ci sia un percorso specifico che gli dice di usarne un altro: route -n

EDIT: ho letto la tua domanda troppo in fretta sembra ...

Dal momento che stai utilizzando la modalità passiva e il client avvierà sempre la connessione, penso che il campo src ip nell'intestazione IP apparirà sempre come qualunque IP a cui il client si è connesso. Se fosse attiva la modalità in cui il server stava avviando la connessione, penso che sarebbe sempre l'IP "primario". Se i tuoi indirizzi si trovano nella stessa sottorete, Linux renderà il primo indirizzo che hai aggiunto "Primario" e gli altri secondari.

Non ne sono del tutto sicuro, eseguirò tcpdump -n e vedrò quello che vede come IP src.

EDIT2: Ok, ho scritto quanto sopra dal punto di vista del fatto che stavi eseguendo il server, quindi dato che sei il client e avvii la connessione, penso che sembrerà sempre provenire dall'indirizzo IP primario, ma di nuovo, provalo e vedi con tcpdump.


La tabella di routing è solo quella predefinita e c'è solo una sottorete. Un altro poster indicava che avevo abusato del termine multihoming. Tuttavia, mi aspetto ancora che utilizzi l'alias eth0. Ho usato wget per scaricare whatsmyip.net e mi mostra che sto usando in qualche modo invece eth0: 0.
Joe Holloway,

Per me non ha molto senso, whatsmyip.net dovrebbe mostrare il tuo IP pubblico ...
Kyle Brandt,

Per essere più chiari, mostra l'indirizzo IP pubblico associato a NAT all'IP privato associato a eth0: 0, mentre mi aspetto che mostri l'indirizzo IP pubblico associato a NAT all'IP privato associato a eth0
Joe Holloway,

1
Questa risposta qui è troppo votata e contiene molte modifiche e confonde molte cose e non aiuta. Le risposte di tbman e jknapka sono eccellenti e mi hanno aiutato moltissimo.
Christian,

4

A meno che il lavoro FTP non abbia un modo per specificare l'interfaccia da utilizzare per le connessioni, credo che sia impostato automaticamente sulla prima interfaccia fisica sulla sottorete pertinente (eth0 in questo caso). Se avessi un server con due schede NIC su sottoreti diverse, capirebbe quale interfaccia usare in base alla tabella di routing.

Poiché esiste un'unica interfaccia fisica sul sistema (eth0) e quattro virtual / alias (da eth0: 0 a eth0: 2) sulla stessa sottorete, il traffico in uscita utilizzerà l'indirizzo IP eth0 come origine, a meno che l'applicazione non sia abbastanza intelligente per dichiarare un'interfaccia in uscita.


2
Questo era il mio presupposto, ma tutti i miei test indicano che sta usando eth0: 0 come sorgente.
Joe Holloway,

Quindi forse la route predefinita è configurata per utilizzare l'interfaccia eth0: 0. Ho un'installazione che utilizza un bridge ethernet ed è stata configurata per utilizzare l'interfaccia del ponte virtuale per il percorso predefinito.
sysadmin1138

Ho impostato un programma banale su un'altra macchina per stampare l'IP da cui ha ricevuto una connessione. Connettersi ad esso nc -s <ip of eth0:2>o qualunque cosa mostri sempre l'indirizzo sorgente è in realtà l'ip di eth0: 0, anche se netcat ha fatto bind(2)prima connect(2). Quindi sembra che gli alias non funzionino per dare a una macchina la possibilità di effettuare connessioni da più indirizzi di origine.
Peter Cordes,

4

Potresti vedere quale dispositivo e indirizzo IP src verranno utilizzati dal comando get ip route come di seguito:

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

Non l'ho provato in un ambiente con alias, ma spero che questo aiuti.


1

Quando si stabilisce una connessione in uscita, il server cercherà nella sua tabella di routing per determinare quale delle quattro interfacce utilizzare; le tue connessioni TCP avranno un IP sorgente della tua interfaccia di uscita.

netstat -rn

Ti darà l'output della tua tabella di routing; cercare eventuali voci specifiche corrispondenti all'IP client a cui si sta tentando di connettersi. Se non ne esiste alcuna, verrà utilizzata una route predefinita (0.0.0.0, maschera 0.0.0.0). Se disponi di più percorsi predefiniti, quello con il costo più basso sarà quello utilizzato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.