Udostępnienie połączenia internetowego z telefonu do komputera jest dosyć proste. Gdy nie mamy wykupionego pakietu danych lub mamy limit, a chcemy pobrać dużo danych możemy skorzystać z wifi. Ale co gdy mamy dostęp do komputera, w którym jest dostęp do internetu po kablu i chcielibyśmy udostępnić to połączenie do telefonu? Tutaj z pomocą przychodzi reverse tethering.
W poniższym przykładzie posłużę się komputerem z Ubuntu ponieważ nie muszę instalować sterowników do obsługi telefonu z Androidem oraz sieci po kablu USB. Użytkownicy pozostałych systemów muszą zaopatrzyć się w program adb, sterowniki do ADB oraz kart sieciowych USB. Użytkownicy Ubuntu muszę, o ile już nie mają, zainstalować program adb. Aha, oczywiście w Androidzie musimy mieć dostęp do roota.
W telefonie uruchamiamy połączenie internetowe, nawet jeśli nie mamy pakietu danych. Możemy wyłączyć synchronizację, aby telefon nie próbował się łączyć. Następnie w opcjach połączenia USB włączamy tethering, po to aby wytworzyć połączenie TCP/IP pomiędzy komputerem, a telefonem. Za chwilę będziemy zmieniać jego parametry.
W konsoli na komputerze dajemy polecenie ifconfig, aby sprawdzić czy komputer widzi interfejs sieciowy usb0. Teraz logujemy się za pomocą adb do telefonu.
qkiz@drag0n:~$ adb shell
Po zalogowaniu się na telefonie sprawdzamy jak wygląda sytuacja z interfejsami sieciowymi.
# netcfg | grep rndis
rndis0 UP 192.168.42.129/24 0x00001043 b6:a4:15:61:00:7e
rndis0 UP 192.168.42.129/24 0x00001043 b6:a4:15:61:00:7e
Czasem w telefonie zamiast rndis0 możemy mieć usb0. Powyższe polecenie wyświetla interfejs sieciowy odpowiedzialny za komunikację z komputerem za pośrednictwem kabla USB (tethering).
Na powyższym przykładzie widzimy, że telefon ma numer 192.168.42.129. Sprawdzamy jaki numer IP ma komputer na interfejsie usb0. Czasem może się zdarzyć, że w nowych telefonach Samsunga czy LG nie dostaniemy adresu DHCP na interfejs usb0 w komputerze, więc musimy skonfigurować sobie sami. Ja skonfigurowałem interfejs usb0 za pomocą ifconfig dając adres z podsieci 192.168.42.0/24.
Sprawdzamy teraz czy możemy z telefonu spingować komputer i odwrotnie.
qkiz@drag0n:~$ ping -c 4 192.168.42.129
PING 192.168.42.129 (192.168.42.129) 56(84) bytes of data.
64 bytes from 192.168.42.129: icmp_seq=1 ttl=64 time=0.826 ms
64 bytes from 192.168.42.129: icmp_seq=2 ttl=64 time=0.637 ms
64 bytes from 192.168.42.129: icmp_seq=3 ttl=64 time=0.890 ms
64 bytes from 192.168.42.129: icmp_seq=4 ttl=64 time=0.696 ms
--- 192.168.42.129 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.637/0.762/0.890/0.102 ms
PING 192.168.42.129 (192.168.42.129) 56(84) bytes of data.
64 bytes from 192.168.42.129: icmp_seq=1 ttl=64 time=0.826 ms
64 bytes from 192.168.42.129: icmp_seq=2 ttl=64 time=0.637 ms
64 bytes from 192.168.42.129: icmp_seq=3 ttl=64 time=0.890 ms
64 bytes from 192.168.42.129: icmp_seq=4 ttl=64 time=0.696 ms
--- 192.168.42.129 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.637/0.762/0.890/0.102 ms
root@android:/ # ping -c 4 192.168.42.176
PING 192.168.42.176 (192.168.42.176) 56(84) bytes of data.
64 bytes from 192.168.42.176: icmp_seq=1 ttl=64 time=0.632 ms
64 bytes from 192.168.42.176: icmp_seq=2 ttl=64 time=0.646 ms
64 bytes from 192.168.42.176: icmp_seq=3 ttl=64 time=0.655 ms
64 bytes from 192.168.42.176: icmp_seq=4 ttl=64 time=0.561 ms
--- 192.168.42.176 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 0.561/0.623/0.655/0.044 ms
PING 192.168.42.176 (192.168.42.176) 56(84) bytes of data.
64 bytes from 192.168.42.176: icmp_seq=1 ttl=64 time=0.632 ms
64 bytes from 192.168.42.176: icmp_seq=2 ttl=64 time=0.646 ms
64 bytes from 192.168.42.176: icmp_seq=3 ttl=64 time=0.655 ms
64 bytes from 192.168.42.176: icmp_seq=4 ttl=64 time=0.561 ms
--- 192.168.42.176 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 0.561/0.623/0.655/0.044 ms
Wszystko działa. Teraz w telefonie rekonfigurujemy interfejs sieciowy odpowiedzialny za połączenie z siecią komórkową.
root@android:/ # ifconfig rmnet0 0.0.0.0
Tak naprawdę to pozbawiliśmy konfiguracji interfejsu modemu telefonu.
Teraz zmieniamy adres domyślnej bramy w telefonie. Ruch ma być kierowany na interfejs sieciowy połączenia z komputerem.
root@android:/ # route add default gw 192.168.42.176 dev rndis0
gdzie za 192.168.42.176 podajemy adres komputera.
Teraz ustawiamy DNSy po stronie telefonu. Najlepiej te z których korzysta komputer.
root@android:/ # setprop net.dns1 8.8.8.8
root@android:/ # setprop net.dns2 8.8.4.4
root@android:/ # setprop net.dns2 8.8.4.4
Teraz na Ubuntu udostępniamy internet dla połączenia z telefonem. Dajemy
qkiz@drag0n:~$ sudo su
root@drag0n:/home/qkiz# echo "1" >/proc/sys/net/ipv4/ip_forward
root@drag0n:/home/qkiz# echo "1" >/proc/sys/net/ipv4/ip_forward
To umożliwi routowanie pakietów z jednego interfejsu na drugi. I na sam koniec nowe regułki iptables przekierują ruch.
qkiz@drag0n:~$ sudo iptables -t nat -A POSTROUTING -o usb0 -j ACCEPT
qkiz@drag0n:~$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
qkiz@drag0n:~$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Wracamy do konsoli telefonu i sprawdzamy czy możemy spingować cokolwiek.
root@android:/ # ping -c 4 google.pl
PING google.pl (212.2.108.89) 56(84) bytes of data.
64 bytes from cache.google.com (212.2.108.89): icmp_seq=1 ttl=57 time=36.9 ms
64 bytes from cache.google.com (212.2.108.89): icmp_seq=2 ttl=57 time=52.3 ms
64 bytes from cache.google.com (212.2.108.89): icmp_seq=3 ttl=57 time=59.5 ms
64 bytes from cache.google.com (212.2.108.89): icmp_seq=4 ttl=57 time=32.2 ms
--- google.pl ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 32.228/45.256/59.532/11.092 ms
PING google.pl (212.2.108.89) 56(84) bytes of data.
64 bytes from cache.google.com (212.2.108.89): icmp_seq=1 ttl=57 time=36.9 ms
64 bytes from cache.google.com (212.2.108.89): icmp_seq=2 ttl=57 time=52.3 ms
64 bytes from cache.google.com (212.2.108.89): icmp_seq=3 ttl=57 time=59.5 ms
64 bytes from cache.google.com (212.2.108.89): icmp_seq=4 ttl=57 time=32.2 ms
--- google.pl ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 32.228/45.256/59.532/11.092 ms
Internet udostępniony. Teraz możemy sprawdzić jak to działa w aplikacjach. Jeżeli uruchomimy przeglądarkę internetową i wejdziemy na serwis sprawdzający nasze IP to powinniśmy tam widzieć adres komputera. Aby przywrócić normalne ustawienia i móc korzystać z internetu komórkowego wystarczy odłączyć telefon od kompa, wyłączyć i włączyć transmisję danych. Ustawienia interfejsów sieciowych i domyślnej bramy zostaną zresetowane.