Due interfacce di rete e due indirizzi IP sulla stessa sottorete in Linux


22

Di recente mi sono imbattuto in una situazione in cui avevo bisogno di due indirizzi IP sulla stessa sottorete assegnati a un host Linux in modo da poter eseguire due siti SSL / TLS. Il mio primo approccio è stato quello di utilizzare l'aliasing IP, ad esempio utilizzando eth0: 0, eth0: 1, ecc., Ma i nostri amministratori di rete hanno alcune impostazioni abbastanza rigide per la sicurezza che hanno schiacciato questa idea:

  1. Usano lo snooping DHCP e normalmente non consentono indirizzi IP statici. L'indirizzamento statico viene realizzato utilizzando voci DHCP statiche, quindi lo stesso indirizzo MAC ottiene sempre la stessa assegnazione IP. Questa funzione può essere disabilitata per switchport se lo chiedi e ne hai una ragione (per fortuna ho un buon rapporto con i ragazzi della rete e questo non è difficile da fare).
  2. Con lo snooping DHCP disabilitato sullo switchport, hanno dovuto inserire una regola nello switch secondo cui l'indirizzo MAC X può avere l'indirizzo IP Y. Sfortunatamente questo ha avuto l'effetto collaterale di dire che l'indirizzo MAC X può SOLO avere Indirizzo IP Y. L'aliasing IP richiedeva che l'indirizzo MAC X ricevesse due indirizzi IP, quindi non funzionava.

Potrebbe esserci stato un modo per aggirare questi problemi sulla configurazione dello switch, ma nel tentativo di preservare buone relazioni con gli amministratori di rete ho cercato di trovare un altro modo. Avere due interfacce di rete sembrava il passo logico successivo. Per fortuna questo sistema Linux è una macchina virtuale, quindi sono stato in grado di aggiungere facilmente una seconda interfaccia di rete (senza riavviare, potrei aggiungere - piuttosto interessante). Alcuni tasti dopo ho avuto due interfacce di rete attive e funzionanti ed entrambe hanno estratto gli indirizzi IP dal DHCP.

Ma poi è arrivato il problema: gli amministratori di rete potevano vedere (sullo switch) la voce ARP per entrambe le interfacce, ma solo la prima interfaccia di rete che avevo richiamato rispondeva ai ping o a qualsiasi tipo di traffico TCP o UDP.

Dopo molte ricerche e ricerche, ecco cosa mi è venuto in mente. Sembra funzionare, ma sembra anche lavorare molto per qualcosa che sembra dovrebbe essere semplice. Qualche idea alternativa là fuori?


Passaggio 1: abilitare il filtro ARP su tutte le interfacce:

# sysctl -w net.ipv4.conf.all.arp_filter=1
# echo "net.ipv4.conf.all.arp_filter = 1" >> /etc/sysctl.conf

Dal file networking / ip-sysctl.txt nei documenti del kernel Linux:

arp_filter - BOOLEAN
    1 - Allows you to have multiple network interfaces on the same
    subnet, and have the ARPs for each interface be answered
    based on whether or not the kernel would route a packet from
    the ARP'd IP out that interface (therefore you must use source
    based routing for this to work). In other words it allows control
    of which cards (usually 1) will respond to an arp request.

    0 - (default) The kernel can respond to arp requests with addresses
    from other interfaces. This may seem wrong but it usually makes
    sense, because it increases the chance of successful communication.
    IP addresses are owned by the complete host on Linux, not by
    particular interfaces. Only for more complex setups like load-
    balancing, does this behaviour cause problems.

    arp_filter for the interface will be enabled if at least one of
    conf/{all,interface}/arp_filter is set to TRUE,
    it will be disabled otherwise

Passaggio 2: implementare il routing basato sull'origine

Fondamentalmente ho appena seguito le indicazioni da http://lartc.org/howto/lartc.rpdb.multiple-links.html , anche se quella pagina è stata scritta con un obiettivo diverso in mente (trattare con due ISP).

Supponiamo che la sottorete sia 10.0.0.0/24, il gateway sia 10.0.0.1, l'indirizzo IP per eth0 sia 10.0.0.100 e l'indirizzo IP per eth1 sia 10.0.0.101.

