Linux jako ruter
Naszym celem będzie skonfigurowanie systemu linux jako urządzenia przesyłającego pakiety. W tym celu będziemy potrzebowali:
- uruchomić infrastrukturę (w naszym przypadku wirtualną)
- skonfigurować interfejsy oraz tablicę rutingu
- ustawić opcję przekazywania pakietów
- opcjonalnie dodać translację adresów
1. Infastruktura
Potrzebujemy uruchomić co najmniej dwie maszyny wirtualne:
- RT1 – działająca jako brama domyślna
- SRV1 – klient w lokalnej sieci, który będzie korzystał z bramy domyślnej.
Naszą infrastrukturę skonfigurujemy zgodnie z poniższym obrazkiem:
Dla naszego przykładu wykorzystamy VMWare Workstatione (dawny VMWare Player).
Uwaga:
- powyższy obrazek zawiera również pokazane w jaki sposób wykonana zostanie translacja adresów dla 3 stopniowego nawiązywania połączenia (np. przy wysłaniu żądania HTTP GET).
1.1. Uruchomienie maszyn:
Pierwszy wariant to instalacja z gotowych obrazów.
W celu uruchomienia maszyny można skorzystać z gotowego obrazu systemu dostępnego w moim Contact.dir (podkatalog Kalkowski Maciej). Plik ten można skopiować dwukrotnie do lokalnego katalogu (w przypadku studentów WMI – dysk P:). W tym przypadku dla bezpieczeństwa należy usunąć wszystkie interfejsy sieciowe – Network Adapters (VMware VWorkstation -> Virtual Machine Setting -> Hardware), a następnie dla:
- RT1: dodać dwa nowe interfejsy – jeden typu NAT, drugi typu Host-only, po czym zmienić jego ustawienia na CUSTOM i zgodnie z propozycją z obrazka wirtualny przełącznik sieciowy VMNet5,
- SRV1 zmienić interfejs z typu NAT na Custom i wybrać przełącznik VMNet5.
Alternatywnie, zamiast uruchomić VMWare Workstation z gotowych skopiowanych obrazów można zainstalować systemy od nowa.
Możliwe jest też przejście instalacji dwóch serwerów od początku. W tym przypadku interfes sieciowy typu NAT do obu serwerów zostanie dodany automatycznie. W tym przypadku w RT1 należy dodać interfejs typu Host-only, po czym zmienić jego ustawienia na CUSTOM i zgodnie z propozycją z obrazka wirtualny przełącznik sieciowy VMNet5. Dla SRV1 należy zmienić interfejs z typu NAT na Custom i wybrać przełącznik VMNet5.
Po tym kroku powinniśmy mieć poprawnie skonfigurowane środowisko wirtualne.
Uwaga:
- W dalszej części ćwiczenia korzystamy z tego, że pierwszy interfejs sieciowy wykrywany w systemie RT1 eth0 jest typu NAT. Jednym z najczęstszych błędów jest odwrotne przypisanie interfejsów – tj. NAT do eth1 i VMNet5 do eth0. W tym przypadku należy zweryfikować który MAC adres jest przypisany do karty sieciowej. W celu weryfikacji czy nasza konfiguracja jest poprawna możemy sprawdzić jaki jest MAC adres karty sieciowej w VMware Workstation -> Virtual Machine Setting -> Hardware klikając na wybraną kartę sieciową (np. typu NAT) i przycisk Advanced. Następnie w systemie wykonujemy polecenie ip a i weryfikujemy czy adres karty sieciowej eth0 jest taki sam jak karty sieciowej typu NAT. W przypadku gdy są źle przypisane zmieniamy konfigurację w Virtual Machine Settings tak by przypisanie było poprawne.
2. Konfiguracja interfejsów oraz ruting
2.1. RT1
Na RT1 należy skonfigurować kartę sieciową eth0 tak aby korzystała z ustawienia dhcp otrzymanego od VMWare oraz dla karty sieciowej eth1 adresu 192.168.100.1/24.
Pierwszym krokiem będzie “położenie” interfejsów poleceniami ifdown eth0 oraz ifdown eth1 (jeśli nie były wcześniej skonfigurowane polecenie może zwrócić błąd).
Następnie w pliku /etc/network/interfaces należy wprowadzić następujące linie (uwaga: interfejs eth0 może być już wcześniej skonfigurowany):
1 2 3 4 5 6 7 8 |
auto eth0 iface eth0 inet dhcp auto eth1 iface eth1 inet static address 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255 |
Następnie należy podnieść interfejsy poleceniami ifup eth0 oraz ifup eth1.
Po wykonaniu tych poleceń, RT1 będzie miał dostęp do internetu przez interfejs eth0 oraz będzie miał poprawnie skonfigurowaną l (w tym dodane trasy w tablicy rutingu).
2.2 SRV1
Na SRV1 należy skonfigurować kartę sieciową eth0 tak aby miała przypisany adresu 192.168.100.100/24.
Pierwszym krokiem będzie “położenie” interfejsu poleceniem ifdown eth0 (jeśli nie był wcześniej skonfigurowany polecenie może zwrócić błąd).
Następnie w pliku /etc/network/interfaces należy wprowadzić następujące linie (uwaga: interfejs eth0 może być już wcześniej skonfigurowany):
1 2 3 4 5 6 |
auto eth0 iface eth0 inet static address 192.168.100.100 netmask 255.255.255.0 broadcast 192.168.100.255 gateway 192.168.100.1 |
Następnie należy podnieść interfejsy poleceniami ifup eth0.
Po wykonaniu tych poleceń, RT1 będzie miał komunikację z interfejsem sieciowym eth1 na RT1 tak jak by były wpięte do zwykłego przełącznika (VMNet5). Powyższa konfiguracja ustawia zarówno dostęp do sieci 192.168.100.0/24 jak i bramę domyślną.
3. Przekazywanie pakietów
W trybie domyślnym system Linux odbiera od karty sieciowej tylko te ramki, które mają adres MAC w polu destination w nagłówku ethernet ustawiony na MAC przypisany do swojej karty sieciowej (można to zmienić ustawiając kartę sieciową w tryb PROMISC i wówczas odbierane są wszystkie ramki, ale nie będzie to potrzebne do wykonania niniejszego ćwiczenia).
Następnie analizowane są pakiety IPv4 i jeśli w polu dst w nagłówkach IPv4 jest ustawiony adres przypisany do naszego interfejsu sieciowego (lub adres broadcast) analizowane są warstwy wyższe. W przypadku gdy nasz system operacyjny ma działać jako ruter konieczna będzie zmiana tego trybu działania. Zmiana tego trybu dla wszystkich interfejsów możliwa jest z wykorzytaniem polecenia:
1 2 |
root@debian-template:~# echo "1" > /proc/sys/net/ipv4/ip_forward root@debian-template:~# |
Uwaga:
- Powyższe polecenie należy wykonać na RT1 (czy coś się zmieni jeśli wykonamy je przypadkiem na SRV1?)
- W poniższym ćwiczeniu wykorzystujemy globalną zmianę ustawienia tego trybu, ale możliwe jest też zmiana parametru pracy konkretnego interfejsu modyfikując plik /proc/sys/net/ipv4/conf/eth0/forwarding (gdzie za eth0 wstawiamy nazwę interfejsu dla którego dokonujemy zmianę).
4. Translacja adresów.
Ostatnim krokiem to ustawienie translacji adresów na RT1.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@asl244:~# iptables -t nat --flush #czyszczenie wpisów tablicy NAT root@asl244:~# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -d 0.0.0.0/0 -j SNAT --to-source 192.168.47.129 #dodanie regułki podmiany adresu źródłowego na 192.168.47.129 dla pakietów o adresie źródłowym 192.168.1.0/24 root@asl244:~# iptables -L -t nat -n #sprawdzenie zawartości tablicy NAT Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 192.168.1.0/24 0.0.0.0/24 to:192.168.47.129 Chain OUTPUT (policy ACCEPT) target prot opt source destination root@asl244:~# |
Uwaga:
- adres 192.168.47.129 należy podmienić na adres IPv4 przypisany w naszym RT1 do interfejsu eth0,
- pierwsze polecenie dokonuje wyczyszczenia wszystkich wpisów w tablicy NAT,
- drugie polecenie dodaje regułę wykonywaną po podjęciu decyzji routingu przez system (parametr -A POSTROUTING), do tablicy NAT (-t nat), która będzie podmieniała wszystkie adresy źródłowe (-j SNAT) z sieci 192.168.100.0/24 (parametr -s), zaadresowane do dowolnego innego adresy (parametr -d), na adres źródłowy 192.168.47.129 (parametr –to-source),
- ostatnie polecenie pokazuje zawartość tablicy nat.
Po wykonaniu tych kroków SRV1 powinien mieć komunikację z Internetem poprzez bramę domyślą RT1 (można to przetestować uruchamiając np. polecenie ping 150.254.78.79) lub traceroute albo mtr na adres 150.254.78.79.