Iptables jako prosty serwer proxy



Stare dobre iptablesy, znane i cenione przez wszystkich linuksiarzy mogą służyć jako prosty serwer proxy, zgadza się.

W poprzednim wpisie przedstawiłem przykład programu do odtwarzania muzyki na Raspberry, którym steruje się za pomocą panelu webowego - zwyczajnymi zapytaniami GET. Wszystko działa jak należy, ale pojawił się problem. Odtwarzacz (a konkretniej jego moduł socket) słucha na porcie 8080, a ja chciałbym, żeby można było się do niego dostać po porcie 80, czyli wpisując normalnie w przeglądarce:

1 http://muzyka.domena/

Zamiast urla z portem:

1 http://muzyka.domena:8080/

W Uniksach porty TCP/IP poniżej 1024 należą do grupy tzw. "niskich portów". Aby proces mógł słuchać na takim porcie, musi zostać uruchomiony z roota, np. przez sudo. Ja oczywiście nie chciałem, żeby mój odtwarzacz wymagał aż tak dramatycznych uprawnień, więc zdecydowałem się na przekierowanie wysokiego portu 8080 na port niski - 80.

Normalnie takie zadania realizuje się na przykład za pomocą serwera proxy - Apache spisuje się nieźle. Po co jednak stawiać osobny serwer, kiedy iptables będzie wystarczająco dobre.

1 iptables -A PREROUTING -t nat -d 192.168.1.1/24 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080

Powyższe polecenie dodaje regułę PREROUTING w tabeli nat, na adresie 192.168.1.1 o masce 255.255.255.0. Wszystkie zapytania pochodzące z tego adresu i kierujące się na port 80, zostaną przekierowane na port 8080.

Po ustawieniu reguły możemy trochę poklikać w aplikację i zobaczyć w iptablesach czy zarejestrował się jakichś ruch.

1 root@aszurbanipal:~# iptables -L -nv -t nat --line-numbers
2 Chain PREROUTING (policy ACCEPT 157 packets, 9815 bytes)
3 num pkts bytes target prot opt in out source destination
4 1 85 5100 REDIRECT tcp -- * * 0.0.0.0/0 192.168.1.0/24 tcp dpt:80 redir ports 808

Oto i nasz ruch. Dzięki regule będziemy mogli korzystać z łatwych do zapamiętania urli.