Definire due nuove tabelle di routing denominate eth0 ed eth1 in / etc / iproute2 / rt_tables:

... top of file omitted ...
1    eth0
2    eth1

Definire i percorsi per queste due tabelle:

# ip route add default via 10.0.0.1 table eth0
# ip route add default via 10.0.0.1 table eth1
# ip route add 10.0.0.0/24 dev eth0 src 10.0.0.100 table eth0
# ip route add 10.0.0.0/24 dev eth1 src 10.0.0.101 table eth1

Definire le regole per quando utilizzare le nuove tabelle di routing:

# ip rule add from 10.0.0.100 table eth0
# ip rule add from 10.0.0.101 table eth1

La tabella di routing principale è già stata curata da DHCP (e non è nemmeno chiaro che sia strettamente necessario in questo caso), ma sostanzialmente equivale a questo:

# ip route add default via 10.0.0.1 dev eth0
# ip route add 130.127.48.0/23 dev eth0 src 10.0.0.100
# ip route add 130.127.48.0/23 dev eth1 src 10.0.0.101

E voilà! Tutto sembra funzionare bene. L'invio di ping ad entrambi gli indirizzi IP funziona correttamente. L'invio di ping da questo sistema ad altri sistemi e forzando il ping a utilizzare un'interfaccia specifica funziona correttamente ( ping -I eth0 10.0.0.1, ping -I eth1 10.0.0.1). E, soprattutto, tutto il traffico TCP e UDP verso / da entrambi gli indirizzi IP funziona come previsto.


Quindi, ancora una volta, la mia domanda è: c'è un modo migliore per farlo? Sembra molto lavoro per un problema apparentemente semplice.


Aggiornamento: la soluzione sopra è risultata incompleta. Le cose funzionavano bene se il traffico rimaneva sulla stessa sottorete, ma le comunicazioni con altre sottoreti che utilizzavano la seconda interfaccia non funzionavano correttamente. Invece di scavare una buca più grande, ho finito per parlare con gli amministratori di rete e ho ottenuto loro di consentire più indirizzi IP per un'unica interfaccia e ho usato l'aliasing IP (ad esempio eth0 ed eth0: 0).


La distinzione chiave da ricordare è che l'IP non appartiene all'interfaccia, appartiene alla macchina. Quindi è corretto inviare entrambe le interfacce per entrambi gli IP in questa configurazione, quindi perché richiede qualche trucco per non farlo.
MikeyB,

Credo che il routing dei sorgenti non sia necessario in questo caso perché il filtro arp dovrebbe applicarsi solo quando lo switch sta inviando a un'interfaccia / deve trovarlo tra le sue porte. Potrei sbagliarmi, ma quando la macchina invia i dati verso lo switch, l'IP nel campo sorgente (intestazione IP) non viene controllato, ma solo l'arp invia il pacchetto.
AndreasM,

MikeyB è corretto, il routing di origine è l'unico modo. La macchina può scegliere qualsiasi interfaccia in uscita che desidera inviare traffico, purché si trovi sulla stessa sottorete. Non importa se l'IP non si trova realmente su quell'interfaccia o meno.
Patrick,

2
AndreasM: I pacchetti in arrivo non sono il problema, sono i pacchetti in uscita che sono il problema. Senza il routing di origine, tutti i pacchetti in uscita utilizzeranno la route predefinita, che è associata a un'interfaccia o all'altra. Anche se i pacchetti in uscita avranno l'indirizzo IP di origine corretto, i filtri sullo switch non consentiranno loro di uscire poiché tale indirizzo IP non appartiene all'indirizzo MAC dell'interfaccia. Allo switch sembra proprio che un client stia cercando di falsificare l'IP di un altro client. (Questi sono switch di livello 3 intelligenti).
Scott Duckworth,

Gli alias IP sono obsoleti e un hack, non riflette la realtà, per non parlare del fatto che l'eliminazione del primario eliminerà tutti gli alias. Utilizzare ipda iproute2per aggiungere più di un indirizzo alla stessa interfaccia.
Pilona,

Risposte:


8

Sì, il modo migliore è creare un business case adeguato e farli rilassare le regole sugli switch in modo da poter avere più IP su una NIC.

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.