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 64Teraz uaktywniamy tunel
root@gandalf:/# /sbin/ip link set vpn0 upnastę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 vpn0ustawmy jeszcze routing poprawnie:
root@gandalf:/# /sbin/ip route add 192.168.1.254 dev vpn0To 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 vpn0Teraz 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.254i 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 200W 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 onlinkNa THORGALu:
root@thorgal:/# /sbin/ip route add 192.168.1.0/24 via 192.168.1.253 dev vpn0 onlinkto 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 200trasę 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 MASQUERADECo 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.9Teraz 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