Tunelowanie przez DNS na Androidzie
Tunelowanie ruchu przez DNS jest genialnym rozwiązaniem, ale potrzebne jest zazwyczaj w tych momentach, kiedy nie ma się pod ręką laptopa, jest zimno, pada, nie wiemy w którą stronę iść, a na dodatek jesteśmy poza zasięgiem aktualnie posiadanej mapy. Prosi się więc o odpalenie tego rozwiązania na telefonie.
Do wykonania potrzebujemy: zrootowany telefon z Androidem, linuxowy serwer, własną domenę, oraz podstawową wiedzę na temat DNS i obsługi shella.
Proces instalacji jest zgapiony z http://dnstunnel.de/ i tam proszę się udać w razie niepowodzeń.
Zakładam, że example.com to nazwa domeny, a 1.2.3.4 to IP serwera z Linuxem.
DNS
Oddelegujemy wszystkie zapytania z sub.example.com na serwer DNS stojący na Linuxie. Wystarczy dodać następujące dwa rekordy:
sub.example.com. IN NS serv.example.com. serv.example.com IN A 1.2.3.4
Serwer z Linuxem
Na początku uprzedzę, że stawianie takiego serwera powinno odbywać się w dedykowanej tylko do tego maszynie wirtualnej bądź kontenerze, ponieważ istnieje spore niebezpieczeństwo, że ktoś się tam włamie.
Ściągamy pakiet OzymanDNS, instalujemy zależności:
sudo apt-get install libnet-dns-perl libmime-base32-perl
Serwer odpala się poleceniem
sudo ./nomde.pl -i 0.0.0.0 sub.example.com, które to powoduje że serwer nasłuchuje na wszystkich interface'ach sieciowych (0.0.0.0) oraz akceptuje tunelowany ruch kierowany do sub.example.com.
Warto w tym momencie przetestować łącznośc z domowego komputera następującym poleceniem:
ssh -vv -o ProxyCommand="./droute.pl sshdns.sub.example.com" user@localhost
Może to potrwać dłuższy okres czasu. Jeśli SSH się połączy i da się zalogować, warto uruchomić nomde.pl w nieco bardziej wyrafinowany sposób niż screen sudo. Oto skrypt do supervisord:
[program:nomde] command = /root/nomde.pl -i 0.0.0.0 sub.example.com autostart = true startsecs = 5 user = root redirect_stderr = true stdout_logfile = /var/log/nomde.log
Ponadto, będzie potrzebny zainstalowany jakiś serwer proxy - ja używałem tinyproxy. Warto ustawić go na słuchanie wyłącznie na localhoście, żeby nie stać się publicznym proxy. Ja zwyczajowo ustawiam również port na 6666.
Android
Przypominam - Android musi być zrootowany.
Pierwszym krokiem na Androidzie będzie instalacja Linuxa. Służy do tego aplikacja o nazwie Linux Installer. Przed instalacją polecam wejść do menu wybrać "Quick tutorial" - program ciężko nazwać intuicyjnym w obsłudze. Z Marketu przydadzą się jeszcze: ConnectBot oraz ProxyDroid.
Po zainstalowaniu Linuxa, wchodzimy do ConnectBot, z dropdowna w dolnej części ekranu wybieramy "local", wpisujemy dowolną nazwę połączenia i wciskamy enter. Powinna pojawić się konsola, w której wpisujemy: linuxchroot (lub inną komendę podaną w Linux Installerze). Najpierw zainstalujmy niezbędne pakiety:
apt-get update && apt-get install openssh-client libnet-dns-perl libmime-base32-perl
Następnie ściągamy na telefon i rozpakowujemy OzzymanDNS - tar, wget i scp działają normalnie. Kopiujemy droute.pl do /usr/bin/. Nawiązujemy pierwsze połaczenie:
ssh -C -vv -L 6666:localhost:6666 -o ProxyCommand="/usr/bin/droute.pl sshdns.sub.example.com" user@localhost
Jeśli połaczenie zostało nawiązane, to na porcie 6666 Androida mamy tunel do proxy na serwerze. Teraz pozostaje nam ustawić ProxyDroid tak, żeby korzystały z niego pozostałe aplikacje.
W ustawieniach ProxyDroid:
- Proxy Switch = True
- Host = localhost
- Port = 6666
- Proxy type = HTTP
- Global Proxy = True
Teraz pozostaje wejść np. na stronę http://myip.dk/ i sprawdzić czy adres przez nią wskazywany to 1.2.3.4 (adres serwera). Jeśli tak, tunel po DNS działa.