Wie richten Sie Internet Pass-Through (Reverse-Tether) unter Linux ein?

Ich habe ein HTC Desire S, das die Option hat, eine Verbindung über USB herzustellen und die Internetverbindung des Computers zu verwenden. Dies funktioniert gut unter Windows, aber ich habe Probleme, es in Ubuntu einzurichten. Wenn ich das Gerät einstecke und Internet Pass-Through aus dem USB-Menü auswähle, wird das USB1-Gerät erstellt und ich kann seine IP-Adresse anpingen. Ich habe verschiedene iptables-Konfigurationen ausprobiert und nat eingerichtet, aber ich bin mir nicht sicher, ob ich es richtig mache oder ob eine zusätzliche Konfiguration erforderlich ist ...

Danke für jede Hilfe.

Ich habe es mit einer Kombination aus Informationen von trac.osuosl.org/trac/replicant/wiki/ReplicantUSBNetworking und translate.googleusercontent.com/… zum Laufen gebracht . Antwort unten.

Antworten (4)

Das Folgende funktioniert eine Weile, aber nur für den Browser.

Wenn Sie Ihr Telefon über USB anschließen und Internet Pass-Through auswählen, sollten Sie ein neues RNDIS-Gerät (USB0 oder USB1) erhalten. Bearbeiten Sie für Ubuntu /etc/network/interfaces und fügen Sie die folgenden Zeilen hinzu:

iface usb0 inet dhcp
iface usb1 inet dhcp

Dadurch wird automatisch eine IP zugewiesen, wenn das Gerät hinzugefügt wird. Wenn usb0 oder usb1 nicht automatisch eine Netzwerkadresse zugewiesen wird, müssen Sie dies manuell tun.

Dann müssen Sie NAT auf Ihrem Linux-Computer einrichten. Etwas wie:

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

Außerdem benötigen Sie einen DNS-Server:

sudo apt-get install bind9

Dies funktioniert einige Minuten lang, aber nach einer Weile gibt das Telefon die Suche nach HTC Sync auf und trennt die Verbindung.

Für gerootete Telefone

Sie können sich dauerhaft verbinden, wenn Sie ein gerootetes Telefon haben (fre3vo hat für mich funktioniert). Führen Sie Folgendes mit adb aus.

Aktivieren Sie den USB-Modus für Netzwerk und ADB:

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

Weisen Sie dem USB0-Gerät auf dem Telefon eine IP zu:

adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up

Fügen Sie eine Standardroute hinzu. Die IP sollte die IP sein, die usb0 in Linux zugewiesen ist:

adb shell route add default gw 192.168.99.1 dev usb0

Stellen Sie den DNS-Server ein. Dies ist der offene DNS-Server von Google, aber es kann die IP Ihres Linux-Computers sein, wenn Sie einen DNS-Server haben:

adb shell setprop net.dns1 8.8.8.8
Der Legende nach können Sie die HTC-Synchronisierung fälschen, indem Sie Folgendes tun: Wenn Sie auf HTC-Telefonen den USB-Anschluss anschließen und Internet-Passthrough auswählen, wartet es auf die HTC-Synchronisierung und gibt auf. Es lauscht auf Port 6000. Sie müssen also nur die HTC-Synchronisierung mit Netcat vortäuschen. Versuchen Sie dies in der Befehlszeile: phoneip=$(arp -n | grep usb | awk '{print $1}') echo -n -e "\x00\x02\x00\x00" | nc $phoneip 6000 > /dev/nullDer Hex-Wert von 00 02 00 00ist alles, wonach gesucht wird.
@geffchang, danke! Wenn Windows-Benutzer versuchen, eine Verbindung über USB herzustellen, können Sie ausführen netsh interface ip show config, um alle Schnittstellennamen anzuzeigen und dann netsh interface ip show config name="Local Area Connection #2"nur diese Schnittstelle abzurufen, wo Local Area Connection #2der neue Adapter aufgerufen wird. Sie können dies der Einfachheit halber umbenennen.

