Как вы настраиваете интернет-транзитную (обратную связь) на Linux?


19

У меня есть HTC Desire S, у которого есть возможность подключиться через USB и использовать подключение к Интернету на компьютере. Это хорошо работает на Windows, но я изо всех сил пытаюсь настроить его в Ubuntu. Когда я подключаюсь и выбираю сквозной доступ в Интернет из меню usb, создается устройство usb1, и я могу пропинговать его IP-адрес. Я пробовал различные конфигурации iptables и настройку nat, но я не уверен, правильно ли я это делаю или нужна какая-то дополнительная конфигурация ...

Спасибо за любую помощь.


Я получил его, используя комбинацию информации с trac.osuosl.org/trac/replicant/wiki/ReplicantUSBNetworking и translate.googleusercontent.com/… . Ответ ниже.
блюграй

Ответы:


11

Следующее работает какое-то время, но только для браузера.

Когда вы подключаете свой телефон через USB и выбираете сквозную передачу через Интернет, вы должны получить новое устройство RNDIS (usb0 или usb1). Для Ubuntu отредактируйте / etc / network / interfaces и добавьте следующие строки:

iface usb0 inet dhcp
iface usb1 inet dhcp

Это назначит IP автоматически при добавлении устройства. Если сетевой адрес не назначен автоматически для usb0 или usb1, вы должны сделать это вручную.

Затем вам нужно настроить NAT на вашем компьютере с Linux. Что-то вроде:

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

Вам также нужен DNS-сервер:

sudo apt-get install bind9

Это работает в течение нескольких минут, но через некоторое время телефон перестает искать HTC Sync и отключается.

Для рутованных телефонов

Вы можете подключиться постоянно, если у вас есть рутированный телефон (у меня работает fre3vo). Выполните следующее с помощью ADB.

Включите режим USB для сети и ADB:

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

Назначьте IP на устройство usb0 на телефоне:

adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up

Добавить маршрут по умолчанию. IP должен быть IP, назначенным для usb0 в Linux:

adb shell route add default gw 192.168.99.1 dev usb0

Установите DNS-сервер. Это открытый DNS-сервер Google, но это может быть IP-адрес вашего компьютера с Linux, если у вас есть DNS-сервер:

adb shell setprop net.dns1 8.8.8.8

2
Согласно легенде, вы можете подделать синхронизацию HTC, выполнив следующие действия: На телефонах HTC, когда вы подключаете usb и выбираете сквозную передачу через Интернет, он ожидает синхронизации HTC и сдается. Он прослушивает порт 6000. Так что вам нужно только подделать синхронизацию HTC с netcat. Попробуйте это в командной строке: phoneip=$(arp -n | grep usb | awk '{print $1}') echo -n -e "\x00\x02\x00\x00" | nc $phoneip 6000 > /dev/null шестнадцатеричное значение 00 02 00 00- это все, что он ищет.
Geffchang

@geffchang, спасибо! Для пользователей Windows, когда мобильное устройство пытается подключиться через USB, вы можете запустить, netsh interface ip show configчтобы увидеть все имена интерфейсов, а затем netsh interface ip show config name="Local Area Connection #2"получить только тот интерфейс, Local Area Connection #2который будет вызывать новый адаптер. Вы можете переименовать это для удобства.
Сэм Хаслер,

3

А сделал этот маленький удар для автоматизации всего. Просто подключите свой телефон в режиме зарядки к компьютеру и запустите этот 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

0

Поскольку у меня нет доступа к Linux-машине, я не могу протестировать это решение, но вы можете попробовать описанные здесь шаги (перевод на русский) .

Комментарии к переводу:

  • "рутованый" означает укоренившийся;
  • WB или BB означает Big Brother (рабочий стол);
  • Смарта это аббревиатура от "смартфон".

Удачи!


Спасибо, но есть более простой способ, чем соединение интерфейсов.
блюграй

0

Хорошо, вот что я сделал, рутирование HTC не требуется:

Настройка bind9, NAT и т.д ...

примечание: 1: если вы просто выполните sudo echo 1> / proc / sys / net / ipv4 / ip_forward, вы получите ошибку с правами доступа, поэтому вот сценарий для процесса 2: вы можете сделать iptables более конкретным, как он это делает, добавление параметров для конкретных устройств.


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

Теперь подключите ваш телефон и выберите «Интернет через»

дождитесь появления устройства в: ifconfig проверьте это также в: arp

Я обнаружил, что мне пришлось отключить устройство, а затем снова подключить его, чтобы оно появилось в arp, все не работает должным образом, если arp не показывает устройство.

Затем устройство будет ждать, пока HTC Sync отправит ему сообщение, поэтому вам нужно смоделировать сообщение 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

Я могу написать версию этого, используя D-Bus, чтобы последняя часть выполнялась автоматически, когда устройство подключено и т. Д ....

Хорошо, вот моя работа в процессе, я не смог найти ничего «общего» на d-bus, поэтому я выбрал немного хакерское решение, используя udev .. Это не идеально, например, команда запускается дважды, поэтому я Посмотрим, смогу ли я немного лучше отфильтровать соответствующие параметры, также добавлю тайм-аут в последнем скрипте, просто добавлю и посмотрим, смогу ли я заменить arp чем-то лучше, скажем, посмотрев в / proc

здесь. мой файл .rules из /etc/udev/rules.d, который я создал


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

Вы можете называть это как угодно, но НЕ НАЧИНАЙТЕ ЕГО НОМЕРОМ, чтобы он запускался последним из всех.

Добавьте следующее в файл как sudo, используя редактор по вашему выбору и т.д ....


#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

По сути, если вы не видите эти 3 'R,


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

Затем вам понадобятся еще два файла, один для цепочки другого, так как RUN от udev заблокирует все остальное (даже если он запускается последним !!) ... хм ... в любом случае:

Я создал файлы в своем домашнем каталоге на данный момент "/ home / olli /" ... поэтому не забудьте заменить бит / home / olli / на любой, где вы создаете файлы:

так что для меня, перейдите в мой домашний каталог.


cd ~

создать файл с именем


chain_mock_htc_sync.sh

содержащий следующее:



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

сделать его исполняемым


chmod +x chain_mock_htc_sync.sh

создать другой файл с именем


mock_htc_sync.sh

связавшись со следующим


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

Сделайте его исполняемым:

chmod +x mock_htc_sync.sh

Надеюсь, у меня скоро будет хорошая приведенная в порядок версия. (наверное завтра).


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.