Запускаем Huawei modem

Здесь буду приводить лишь некоторые нюансы, которые являются нестандартными. После вставки модема смотрим его VID:PID:

$ lsusb 
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 005: ID 12d1:14db Huawei Technologies Co., Ltd. E353/E3131
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Создаём скрипт для автоматического переключения в режим «модема» /etc/udev/rules.d/huawei.rules такого содержания:

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14db", RUN+="/opt/scripts/usb_modem.sh"

Собственно сам скрипт /opt/scripts/usb_modem.sh:

vid="12d1"
pid="14db"
ip_addr="192.168.8.8/24"

MODESWITCH=/usr/sbin/usb_modeswitch
MODPROBE=/sbin/modprobe
AWK=/usr/bin/awk
SED=/bin/sed
IP=/bin/ip
LSUSB=/usr/bin/lsusb

$MODESWITCH -v $vid -p $pid -V $vid -P $pid
$MODPROBE usbserial vendor=${VID} product=${PID}

mac=`$LSUSB -d ${vid}:${pid} -v 2>/dev/null | $SED -n 's/.*\(iMacAddress.*\)/\1/p' | $AWK '{print $3}' | $SED -e 's/\(.*\)/\L\1/'`
eth_if="enx${mac}"
$IP address add $ip_addr dev $eth_if
$IP link set $eth_if up

Немного поясню скрипт.
modeswitch/modeprobe переключаем модем в режим «модема». При этом, как обычно пишут в сети у нас не появятся файлы /dev/ttyUSB*. Вместо этого будет доступен сетевой интерфейс с именем enx{MAC} которому можно сразу назначить IP (какой именно и какие есть нюансы — немного ниже).
— остальная часть основана на присвоении IP

Как понять, что наш модем в режиме «модема»? Нужно взглянуть в логи. Именно туда, а не как советуют на некоторых ресурсах, смотреть, появляются ли файлы /dev/ttyUSB* (в этом случае их не будет вообще). Именно на этом этапе я провёл много времени, когда вроде бы модем переводится в режим «модема», но файлы так и не появляются. Вот как это выглядит в логах (ищем cdc_ether, если есть, значит режим «модема» включился):

[2678463.022547] usb-storage 1-3:1.0: USB Mass Storage device detected
[2678463.023344] scsi host6: usb-storage 1-3:1.0
[2678463.846594] usb 1-3: USB disconnect, device number 4
[2678464.295863] usb 1-3: new high-speed USB device number 5 using ehci-pci
[2678464.457068] usb 1-3: New USB device found, idVendor=12d1, idProduct=14db, bcdDevice= 1.02
[2678464.457073] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[2678464.457075] usb 1-3: Product: HUAWEI_MOBILE
[2678464.457076] usb 1-3: Manufacturer: HUAWEI_MOBILE
[2678464.535385] cdc_ether 1-3:1.0 eth0: register 'cdc_ether' at usb-0000:00:12.2-3, CDC Ethernet Device, 00:1e:10:1f:00:00
[2678464.968525] cdc_ether 1-3:1.0 enx001e101f0000: renamed from eth0

И теперь начинается самое интересное. Если у вас простой роутер, то достаточно получить IP по DHCP на новоиспечённом интерфейсе (в нашем случае это enx001e101f0000):

# dhclient enx001e101f0000

Но у меня пересекались подсети (по дефолту была подсеть 192.168.8.0/24) да и хотелось посмотреть, что там за админка. Как же поменять это? На ум приходит подключиться к DHCP-серверу (в данном случае он 192.168.8.1). Пробуем «потыкать»:

$ curl -I 192.168.222.1
HTTP/1.1 405 
Content-Length: 0
$ curl -s /dev/null 192.168.222.1
...

То есть, страница отдаётся, но я нахожусь за пределами роутера. Простой проброс порта через iptables не сработает, так как там нет подмены src addr и ответ просто не уйдёт ко мне. Нужно было сделать проброс порта с подменой src addr и это можно сделать через redir:

# redir --lport=34897 --laddr=X.X.X.X --cport=80 --caddr=192.168.8.1 &

где laddr/lport — внешние адрес/порт соответственно. Пробую подключиться из-вне через curl — не работает! Что ж за чёрт? Пробуем подключиться через telnet и посмотреть, что происходит:

$ telnet 192.168.8.1 80
Trying 192.168.8.1...
Connected to 192.168.8.1.
Escape character is '^]'.
GET / HTTP/1.1
Host: test.com
User-agent: curl

HTTP/1.1 307
LOCATION: http://192.168.8.1/html/index.html?origin=xxx
Content-Type: text/plain
X-Download-Options: noopen
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval'
X-Content-Type-Options: nosniff
Content-Length: 0

quit

Ага! там идёт редирект на http://192.168.8.1/html/index.html?origin=xxx. Пробуем curl‘ить URL http://X.X.X.X:34897/html/index.html?origin=xxx но тоже ничего не работает. Вооружаемся tcpdump’ом (как позже оказалось, можно было обойтись в telnet сессией с get-запросом) в режиме просмотра пакетов, флаг ‘-X‘ и сравниваем сессии когда из-вне и когда локально с роутера и видим, что когда подключение происходит из-вне, то заголовок Host содержит внешний IP и происходит перенаправление на внутренний IP, то есть в telnet сессии мы получаем всё тот 307 redirect на новый Location.  Пробуем явно подменить:

$ curl -H "Host: 192.168.8.1" http://X.X.X.X:34897/html/index.html

и это сработало! Но через curl явно мы не зайдём в админку )). Берём любой плагин для браузера, который позволяет менять заголовок Host. Я взял «Requestly: Redirect Url, Modify Headers etc» для FF. Вбиваем правило и попадаем в админку без логина/пароля. Дальше уже можно найти пункт меню DHCP и меняем диапазон на нужный.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *