Come posso usare Linux come gateway?


16

NOTA: se i dispositivi client ( computer Bin questo esempio) desiderano ottenere Internet tramite il computer gateway, forse devono comunque configurare la risoluzione del nameserver. Questo non è spiegato qui (un gateway non serve necessariamente a Internet).

Sto cercando di comprendere i fondamenti del routing delle reti.
Quindi sto sperimentando con la mia LAN (non ho bisogno di internet per ora, solo comunicazioni LAN).

So che le questioni relative alla configurazione della rete sono piuttosto complesse, ma sto solo cercando di creare un computer (diciamo A) che funga da gateway per un altro (diciamo B) (entrambi con Ubuntu Linux).
Ho solo bisogno di B per essere in grado di raggiungere il router, che è raggiungibile solo per A.

Questo è il caso:

Router for computer A  -->  192.168.0.1
Computer A - eth0      -->  192.168.0.2
Computer A - eth1      -->  192.168.1.1

Computer B - eth0      -->  192.168.1.2

Il computer A si collega correttamente al router .
I computer A e B si collegano correttamente (ping, SSH ... ecc.) Tra loro .
Il computer B non può raggiungere il router per il computer A.

Pensavo che l'aggiunta di B Computer A come gateway predefinito e l'attivazione di IP Forwarding su A avrebbero consentito a B di raggiungere il router per A:

luis@ComputerB:~$ sudo route add default gw 192.168.1.1
luis@ComputerB:~$ sudo routel

target            gateway      source        proto    scope  dev   tbl
127.0.0.0         broadcast    127.0.0.1     kernel   link   lo    local
127.0.0.0 8       local        127.0.0.1     kernel   host   lo    local
127.0.0.1         local        127.0.0.1     kernel   host   lo    local
127.255.255.255   broadcast    127.0.0.1     kernel   link   lo    local
192.168.1.0       broadcast    192.168.1.2   kernel   link   eth0  local
192.168.1.2       local        192.168.1.2   kernel   host   eth0  local
192.168.1.255     broadcast    192.168.1.2   kernel   link   eth0  local
default           192.168.1.1                                eth0
169.254.0.0 16                                        link   eth0
192.168.1.0 24                 192.168.1.2   kernel   link   eth0

E sul computer A (il gateway intermedio):

root@ComputerA:~$ echo 1 > /proc/sys/net/ipv4/ip_forward

Il computer B può ancora eseguire il ping del computer A, ma il router per A non risponde:

luis@ComputerB:~$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
^C

(Nessuna risposta al ping)

È questa la procedura corretta per fare in modo che un computer con Linux funzioni come gateway per un altro computer in modo semplice?

Risposte:


21

Sei quasi lì, devi solo assicurarti che il traffico torni a B. In questo momento hai inoltrato il traffico da B al mondo esterno ma A non sa come riportare il traffico a B. Devi avere A per mantenere un po 'di stato le connessioni che lo attraversano. Per fare ciò, vorrai abilitare NAT . Hai già uno step che è consentire l'inoltro. Quindi è necessario aggiungere alcune regole del firewall utilizzando iptables:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Questo dice: nella tabella di traduzione degli indirizzi di rete, dopo che abbiamo capito il routing di un pacchetto sull'output eth0 (l'esterno), sostituisci le informazioni dell'indirizzo di ritorno con le nostre in modo che i pacchetti di ritorno arrivino a noi. Inoltre, ricorda che l'abbiamo fatto (come una tabella di ricerca che ricorda questa connessione).

iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Consentire ai pacchetti che vogliono provenire da eth1 (l'interfaccia interna) di uscire eth0 (l'interfaccia esterna).

iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

Usa quella tabella di ricerca che avevamo da prima per vedere se il pacchetto che arriva sull'interfaccia esterna appartiene effettivamente a una connessione che era già stata avviata dall'interno.


Una spiegazione concisa, davvero. Tutti i blocchi di codice devono essere eseguiti sul computer A?
Sopalajo de Arrierez,

@SopalajodeArrierez Sì, questi sono tutti eseguiti sul computer "gateway". Il sistema B non ha bisogno di sapere nulla sul routing se non per raggiungere qualsiasi altra macchina, invia i pacchetti a B (è GW predefinito).
user1794469

Testato su Ubuntu v14 su desktop e Ubuntu v12 su Utilite Pro (un dispositivo incorporato di CompuLabs). Grazie mille per l'espansione di ciò che fa esattamente ogni riga. Ho studiato e trovato molte spiegazioni lunghissime che non funzionavano. Spero che questo thread di domande e risposte possa essere utile per gli altri in futuro.
Sopalajo de Arrierez,

@ user1794469 è lo stesso quando l'interfaccia gateway è virtuale, cioè un'interfaccia tap? puoi dare un'occhiata qui ?
ram

1

Affinché il routing funzioni correttamente tra due computer Linux che fungono da gateway, ci sono diverse cose che devono essere presenti:

  • Entrambi i gateway devono avere un collegamento fisico tra loro (o virtuale se si collegano macchine virtuali).
  • Le route devono essere aggiunte a entrambe le interfacce sul router.

    route add -net 192.168.0.0/24 gw 192.168.0.1
    route add -net 192.168.1.0/24 gw 192.168.1.1
    
  • È necessario specificare un gateway locale per la rete remota su entrambi i gateway. Ciò consente ai computer della rete locale di sapere dove inviare i pacchetti per la rete remota. Il gateway dovrebbe essere l'indirizzo IP del computer che invierà i pacchetti alla rete remota.

  • Anche i computer che desiderano inviare traffico tra le reti devono essere informati di quale gateway locale gestisce il traffico da e verso la rete remota. Questo di solito viene eseguito tramite il protocollo DHCP (Dynamic Host Control Protocol), tuttavia se si intende utilizzare un gateway separato per Internet, è necessario specificare entrambi i computer che richiedono l'accesso a Internet e all'altra rete (ad esempio il gateway Internet tramite DHCP e il gateway dell'altra rete tramite una route).
  • L'inoltro IP deve essere attivo per entrambi i gateway.
  • L'IP Masquerading deve essere abilitato per consentire al NAT di funzionare tra i gateway.

    modprobe iptable_nat
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -i eth1 -j ACCEPT
    

    Potrebbe essere necessario specificare una fonte e una destinazione poiché si utilizza la stessa interfaccia per il mascheramento:

    iptables -t nat -A POSTROUTING -i eth0 -s 192.168.0.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
    

    e l'altro gateway:

    iptables -t nat -A POSTROUTING -i eth1 -s 192.168.1.0/24 ! -d 192.168.0.0/24 -j MASQUERADE   
    

    Per ciascun gateway, il traffico di rete locale deve essere accettato sull'interfaccia appropriata in questo modo:

    iptables -A FORWARD -i eth0 -s 192.168.0.0/24 -j ACCEPT
    

    o

    iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT
    

Esistono numerosi collegamenti e domande simili a cui è possibile fare riferimento per risolvere i problemi riscontrati.

Ciò che sembra essere sbagliato in questo caso particolare è che l'installazione di route e gateway non è completa su entrambi i computer e Network Address Translation (NAT) non è stato abilitato utilizzando iptables, consentendo ai gateway di trasportare la richiesta da un computer sull'altra sottorete per loro conto.

Ciò è fondamentale anche quando si configura una connessione Internet in quanto l'utente è responsabile di un'estremità della connessione (ad es. L'utilizzo di un computer Linux come gateway per una connessione PPPoE).

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.