Я пытался заставить обратный модем работать на моем телефоне. У меня есть Galaxy S5 (g900t), работающий под управлением cyanogenmod 13 (marshmallow)... с root-правами и с busybox.
* Редактировать: я добился некоторого прогресса. Я запустил это на своей машине с Ubuntu:
sudo ip addr flush dev eth0
sudo ip addr flush dev usb0
sudo brctl addbr br0
sudo brctl addif br0 eth0 usb0
sudo ip link set dev br0 up
sudo dhclient br0
И затем я запустил это в оболочке adb:
dhcptool rndis0
Я могу сделать wget -s google.com
. Однако он работает только как su
.
root@klte:/ # wget -s google.com
Connecting to google.com (4.59.40.99:80)
Connecting to www.google.com (4.59.40.99:80)
2000@klte:/ $ wget -s google.com
wget: bad address 'google.com'
Я проверил, что могу работать wget
как обычный пользователь, когда я подключен через сотовую сеть или Wi-Fi.
Почему я мог бы получить доступ к Интернету как su
, но не как обычный пользователь? Я проверил свои ifconfig
и route
настройки, и все они выглядят так же, как su
и у обычного пользователя. Кто-нибудь видит, что я делаю неправильно?
Эти настройки одинаковы, независимо от того, запускаю я их su
или нет. Вот мой ifconfig
:
1|root@klte:/ # ifconfig rndis0
rndis0 Link encap:Ethernet HWaddr 62:91:0C:85:FD:6B
inet addr:192.168.22.6 Bcast:192.168.22.255 Mask:255.255.255.0
inet6 addr: fe80::6091:cff:fe85:fd6b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:582 errors:0 dropped:0 overruns:0 frame:0
TX packets:126 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:62495 (61.0 KiB) TX bytes:15839 (15.4 KiB)
А вот моя route
таблица:
root@klte:/ # route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.22.1 0.0.0.0 UG 0 0 0 rndis0
192.168.22.0 * 255.255.255.0 U 0 0 0 rndis0
И похоже, что мои DNS-серверы настроены правильно:
root@klte:/ # cat /etc/resolv.conf
nameserver 8.8.4.4
nameserver 8.8.8.8
Недавно я наткнулся на то, что мне кажется гораздо лучшим (или, по крайней мере, более простым) решением для обратного привязки: gnirehtet
Он устанавливает VPN на Android, который перенаправляет весь трафик через соединение adb reverse
порта. Совсем даже рут не требует.
Я знаю, что отвечаю здесь на старый вопрос, но я столкнулся с той же проблемой с Android Nougat (LineageOS 14.1), и я мог бы опубликовать найденное решение:
Запустите следующее, как root
на телефоне (через adb
) после запуска модема:
dhcptool rndis0
ip rule add from all lookup main pref 99
(команды для запуска на компьютере здесь не обсуждаются, в моем случае мне нужно было modprobe usbnet
и modprobe rndis-host
даже видеть usb0
интерфейс, но это уже совсем другая проблема).
Дело в том, что Android использует довольно сложную настройку маршрутизации с разными таблицами маршрутизации (дамп см. ниже). Команда dhcptool rndis0
помещает соответствующие строки маршрутизации в стандартную main
таблицу маршрутизации, но к main
таблице обращаются только по правилу, которое говорит uidrange 0-0
(то есть для root
). Что делает вторая строка выше, так это принудительно использует main
таблицу маршрутизации для всего. Это должно быть отменено позже с помощью
ip rule del pref 99
Кажется, это работает для меня, но я не уверен, насколько это надежно. Может быть, это слегка ломает что-то, чего я не осознавал. Может быть, есть команда более высокого уровня для Android, которая лучше, и о которой я не знаю.
Напомним, что можно использовать ip rule show
для отображения текущих правил маршрутизации и ip route show table wlan0
для отображения содержимого таблицы wlan0
(скажем).
Для справки, вот правила маршрутизации, которые я нашел на своем Android после настройки модема:
0: from all lookup local
10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system
10500: from all oif wlan0 uidrange 0-0 lookup wlan0
10500: from all oif rndis0 uidrange 0-0 lookup local_network
13000: from all fwmark 0x10063/0x1ffff lookup local_network
13000: from all fwmark 0x10064/0x1ffff lookup wlan0
14000: from all oif wlan0 lookup wlan0
14000: from all oif rndis0 lookup local_network
15000: from all fwmark 0x0/0x10000 lookup legacy_system
16000: from all fwmark 0x0/0x10000 lookup legacy_network
17000: from all fwmark 0x0/0x10000 lookup local_network
18000: from all iif rndis0 lookup wlan0
19000: from all fwmark 0x64/0x1ffff lookup wlan0
22000: from all fwmark 0x0/0xffff lookup wlan0
23000: from all fwmark 0x0/0xffff uidrange 0-0 lookup main
32000: from all unreachable
Я могу просто подтвердить, что «Android 6.0.1» ведет себя так же. Обратный USB-модем работает только для пользователя «root». Для пользовательской оболочки это не работает.
Теперь я использую «оболочку adb.exe» для входа в Android -> su -> ifconfig rndis0 192.168.137.2 маска сети 255.255.255.0 -> route add default gw 192.168.137.1 dev rndis0 Теперь проверьте это:
shell@j5nlte:/ $ su
root@j5nlte:/ #
root@j5nlte:/ # route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.137.1 0.0.0.0 UG 0 0 0 rndis0
192.168.137.0 * 255.255.255.0 U 0 0 0 rndis0
root@j5nlte:/ # wget --s google.com
wget --s google.com
Connecting to google.com (216.58.205.238:80)
Connecting to www.google.de (172.217.20.67:80)
root@j5nlte:/ # exit
shell@j5nlte:/ $ wget --s google.com
wget --s google.com
Тут просто зависает, wget не отвечает и через какое-то время: wget: bad address 'google.com'
Обновление: в реестре измените параметр ICS HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters ScopeAddress "192.168.137.1" => "192.168.42.1"
поскольку Android использует это по умолчанию, как вы можете видеть здесь: shell@j5nlte:/ $ ifconfig rndis0 rndis0 Link encap:Ethernet HWaddr E6:D3:B6:BC:7B:D4 inet addr:192.168.42.129 Bcast:192.168.42.255 Маска: 255.255.255.0
теперь осталась единственная строка для включения обратного USB-модема по крайней мере для root:
route add default gw 192.168.42.1 dev rndis0
Сейчас только экспериментирую с ip route ip route help....
ФД_