A hat diese kleine Bash gemacht, um alles zu automatisieren. Schließen Sie einfach Ihr Telefon im Lademodus an Ihren Computer an und führen Sie diese Bash aus.

#!/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

Da ich selbst keinen Zugriff auf einen Linux-Rechner habe, kann ich diese Lösung nicht testen, aber Sie können die hier beschriebenen Schritte ausprobieren (Google-Übersetzung aus dem Russischen) .

Anmerkungen zur Übersetzung:

  • „rutovanym“ bedeutet verwurzelt;
  • WB oder BB bedeutet Big Brother (Desktop);
  • smarta ist die Abkürzung von "Smartphone's".

Viel Glück!

Danke, aber es gibt einen einfacheren Weg, als die Schnittstellen zu überbrücken.

Ok, hier ist genau das, was ich getan habe, kein Rooten von HTC gewünscht:

Richten Sie bind9 und NAT usw. ein ...

Hinweis: 1: Wenn Sie einfach sudo echo 1 > /proc/sys/net/ipv4/ip_forward ausführen, erhalten Sie einen Berechtigungsfehler. Hier ist also ein Skript für den Prozess. 2: Sie können iptables genauer machen, wie es Dinge tut Hinzufügen von Parametern für bestimmte Geräte.


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

Schließen Sie jetzt Ihr Telefon an und wählen Sie „Internet Pass Through“

Warten Sie, bis das Gerät in angezeigt wird: ifconfig Überprüfen Sie, ob es auch in ist: arp

Ich habe festgestellt, dass ich das Gerät ausstecken und dann wieder einstecken musste, damit es in arp angezeigt wird. Die Dinge funktionieren nicht richtig, wenn arp das Gerät nicht anzeigt.

Das Gerät wartet dann darauf, dass HTC Sync ihm eine Nachricht sendet, sodass Sie die HTC Sync-Nachricht simulieren müssen:


#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

Ich kann eine Version davon mit D-Bus schreiben, sodass der letzte Teil automatisch ausgeführt wird, wenn das Gerät angeschlossen wird usw. ...

Ok, hier ist meine Arbeit, ich konnte nichts "Generisches" auf d-Bus finden, also habe ich mich für eine Art Hack-Lösung mit udev entschieden. Das ist nicht perfekt, zum Beispiel wird der Befehl zweimal ausgeführt, also ich Ich muss sehen, ob ich die übereinstimmenden Parameter etwas besser filtern kann, auch ein Timeout im letzten Skript hinzufügen, nur für den Fall, und sehen, ob ich arp durch etwas Besseres ersetzen kann, sagen wir, in /proc suchen

here.s meine .rules-Datei aus /etc/udev/rules.d, die ich erstellt habe


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

Du kannst es nennen wie du willst, aber BEGINNE ES NICHT MIT EINER NUMMER, so wird es zuletzt ausgeführt.

Fügen Sie der Datei Folgendes als sudo mit einem Editor Ihrer Wahl usw. hinzu....


#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

Grundsätzlich, wenn Sie diese 3 'r's nicht sehen,


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

Dann brauchen Sie zwei weitere Dateien, eine um die andere zu verketten, da RUN von udev alles andere blockiert (obwohl es zuletzt ausgeführt wird!!) ... hmm ... jedenfalls:

Ich habe die Dateien vorerst in meinem Home-Verzeichnis "/home/olli/" erstellt ... also denken Sie daran, das '/home/olli/'-Bit durch den Ort zu ersetzen, an dem Sie die Dateien erstellen:

Also für mich, cd in mein Home-Verzeichnis.


cd ~

Erstellen Sie eine Datei mit dem Namen


chain_mock_htc_sync.sh

folgendes enthalten:



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

ausführbar machen


chmod +x chain_mock_htc_sync.sh

Erstellen Sie eine weitere Datei mit dem Namen


mock_htc_sync.sh

Folgendes enthalten


#!/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

Ausführbar machen:

chmod +x mock_htc_sync.sh

Hoffentlich sollte ich bald eine schöne aufgeräumte Version als pos haben. (wahrscheinlich morgen).