Здесь буду приводить лишь некоторые нюансы, которые являются нестандартными. После вставки модема смотрим его 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 и меняем диапазон на нужный.