Bagaimana Anda mengatur pass-through internet (reverse-tether) di linux?

19

Saya memiliki HTC Desire S yang memiliki opsi untuk terhubung melalui usb, dan menggunakan koneksi internet komputer. Ini berfungsi dengan baik di Windows, tapi saya kesulitan untuk mengaturnya di Ubuntu. Ketika saya mencolokkan dan memilih pass-through internet dari menu usb, perangkat usb1 dibuat dan saya dapat melakukan ping ke alamat ipnya. Saya telah mencoba berbagai konfigurasi iptables dan mengatur nat, tetapi saya tidak yakin apakah saya melakukannya dengan benar, atau jika perlu ada beberapa konfigurasi tambahan ...

Terima kasih atas bantuannya.

bluegray
sumber
Saya berhasil menggunakan kombinasi info dari trac.osuosl.org/trac/replicant/wiki/ReplicantUSBNetworking dan translate.googleusercontent.com/… . Jawab di bawah.
bluegray

Jawaban:

11

Berikut ini berfungsi untuk sementara waktu, tetapi hanya untuk browser.

Ketika Anda mencolokkan telepon Anda melalui usb dan memilih akses Internet, Anda harus mendapatkan perangkat RNDIS baru (usb0 atau usb1). Untuk ubuntu, edit / etc / network / interfaces dan tambahkan baris berikut:

iface usb0 inet dhcp
iface usb1 inet dhcp

Ini akan menetapkan IP secara otomatis ketika perangkat ditambahkan. Jika alamat jaringan tidak ditetapkan secara otomatis ke usb0 atau usb1, Anda harus melakukannya secara manual.

Maka Anda perlu mengatur NAT di komputer linux Anda. Sesuatu seperti:

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

Anda juga memerlukan server DNS:

sudo apt-get install bind9

Ini berfungsi selama beberapa menit, tetapi setelah beberapa saat ponsel menyerah mencari HTC Sync dan terputus.

Untuk ponsel yang di-rooting

Anda dapat terhubung secara permanen jika Anda memiliki telepon yang telah di-rooting (fre3vo berfungsi untuk saya). Jalankan yang berikut dengan adb.

Aktifkan mode usb untuk jaringan dan adb:

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

Tetapkan IP ke perangkat USB0 di telepon:

adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up

Tambahkan rute default. IP harus IP yang ditugaskan untuk usb0 di linux:

adb shell route add default gw 192.168.99.1 dev usb0

Atur server DNS. Ini adalah server DNS terbuka Google, tetapi ini bisa menjadi IP komputer linux Anda jika Anda memiliki server DNS:

adb shell setprop net.dns1 8.8.8.8
bluegray
sumber
2
Menurut legenda, Anda dapat memalsukan sinkronisasi HTC dengan melakukan hal berikut: Pada ponsel HTC, ketika Anda mencolokkan usb dan memilih internet passthrough, ia menunggu sinkronisasi HTC dan menyerah. Sedang mendengarkan pada port 6000. Jadi Anda hanya perlu memalsukan sinkronisasi HTC dengan netcat. Coba ini di baris perintah: phoneip=$(arp -n | grep usb | awk '{print $1}') echo -n -e "\x00\x02\x00\x00" | nc $phoneip 6000 > /dev/null Nilai hex dari 00 02 00 00semua yang dicari.
geffchang
@geffchang, Terima kasih! Untuk pengguna windows, ketika ponsel mencoba terhubung melalui USB, Anda dapat berlari netsh interface ip show configuntuk melihat semua nama antarmuka, dan kemudian netsh interface ip show config name="Local Area Connection #2"mendapatkan antarmuka itu, di mana Local Area Connection #2pun adaptor baru dipanggil. Anda dapat mengganti nama ini untuk kenyamanan.
Sam Hasler
3

A membuat bash kecil ini untuk mengotomatisasi semua. Cukup hubungkan ponsel Anda dalam mode pengisian daya ke komputer Anda dan jalankan bash ini.

