Tunelowanie i NAT w praktyce czyli skad wziasc dodatkowe adresy IP

Wielu z was zapewne słyszało o tunelowaniu i tunelach. Jeżeli jednak nie, to w sieci krąży wiele artykułów traktujących o tej tematyce. Dotychczas głównym zastosowaniem tuneli były delegacje pul adresowych IPv6. Jednak czy tylko do tego można wykorzystać znakomity pakiet iproute2 Alexey'a N. Kuznetsov'a ? Okazuje się, że pakiet ten może być najlepszym przyjacielem użytkowników dobrze znanych terminali HIS, korzystających z 'rewelacyjnej' usługi SDI. Każdy posiadacz tegoż urządzenia zna jedną z głónych wad tego rozwiązania, mianowicie jeden zewnętrzny adres IP z brakiem możliwości zmiany wpisu w Reverse DNS. Zapytacie pewnie jaki problem wykupić dodatkowe adresy IP u providera, który dostarcza te urządzenie. Otóż taka usługa nie istnieje! Jednak tutaj na ratunek przychodzi iproute2. Jeżeli jesteśmy posiadaczami 'serwerka' na linuksie i mamy 'zaprzyjaźniony' serwer z wolnymi adresami IP (np na łączu Polpak) to możemy pokusić się na 'zapożyczenie' adresu (albo nawet kilku) z tegoż serwera z pewną pulą adresową. Tak więc zaczynamy: Na początku upewnijmy się, czy na obu serwerach jest pakiet iproute2:


root@thorgal:/# whereis ip

(tutaj małe wyjaśnienie: ip jest częścią składową pakietu iproute2) a oto, co mniej więcej powinniśmy otrzymać:


ip: /sbin/ip

Jeżeli okaże się, że nie mamy iproute2, to jest on dostępny dla kilku najbardziej popularnych dystrybucji linuxa, więc nie zakładam większych problemów.

Do naszego przykładu posłużą nam dwa adresy z puli zewnętrznej i dwa z puli wewnętrznej:
1.2.3.4 - adres IP komputera/serwera z terminalem HIS, którego będziemy nazywali GANDALF
5.6.7.8 - adres IP komputera/serwera, który 'użycza' nam adresu IP ,nazywany THORGAL

Na samym początku tworzymy nowy tunel (na komputerze o adresie 1.2.3.4)


root@gandalf:/# /sbin/ip tunnel add vpn0 mode ipip remote 5.6.7.8 local
1.2.3.4 ttl 64

Teraz uaktywniamy tunel

root@gandalf:/# /sbin/ip link set vpn0 up

następnie nadajemy adres IP z puli prywatnej na interfejs tunelu (tutaj mała sugestia, aby nadawać adresy IP z tej puli, jaką używamy na GANDALFie w sieci LAN, co uprości nam późnejszy NAT)

root@gandalf:/# /sbin/ip addr add 192.168.1.253 dev vpn0

ustawmy jeszcze routing poprawnie:

root@gandalf:/# /sbin/ip route add 192.168.1.254 dev vpn0

To samo robimy na maszynie o adresie IP 5.6.7.8, czyli na THORGALu:

root@thorgal:/# /sbin/ip tunnel add vpn0 mode ipip remote 1.2.3.4 local
5.6.7.8 ttl 64

root@thorgal:/# /sbin/ip link set vpn0 up

root@thorgal:/# /sbin/ip addr add 192.168.1.254 dev vpn0

root@thorgal:/# /sbin/ip route add 192.168.1.253 dev vpn0

Teraz kiedy mamy już zestawiony tunel sprawdźmy, czy on działa.

root@gandalf:/# ifconfig vpn0
vpn0     Link encap:IPIP Tunnel  HWaddr
         inet addr:192.168.1.253  P-t-P:192.168.1.253 Mask:255.255.255.255
         UP POINTOPOINT RUNNING NOARP  MTU:1636  Metric:1
         RX packets:189074 errors:0 dropped:0 overruns:0 frame:0
         TX packets:168968 errors:2 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:26739928 (25.5 Mb)  TX bytes:12779672 (12.1 Mb)

root@gandalf:/# ping 192.168.1.254

i powinniśmy otrzymać odpowiedź pod warunkiem, że na obu maszynach nie jest wyblokowane PING_ECHO_REPLY

Kolejnym krokiem będzie stworzenie translacji adresowej 1:1, czyli jeden adres IP wewnętrzny będzie reprezentowany przez jeden adres IP na zewnątrz. (robimy to na maszynie o adresie IP 5.6.7.8 czyli na THORGALu)


root@thorgal:/# /sbin/ip route add nat 5.6.7.9 via 192.168.1.2

