Jak skonfigurować transmisję internetową (tethering wsteczny) w systemie Linux?

19

Mam HTC Desire S z opcją połączenia przez USB i korzystania z połączenia internetowego komputera. Działa to dobrze w systemie Windows, ale mam problemy z konfiguracją w Ubuntu. Kiedy podłączam się i wybieram łącze internetowe z menu USB, urządzenie USB jest tworzone i mogę pingować jego adres IP. Próbowałem różnych konfiguracji iptables i konfiguracji nat, ale nie jestem pewien, czy robię to poprawnie, czy też potrzebuję dodatkowej konfiguracji ...

Dziękuję za wszelką pomoc.

niebieski szary
źródło
Mam to działa przy użyciu kombinacji info od trac.osuosl.org/trac/replicant/wiki/ReplicantUSBNetworking i translate.googleusercontent.com/... . Odpowiedź poniżej.
bluegray

Odpowiedzi:

11

Poniższe działa przez chwilę, ale tylko w przeglądarce.

Po podłączeniu telefonu za pomocą USB i wybraniu połączenia internetowego powinieneś otrzymać nowe urządzenie RNDIS (USB0 lub USB1). W przypadku Ubuntu edytuj / etc / network / interfaces i dodaj następujące linie:

iface usb0 inet dhcp
iface usb1 inet dhcp

Spowoduje to przypisanie adresu IP automatycznie po dodaniu urządzenia. Jeśli adres sieciowy nie jest przypisany automatycznie do usb0 lub usb1, musisz to zrobić ręcznie.

Następnie musisz skonfigurować NAT na swoim komputerze z linuksem. Coś jak:

sudo iptables -A POSTROUTING -t nat -j MASQUERADE
sudo echo 1 > /proc/sys/net/ipv4/ip_forward 

Potrzebujesz także serwera DNS:

sudo apt-get install bind9

Działa to przez kilka minut, ale po chwili telefon rezygnuje z szukania HTC Sync i rozłącza się.

Do zrootowanych telefonów

Możesz połączyć się na stałe, jeśli masz zrootowany telefon (fre3vo działało dla mnie). Wykonaj następujące czynności za pomocą adb.

Włącz tryb usb dla sieci i adb:

adb shell echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch

Przypisz adres IP do urządzenia usb0 w telefonie:

adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up

Dodaj domyślną trasę. IP powinien być adresem IP przypisanym do usb0 w systemie Linux:

adb shell route add default gw 192.168.99.1 dev usb0

Ustaw serwer DNS. To jest otwarty serwer DNS Google'a, ale może to być adres IP twojego komputera z linuksem, jeśli masz serwer DNS:

adb shell setprop net.dns1 8.8.8.8
niebieski szary
źródło
2
Według legendy możesz sfałszować synchronizację HTC, wykonując następujące czynności: Po podłączeniu USB i wybraniu połączenia internetowego w telefonach HTC czeka on na synchronizację HTC i się poddaje. Nasłuchuje na porcie 6000. Wystarczy sfałszować synchronizację HTC z netcat. Spróbuj tego w wierszu poleceń: phoneip=$(arp -n | grep usb | awk '{print $1}') echo -n -e "\x00\x02\x00\x00" | nc $phoneip 6000 > /dev/null wartość szesnastkowa 00 02 00 00jest wszystkim, czego szuka.
geffchang
@geffchang, Thanks! Dla użytkowników systemu Windows, gdy telefon komórkowy próbuje połączyć się przez USB, możesz uruchomić, netsh interface ip show configaby zobaczyć wszystkie nazwy interfejsów, a następnie netsh interface ip show config name="Local Area Connection #2"uzyskać właśnie ten interfejs, gdzie Local Area Connection #2jest jakikolwiek nowy adapter się nazywa. Możesz zmienić nazwę tego dla wygody.
Sam Hasler
3

Zrobiłem ten mały bash, aby zautomatyzować wszystko. Wystarczy podłączyć telefon w trybie ładowania do komputera i uruchomić ten bash.

#!/bin/bash
/opt/android-sdk-update-manager/platform-tools/adb shell 'echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch'
sleep 1
/opt/android-sdk-update-manager/platform-tools/adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up
sleep 1
/opt/android-sdk-update-manager/platform-tools/adb shell setprop net.dns1 8.8.8.8

get_ip ()
{
ifconfig usb0 | grep inet | awk '{print $2}' | sed 's/addr://' | grep .
}

echo "waiting for IP on computer usb0"
while [[ `get_ip` < 192 ]];do sleep 2; done
ip=`get_ip`
echo "IP adress is $ip "
/opt/android-sdk-update-manager/platform-tools/adb shell route add default gw $ip dev usb0
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
DaMs
źródło
0

Ponieważ sam nie mam dostępu do komputera z systemem Linux, nie mogę przetestować tego rozwiązania, ale możesz wypróbować kroki opisane tutaj (tłumaczenie Google z rosyjskiego) .

Komentarze do tłumaczenia:

  • „rutovanym” oznacza zakorzeniony;
  • WB lub BB oznacza Big Brother (komputer stacjonarny);
  • smarta to skrót od „smartfona”.

Powodzenia!

Nonsleepr
źródło
Dzięki, ale jest łatwiejszy sposób niż łączenie interfejsów.
bluegray
0