#!/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
DMS
sumber
0

Karena saya sendiri tidak memiliki akses ke mesin Linux, saya tidak dapat menguji solusi ini tetapi Anda dapat mencoba langkah-langkah yang dijelaskan di sini (terjemahan Google dari bahasa Rusia) .

Komentar untuk terjemahan:

  • "rutovanym" berarti di-root;
  • WB atau BB berarti Big Brother (desktop);
  • smarta adalah kependekan dari "smartphone".

Semoga berhasil!

tidak tidur
sumber
Terima kasih, tapi ada cara yang lebih mudah daripada menjembatani antarmuka.
bluegray
0

Ok, inilah yang saya lakukan, tidak ada rooting dari HTC yang diinginkan:

Setup bind9 dan NAT dll ...

catatan: 1: jika Anda hanya melakukan sudo echo 1> / proc / sys / net / ipv4 / ip_forward Anda akan mendapatkan kesalahan izin, jadi inilah skrip untuk proses 2: Anda dapat membuat iptables lebih spesifik tentang bagaimana ia mengerjakan sesuatu dengan menambahkan parameter untuk perangkat tertentu.


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

sekarang tancapkan telepon Anda dan pilih 'akses internet'

tunggu hingga perangkat muncul: ifconfig periksa juga di: arp

Saya menemukan saya harus mencabut perangkat kemudian colokkan lagi untuk muncul di arp, hal-hal tidak berfungsi dengan baik jika arp tidak menunjukkan perangkat.

Perangkat kemudian akan duduk menunggu HTC Sync untuk mengirim pesan sehingga Anda harus mengejek pesan 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

Saya dapat menulis versi ini menggunakan D-Bus sehingga bagian terakhir dijalankan secara otomatis ketika perangkat dicolokkan dll ...

Ok inilah pekerjaan saya yang sedang berjalan, saya tidak dapat menemukan apa pun 'generik' di d-bus jadi saya memilih sedikit solusi hack menggunakan udev .. Ini tidak sempurna, misalnya perintah dijalankan dua kali, jadi saya Saya harus melihat apakah saya bisa memfilter parameter pencocokan sedikit lebih baik, juga menambahkan batas waktu pada skrip terakhir, hanya memetikan dan melihat apakah saya dapat mengganti arp dengan sesuatu yang sedikit lebih baik, katakanlah mencari di / proc

here.s file .rules saya dari /etc/udev/rules.d yang saya buat


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

Anda dapat menyebutnya apa pun yang Anda suka, tetapi JANGAN MULAI DENGAN NOMOR, dengan begitu ia akan menjadi yang terakhir.

Tambahkan berikut ini ke file sebagai sudo menggunakan editor pilihan Anda dll ...


#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

Pada dasarnya, jika Anda tidak melihat 3 r,


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

Maka Anda akan memerlukan dua file lebih lanjut, satu untuk rantai yang lain, karena RUN dari udev akan memblokir semua yang lain (meskipun itu berjalan terakhir !!) ... hmm ... bagaimanapun:

Saya membuat file di direktori home saya untuk saat ini "/ home / olli /" ... jadi ingatlah untuk mengganti bit '/ home / olli /' dengan dimanapun Anda membuat file:

jadi bagi saya, cd ke direktori home saya.


cd ~

buat file bernama


chain_mock_htc_sync.sh

berisi yang berikut ini:



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

membuatnya bisa dieksekusi


chmod +x chain_mock_htc_sync.sh

buat file lain bernama


mock_htc_sync.sh

containg berikut ini


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

Jadikan itu dapat dieksekusi:

chmod +x mock_htc_sync.sh

Mudah-mudahan saya harus memiliki versi merapikan bagus segera sebagai pos. (mungkin besok).

pengguna2330377
sumber
0

Untuk Usb Reverse Tethering dengan Android dan Linux tanpa rooting, lihat jawaban saya di sini

salutepc
sumber