root@thorgal:/# /sbin/ip rule add from 192.168.1.2 nat 5.6.7.9

Tym sposobem zrobiliśmy NAT adresu 192.168.1.2 czyli jakiegoś komputera w sieci LAN podpiętej do GANDALFa.

Jeżeli na maszynie THORGAL (5.6.7.8) mamy dodatkowo MASQERADING to musimy wyłączyć adres 192.168.1.2 z maskowania go przez serwer.

Zakładając, że na GANDALFie (1.2.3.4) komputery w lanie mają adresy z puli 192.168.1.0/24 i chcemy aby komputer o adresie 192.168.1.2 wychodził z zewnętrznym adresem 5.6.7.9, piszemy: (w rzeczywistości linijki te wybierają cały ruch wychodzący z adresu 192.168.1.2, kierując go na inną tablicę routingu, która wskazuje aby wszystkie pakiety wędrowały przez nasz świeżo zbudowany tunel)

To piszemy na GANDALFie:


root@gandalf:/# /sbin/ip rule add from 192.168.1.2 table 200

root@gandalf:/# /sbin/ip route add default via 192.168.1.254 dev vpn0
table 200

W razie gdyby powyższa linijka powodowała generowanie błędu o niedostępności sieci, mozna spróbować użyć dodatkowego parametru 'onlink' :

gandalf# /sbin/ip route add default via 192.168.1.254 dev vpn0 table 200 onlink

Na THORGALu:

root@thorgal:/# /sbin/ip route add 192.168.1.0/24 via 192.168.1.253 dev
vpn0 onlink

to pozwoli nam nie martwić się o drogę powrotną pakietów z sieci LAN GANDALFa.

Co jeszcze moglibyśmy zrobić ? Jeżeli mamy szybkie łącze na GANDALFie ale posiadamy tylko jeden adres IP, możemy spróbować przepuszczać przez nasz tunel i NAT tylko połączenia z serwerami IRC. Zrobic to można poprzez wpisanie do tablicy routingu GANDALFa zamiast polecenia


gandalf# /sbin/ip route add default via 192.168.1.254 dev vpn0 table 200

trasę używającą nasz tunel ale tylko na konkretne adresy IP (w tym przypadku adres serwera IRC):

root@gandalf:/# /sbin/ip route add 194.145.96.67 via 192.168.1.254 dev
vpn0 table 200

Innym rozwiązaniem byłoby markowanie wszystkich połączeń na porty 6000:7777 przez iptables i późniejsze ich kierowanie odpowiednimi zestawami reguł przez nasz tunel.

Jeżeli do dyspozycji mamy tylko jeden adres IP z puli THORGALa, a chcemy uchodzić za wspaniałomyślnego administratora naszej malutkiej sieci LAN i wszystkim użytkownikom zmienić adres, z jakim pojawiają się na IRCu, możemy użyć takiego rozwiązania:


root@gandalf:/# /sbin/iptables -t nat -A POSTROUTING -o vpn0 -j MASQUERADE

Co nam daje ta linijka ? Otóż teraz wszyskie pakiety z sieci LAN podpiętej do GANDALFa będą wypuszczane z adresem źródłowym interfejsu vpn0 czyli 192.168.1.253. Trzeba też lekko zmienić tablicę NAT na THORGALu aby translacja dotyczyła nie adresu komputera z sieci LAN lecz adresu interfejsu vpn0 GANDALFa:

root@thorgal:/# /sbin/ip route add nat 5.6.7.9 via 192.168.1.253

root@thorgal:/# /sbin/ip rule add from 192.168.1.253 nat 5.6.7.9

Teraz nasz układ wykorzystuje już dwa rodzaje translacji adresowej, ponieważ maskowanie także należy do tej grupy.

Zaletami opisanego rozwiązania poza oczywistymi korzyściami płynącymi z własnego adresu IP jest całkowita przeźroczystość tunelu dla wszelkich urządzeń korzystających z protokołu tcp/ip w sieci LAN GANDALFa. Nasz adres w sieci lokalnej nie ulega zmianie więc nie tracimy mozliwości komunikacji z innymi hostami i usługami w naszej sieci. Minimalna konfiguracja takich urządzeń wymaga tylko, aby posiadały swój adres IP, maskę podsieci oraz znały adres domyślnej bramy tzw. gateway'a. To, co wyróżnia tą metodę od rozwiązań software'owych instalowanych lub uruchamianych na stanowiskach klienckich to fakt, iż nie musimy się martwic o zgodność systemu operacyjnego z taką aplikacją. Wymagane jest jedynie aby gateway/bramka pracowała pod kontrolą systemu linux z pewnymi modyfikacjami domyślnej konfiguracji jądra systemu.

Karol Daniszewski westbam@net.art.pl