Jak mogę używać Linuksa jako bramy?

16

UWAGA: Jeśli urządzenia klienckie ( computer Bw tym przykładzie) chcą uzyskać dostęp do Internetu za pośrednictwem komputera bramy, być może nadal muszą skonfigurować rozdzielczość serwera nazw. Nie zostało to tutaj wyjaśnione (brama niekoniecznie obsługuje Internet).

Próbuję zrozumieć podstawy routingu sieci.
Więc eksperymentuję z moją siecią LAN (na razie nie potrzebuję internetu, tylko komunikacja w sieci LAN).

Wiem, że konfiguracja sieci jest sprawą dość złożoną, ale staram się tylko, aby komputer (powiedzmy A) działał jako brama dla innego (powiedzmy B) (oba z systemem Ubuntu Linux).
Potrzebuję tylko B, aby móc połączyć się z routerem, który jest dostępny tylko dla A.

Tak jest w przypadku:

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

Komputer A dobrze łączy się z routerem .
Komputer A i B łączą się dobrze (ping, SSH ... itd.) Między nimi .
Komputer B nie może połączyć się z routerem dla komputera A.

Myślałem, że samo dodanie na komputerze A B jako domyślnej bramy i aktywacja przekazywania IP na A sprawiłoby, że B mógłby uzyskać dostęp do routera dla 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

I na komputerze A (brama pośrednia):

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

Komputer B nadal może pingować komputer A, ale router dla A nie odpowiada:

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

(Brak odpowiedzi ping)

Czy jest to poprawna procedura, aby komputer z systemem Linux działał jako brama dla innego komputera w prosty sposób?

Sopalajo de Arrierez
źródło

Odpowiedzi:

21

Jesteś prawie na miejscu, musisz tylko upewnić się, że ruch wraca do B. W tej chwili przekierowałeś ruch z B do świata zewnętrznego, ale A nie wie, jak odzyskać ruch z powrotem do B. Potrzebujesz A, aby zachować pewien stan przechodzące przez nią połączenia. Aby to zrobić, będziesz chciał włączyć NAT . Masz już krok pierwszy, który umożliwia przekazywanie. Następnie musisz dodać kilka reguł zapory, używając iptables:

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

Mówi to: w tabeli translacji adresów sieciowych, po ustaleniu trasowania pakietu na wyjściu eth0 (zewnętrznym), zamień informacje o adresie zwrotnym na własne, aby pakiety zwrotne przyszły do ​​nas. Pamiętaj też, że to zrobiliśmy (jak tabela odnośników, która pamięta to połączenie).

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

Zezwól pakietom, które chcą pochodzić z eth1 (interfejs wewnętrzny), na wyjście eth0 (interfejs zewnętrzny).

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

Skorzystaj z tabeli wyszukiwania, którą mieliśmy wcześniej, aby sprawdzić, czy pakiet przychodzący do zewnętrznego interfejsu rzeczywiście należy do połączenia, które zostało już zainicjowane z wewnętrznego.

użytkownik1794469
źródło
Rzeczywiście, zwięzłe wyjaśnienie. Czy wszystkie bloki kodu muszą być wykonane na komputerze A?
Sopalajo de Arrierez
@SopalajodeArrierez Tak. Wszystkie są wykonywane na komputerze „bramy”. System B nie musi wiedzieć nic o routingu poza tym, że chce dotrzeć do innej maszyny, wysyła pakiety do B (to domyślny GW).
user1794469,
Przetestowano działanie Ubuntu v14 na komputerze i Ubuntu v12 na Utilite Pro (embedded emulator z CompuLabs). Dziękujemy bardzo za rozwinięcie tego, co dokładnie robi każda linia. Zbadałem i znalazłem wiele długich i długich wyjaśnień, które nie działały. Mam nadzieję, że ten wątek z pytaniami i odpowiedziami może być przydatny dla innych w przyszłości.
Sopalajo de Arrierez
@ user1794469 czy to samo, gdy interfejs bramy jest wirtualny, tzn. interfejs tap? można przyjrzeć się tutaj ?
ram
1

Aby routing działał poprawnie między dwoma komputerami z systemem Linux działającymi jako bramy, należy wprowadzić kilka rzeczy:

  • Obie bramy muszą mieć fizyczne łącze do siebie (lub wirtualne, jeśli łączysz maszyny wirtualne).
  • Trasy należy dodać do obu interfejsów routera.

    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
    
  • Brama lokalna musi być określona dla sieci zdalnej na obu bramach. Dzięki temu komputery w sieci lokalnej mogą wiedzieć, gdzie wysłać pakiety do sieci zdalnej. Brama powinna być adresem IP komputera, który wyśle ​​pakiety do zdalnej sieci.

  • Komputery, które chcą wysyłać ruch między sieciami, muszą również zostać poinformowane o tym, która brama lokalna obsługuje ruch do i ze zdalnej sieci. Zwykle odbywa się to za pomocą protokołu Dynamic Host Control Protocol (DHCP), jednak jeśli zamierzasz używać oddzielnej bramy do Internetu, musisz określić zarówno na komputerach wymagających dostępu do Internetu, jak i drugiej sieci (np. Brama internetowa za pośrednictwem DHCP i brama drugiej sieci przez trasę).
  • Przekazywanie IP musi być aktywne dla obu bram.
  • Maskowanie IP musi być włączone, aby NAT mógł działać między bramami.

    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
    

    Może być konieczne określenie źródła i celu, ponieważ używasz tego samego interfejsu do maskarady:

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

    a druga brama:

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

    Dla każdej bramy ruch sieci lokalnej powinien być akceptowany na odpowiednim interfejsie, takim jak ten:

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

    lub

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

Istnieje wiele linków i podobnych pytań, które można znaleźć w celu rozwiązania problemów, które masz.

Wydaje się, że w tym konkretnym przypadku niewłaściwe jest to, że konfiguracja trasy i bramy nie została ukończona na obu komputerach, a translacja adresów sieciowych (NAT) nie została włączona za pomocą iptables, dzięki czemu bramy mogą przenosić żądanie z komputera w drugiej podsieci w ich imieniu.

Jest to również ważne przy konfigurowaniu połączenia internetowego, ponieważ jesteś odpowiedzialny za jeden koniec połączenia (np. Używanie komputera z systemem Linux jako bramy do połączenia PPPoE).

John Pettit
źródło