Ok, oto dokładnie to, co zrobiłem, nie ma potrzeby rootowania HTC:

Skonfiguruj bind9 i NAT itp ...

Uwaga: 1: jeśli wykonasz sudo echo 1> / proc / sys / net / ipv4 / ip_forward, otrzymasz błąd uprawnień, więc oto skrypt dla procesu 2: Możesz sprecyzować iptables o tym, jak to robi dodawanie parametrów dla określonych urządzeń.


cd ~
echo '!/bin/bash
apt-get install bind9
iptables -A POSTROUTING -t nat -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward' > setup_bind9_nat.sh

chmod +x setup_bind9_nat.sh
sudo ./setup_bind9_nat.sh

teraz podłącz telefon i wybierz „Internet pass through”

poczekaj na pojawienie się urządzenia: ifconfig sprawdź, czy jest również w: arp

Odkryłem, że muszę odłączyć urządzenie, a następnie podłączyć je ponownie, aby pojawiło się w arp, rzeczy nie działają poprawnie, jeśli arp nie pokazuje urządzenia.

Następnie urządzenie będzie siedzieć i czekać, aż HTC Sync wyśle ​​mu wiadomość, więc musisz wyśmiewać wiadomość HTC Syncs:


#change this line to be more specific if you have more than one usb network device
phone_usb_device="usb"
get_ip ()
{
    arp -n | grep $phone_usb_device | awk '{print $1}'
}

#TODO: This needs a timeout and loop needs cleaning up, but works fine and borrowed from another post.
echo "waiting for IP on computer usb"
while [[ `get_ip` < 192 ]];do sleep 2; done
phoneip=`get_ip`
echo "IP adress is $phoneip "

echo -n -e "\x00\x02\x00\x00" | nc -q 2 $phoneip 6000 > /dev/null

Mogę napisać wersję tego za pomocą D-Bus, aby ta ostatnia część była wykonywana automatycznie po podłączeniu urządzenia itp.

Ok, oto moja praca w toku, nie mogłem znaleźć niczego „ogólnego” na d-bus, więc zdecydowałem się na trochę hackowania przy użyciu udev. To nie jest idealne, na przykład polecenie uruchamia się dwukrotnie, więc Będę musiał sprawdzić, czy mogę lepiej filtrować pasujące parametry, dodać także limit czasu na ostatnim skrypcie, po prostu zwiększyć i zobaczyć, czy mogę zastąpić arp czymś nieco lepszym, powiedzmy patrząc w / proc

tutaj.s mój plik .rules z /etc/udev/rules.d utworzyłem


cat /etc/udev/rules.d/htc-desire.rules

Możesz nazwać to jak chcesz, ale NIE ROZPOCZNIJ GO NUMEREM, w ten sposób zostanie uruchomiony na końcu.

Dodaj następujące pliki do pliku jako sudo za pomocą edytora, który wybierzesz itp.


#KERNEL=="usb?" or DRIVERS=="usb" not sure which is best, may need extra mode information too from usb device.
SUBSYSTEM=="net", DRIVERS=="usb", ATTRS{manufacturer}=="HTC", ATTRS{idProduct}=="0ffe", RUN+="/home/olli/chain_mock_htc_sync.sh $kernel"


Ubuntu is setup to create the file with the correct permissions already 


ls -lrt /etc/udev/rules.d/htc-desire.rules 
-rw-r--r-- 1 root root 248 Jun 26 22:09 htc-desire.rules

Zasadniczo, jeśli nie widzisz tych 3 'r,


sudo chmod a+r /etc/udev/rules.d/htc-desire.rules 

Następnie będziesz potrzebować dwóch kolejnych plików, jednego do połączenia drugiego, ponieważ RUN z udev zablokuje wszystko inne (nawet jeśli jest uruchamiane jako ostatni !!) ... hmm ... w każdym razie:

Pliki w moim katalogu domowym utworzyłem na razie „/ home / olli /” ... więc pamiętaj, aby zastąpić bit „/ home / olli /” za każdym razem, gdy tworzysz pliki:

więc dla mnie cd do mojego katalogu domowego.


cd ~

utwórz plik o nazwie


chain_mock_htc_sync.sh

zawierający następujące elementy:



#!/bin/bash
/home/olli/mock_htc_sync.sh "$1" &
exit

sprawiają, że jest wykonywalny


chmod +x chain_mock_htc_sync.sh

utwórz inny plik o nazwie


mock_htc_sync.sh

zawierający następujące


#!/bin/bash
#change this line to be more specific if you have more than one usb network device

phone_usb_device="$1"
get_ip ()
{
    arp -n | grep $phone_usb_device | awk '{print $1}'
}

#TODO: This needs a timeout and loop needs cleaning up, but works fine and borrowed from another post.
echo "waiting for IP on computer $phone_usb_device"
while [[ `get_ip`  /dev/null

Spraw, by był wykonywalny:

chmod +x mock_htc_sync.sh

Mam nadzieję, że powinienem mieć ładną uporządkowaną wersję, jak tylko pos. (prawdopodobnie jutro).

użytkownik2330377
źródło
0

W przypadku odwrotnego tetheringu USB w systemach Android i Linux bez rootowania zobacz moją odpowiedź tutaj

salutepc
źródło