Раздаём 3G-интернет от «Мегафона» через DIR-320.
Попался мне на днях 3G-модем «Мегафон» вместе с необходимостью настроить роутер D-Link DIR-320 на работу с этим модемом. Модем на данный момент был одним из последних серий – Huawei E1750.

Основные отличия от предыдущего E1550 – это увеличенная скорость аплоада (с 384 до 5700 kbit/s), даунлоада (с 3600 до 7200 kbit/s) и более низкий пинг.
Теперь опустим технические формальности, еще три страницы истории «как я настраивал модем впервые» (хотя последнее так же достойно отдельной статьи) и перейдем сразу к делу.
Оглавление
Подготовка модема
Начну с подготовки самого модема. Что нам для этого понадобится:
- Относительно свежий дистрибутив Linux (куда же без него).
- Непосредственно сам модем.
- Утилита usb_modeswitch.
- Утилита minicom.
Так как я использую Ubuntu, то все манипуляции буду проводить соответствующим образом.
Для начала установим все необходимое в нашу систему:
~$ sudo aptitude install usb-modeswitch minicom
После установки нам нужно отредактировать файл /etc/usb-modeswitch.conf
~$ sudo vim /etc/usb-modeswitch.conf
вставив в него следующие строки:
DefaultVendor = 0x12d1 DefaultProduct = 0x1446 MessageEndPoint = "0x01" MessageContent = "55534243000000000000000000000011060000000000000000000000000000"
Теперь подключаем наш модем к USB порту, ждем несколько секунд пока он определится и выполняем команду:
~$ sudo usb_modeswitch
Должно появиться нечто следующее:
Looking for target devices ...
No devices in target mode or class found
Looking for default devices ...
Found default devices (1)
Accessing device 004 on bus 007 ...
Using endpoints 0x01 (out) and 0x81 (in)
Inquiring device details; driver will be detached ...
Looking for active driver ...
OK, driver found ("usb-storage")
OK, driver "usb-storage" detached
SCSI inquiry data (for identification)
-------------------------
Vendor String: HUAWEI
Model String: Mass Storage
Revision String: 2.31
-------------------------
USB description data (for identification)
-------------------------
Manufacturer: HUAWEI Technology
Product: HUAWEI Mobile
Serial No.: not provided
-------------------------
Setting up communication with interface 0 ...
Trying to send the message to endpoint 0x01 ...
OK, message successfully sent
Device is gone, skipping any further commands
-> Run lsusb to note any changes. Bye.
Если все сделано правильно, то в /dev будут несколько новых USB-девайсов:
~$ ls /dev | grep ttyUSB ttyUSB0 ttyUSB1 ttyUSB2
Хорошо. Теперь очередь за minicom
~$ minicom -s
После запуска программы, откроется меню конфигурации. В нем выбираем опцию «Настройка последовательного порта» и жмем «Enter«.
В появившемся окне изменения настроек жмем клавишу «A» для изменения последовательного порта. Вместо того, что там написано, вводим /dev/ttyUSB0 и жмем «Enter«.
Теперь дважды нажимаем «Esc» и ждем пока наш модем будет инициализирован:
Добро пожаловать в minicom 2.4 ПАРАМЕТРЫ: I18n Дата компиляции Jan 25 2010, 06:49:09. Port /dev/ttyUSB0 Нажмите CTRL-A Z для получения подсказки по клавишам AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0 OK
Проверяем реакцию модема на команды, введя «AT» и нажав «Enter«. Если все нормально, то получим ответ от модема «OK«.
Следующим пунктом навсегда отключаем эмуляцию CD-ROM на модеме. Для этого вводим команду «AT^U2DIAG=0» и жмем «Enter«. После этого должен прийти ответ от модема «OK» означающий, что модем переведен в режим «только модем».
Теперь жмем «Ctrl+A,Q» на клавиатуре. Появится меню «Выйти без сброса?» на который отвечаем утвердительно и выходим из программы.
На этом с модемом закончим.
Список известных мне команд
AT^U2DIAG=0 (устройство в режиме только модем) AT^U2DIAG=1 (устройство в режиме модем + CD-ROM) AT^U2DIAG=255 (устройство в режиме модем + CD-ROM + Card Reader)
Подготовка роутера
Вот и подошла очередь нашего WiFi-роутера. Для него нам понадобится альтернативная прошивка WL-500gpv2 «от Олега». Взять свежую можно тут. На момент написания статьи это версия 1.9.2.7-d-r1445.
Не лишним будет сказать, что прошивка DIR-320 заняла у меня довольно много времени. Дело в том, что на прошивку этого девайса дается около двух секунд после включения питания. Не совру если скажу, что поначалу пытался поймать нужный промежуток более 50 раз, но зато теперь выработал стопроцентный алгоритм. :)
Не сомневаюсь, что есть много других способов прошивки. Можете поделиться своими проверенными в комментариях.
Теперь о самом процессе.
Для прошивки нам понадобится tftp-клиент. Я использовал atftp
~$ sudo aptitude install atftp
Следующим шагом соединяем наш компьютер с роутером через кабель и выставляем на компьютере сетевой адрес 192.168.0.2.
Установка статичного адреса в Ubuntu с установленным KNetworkManager, который был настроен на DHCP вызвала у меня некоторые затруднения. Этот аплет постоянно переподключал сеть при перезагрузке роутера, из-за чего я не мог попасть в двухсекундный промежуток для прошивки. Пришлось «убить» этот процесс и выключить демон network-manager
~$ sudo invoke-rc.d network-manager stopзатем прописать в /etc/network/interfaces
auto eth0 iface eth0 inet static address 192.168.0.2 netmask 255.255.255.0и «поднять» интерфейс обычным
~$ sudo ifup eth0
Теперь нам нужно подготовить прошивку.
Делаем cd в директорию с прошивкой, вводим в консоль
~$ atftp -l ./WL500gpv2-1.9.2.7-d-r1445.trx -p 192.168.0.1
но «Enter» не жмем, пока только вводим.
Держа наготове открытую консоль с этой командой, отключаем питание роутера на пару секунд и включаем вновь, внимательно следя за индикатором порта в который вставлен кабель.
Как только индикатор загорится, моментально нажимаем в консоли «Enter«, отправляя введенную ранее команду atftp. Если все сделано правильно, то индикатор начнет мигать с высокой частотой, что означает: процесс прошивки начался (как вариант, можно добавить опцию –trace к atftp, тогда прогресс прошивки будет отображаться в консоли).
Теперь остается только ждать окончания прошивки. У меня ожидание заняло около двух минут, по окончанию которых роутер сам себя перезагрузил (можно наблюдать на индикаторах) и начал работать в штатном режиме с новой прошивкой.
Настройка подключения
Дело осталось за малым – настроить модемное соединение на роутере.
Для этого нам понадобится только telnet, который присутствует в большинстве базовых конфигураций дистрибутива. Если его нет, устанавливаем:
~$ sudo aptitude install telnet
Перед запуском telnet выставляем на компьютере любой сетевой адрес из диапазона 192.168.1.0/24 (кроме .0, .1 и .255, естественно). Можно и через DHCP – теперь роутер сам выдаст нам нужный адрес. Допустим, это будет адрес 192.168.1.2.
Запускаем telnet, вводим логин и пароль (admin:admin по-умолчанию) и попадаем в консоль маршрутизатора (далее все команды вводим в эту консоль):
$ telnet 192.168.1.1 Trying 192.168.1.1... Connected to 192.168.1.1. Escape character is '^]'. (none) login: admin Password: [admin@(none) root]$
Проверяем как определился наш модем, запустив
tail -f /usr/tmp/syslog.log
Вставляем модем в USB порт и через пару секунд в логе должны появиться примерно следующие строки:
Jan 1 00:11:14 kernel: hub.c: new USB device 00:03.0-1, assigned address 2 Jan 1 00:11:14 kernel: usb.c: USB device 2 (vend/prod 0x12d1/0x1001) is not claimed by any active driver
Если vend/prod определилось как 0x12d1/0×1001, то все в порядке. Модем работает как нам и нужно в режиме «только модем». Если вместо 0×1001 другие цифры, например 0×1446, что означает работу модема в заводском режиме, то вы сделали что-то не так на шаге подготовки модема.
Подключаем модуль для работы с нашим модемом
insmod usbserial vendor=0x12d1 product=0x1001
и проверяем наличие новых девайсов
ls -l /dev/usb/tts/* crw------- 1 admin root 188, 0 Jan 1 00:00 /dev/usb/tts/0 crw------- 1 admin root 188, 1 Jan 1 00:00 /dev/usb/tts/1 crw------- 1 admin root 188, 2 Jan 1 00:00 /dev/usb/tts/2
Выше видно, что у нас появилось три новых девайса /dev/usb/tts/[0-2]. Работать будем с /dev/usb/tts/0.
Если все в порядке, перейдем непосредственно к настройке подключения.
Создадим директорию /tmp/ppp/peers:
mkdir /tmp/ppp/peers
Пропишем в файле /tmp/ppp/peers/dialup необходимые настройки модема, выполнив в консоли ряд команд:
echo "debug" > /tmp/ppp/peers/dialup echo "/dev/usb/tts/0" >> /tmp/ppp/peers/dialup echo "460800" >> /tmp/ppp/peers/dialup echo "crtscts" >> /tmp/ppp/peers/dialup echo "noipdefault" >> /tmp/ppp/peers/dialup echo "ipcp-accept-local" >> /tmp/ppp/peers/dialup echo "lcp-echo-interval 60" >> /tmp/ppp/peers/dialup echo "lcp-echo-failure 5" >> /tmp/ppp/peers/dialup echo "usepeerdns" >> /tmp/ppp/peers/dialup echo "noauth" >> /tmp/ppp/peers/dialup echo "persist" >> /tmp/ppp/peers/dialup echo "nodetach" >> /tmp/ppp/peers/dialup echo "user ''" >> /tmp/ppp/peers/dialup echo "password ''" >> /tmp/ppp/peers/dialup echo "connect \"/usr/sbin/chat -s -S -V -t 60 -f /tmp/ppp/dialup.chat 2>/tmp/chat.log\"" >> /tmp/ppp/peers/dialup
Проверим что у нас получилось, не пропуская ни одной кавычки:
cat /tmp/ppp/peers/dialup
Вывод должен выглядеть следующим образом:
debug /dev/usb/tts/0 460800 crtscts noipdefault ipcp-accept-local lcp-echo-interval 60 lcp-echo-failure 5 usepeerdns noauth persist nodetach user '' password '' connect "/usr/sbin/chat -s -S -V -t 60 -f /tmp/ppp/dialup.chat 2>/tmp/chat.log"
Править файлы можно консольным редактором vi, который присутствует в данной прошивке. Например
vi /tmp/ppp/peers/dialupоткроет файл /tmp/ppp/peers/dialup в этом редакторе.
Клавиша «i» переведет редактор в режим редактирования.
«Esc» – выход из режима редактирования.
«:qw» – выход с сохранением.
«:q!» – выход без сохранения.
Теперь настроим файл /tmp/ppp/dialup.chat так же выполнив ряд консольных команд:
echo "'' ''" > /tmp/ppp/dialup.chat echo "'' 'ATZ'" >> /tmp/ppp/dialup.chat echo "'' 'AT+CGDCONT=1,"IP","internet"'" >> /tmp/ppp/dialup.chat echo "'OK' 'ATD *99#'" >> /tmp/ppp/dialup.chat echo "'CONNECT' ''" >> /tmp/ppp/dialup.chat
Проверим что у нас получилось:
[admin@(none) root]$ cat /tmp/ppp/dialup.chat '' '' '' 'ATZ' '' 'AT+CGDCONT=1,IP,internet' 'OK' 'ATD *99#' 'CONNECT' ''
Если все верно, закрепим результат выполнив еще несколько команд:
echo /tmp/ppp/peers/dialup > /tmp/local/.files echo /tmp/ppp/dialup.chat >> /tmp/local/.files flashfs save && flashfs commit && flashfs enable
Последняя строка запишет все наши изменения в память роутера, чтобы они остались после перезагрузки. Результатом её выполнения будет примерно следующее:
tar: removing leading '/' from member names tmp/local/ tmp/local/.files tmp/local/root/ tmp/ppp/peers/dialup tmp/ppp/dialup.chat -rw-r--r-- 1 admin root 451 Jan 1 00:11 /tmp/flash.tar.gz Check saved image and type "/sbin/flashfs commit" to commit changes . Committed.
Теперь можно перезагрузить маршрутизатор отправив в консоль команду
reboot
Ждем порядка 20 секунд и вновь заходим в консоль с помощью telnet
~$ telnet 192.168.1.1 Trying 192.168.1.1... Connected to 192.168.1.1. Escape character is '^]'. (none) login: admin Password: [admin@(none) root]$
После входа в консоль роутера выполняем
insmod usbserial vendor=0x12d1 product=0x1001
и
pppd call dialup
В консоли должно появиться много строк примерно следующего содержания
Script /usr/sbin/chat -s -S -V -t 60 -f /tmp/ppp/dialup.chat 2>/tmp/chat.log finished (pid 104), status = 0x0 Serial connection established. using channel 1 Using interface ppp0 Connect: ppp0 <--> /dev/usb/tts/0 sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x9faec1e2> <pcomp> <accomp>] rcvd [LCP ConfReq id=0x0 <asyncmap 0x0> <auth chap MD5> <magic 0x102357d> <pcomp> <accomp>] No auth is possible sent [LCP ConfRej id=0x0 <auth chap MD5>] rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x9faec1e2> <pcomp> <accomp>] rcvd [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x102357d> <pcomp> <accomp>] sent [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x102357d> <pcomp> <accomp>] sent [LCP EchoReq id=0x0 magic=0x9faec1e2] sent [CCP ConfReq id=0x1 <mppe -H -M -S -L -D +C> <deflate 15> <deflate(old#) 15> <bsd v1 15>] sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>] rcvd [LCP DiscReq id=0x2 magic=0x102357d] rcvd [LCP EchoRep id=0x0 magic=0x102357d 9f ae c1 e2] rcvd [LCP ProtRej id=0x3 80 fd 01 01 00 15 12 06 00 00 00 01 1a 04 78 00 18 04 78 00 15 03 2f] Protocol-Reject for 'Compression Control Protocol' (0x80fd) received rcvd [IPCP ConfNak id=0x1 <ms-dns1 10.11.12.13> <ms-dns2 10.11.12.14> <ms-wins 10.11.12.13> <ms-wins 10.11.12.14>] sent [IPCP ConfReq id=0x2 <compress VJ 0f 01> <addr 0.0.0.0> <ms-dns1 10.11.12.13> <ms-dns2 10.11.12.14> <ms-wins 10.11.12.13> <ms-wins 10.11.12.14>] rcvd [IPCP ConfReq id=0x0] sent [IPCP ConfNak id=0x0 <addr 0.0.0.0>] rcvd [IPCP ConfRej id=0x2 <compress VJ 0f 01> <ms-wins 10.11.12.13> <ms-wins 10.11.12.14>] sent [IPCP ConfReq id=0x3 <addr 0.0.0.0> <ms-dns1 10.11.12.13> <ms-dns2 10.11.12.14>] rcvd [IPCP ConfReq id=0x1] sent [IPCP ConfAck id=0x1] rcvd [IPCP ConfNak id=0x3 <addr 10.248.41.100> <ms-dns1 83.149.19.123> <ms-dns2 83.149.19.124>] sent [IPCP ConfReq id=0x4 <addr 10.248.41.100> <ms-dns1 83.149.19.123> <ms-dns2 83.149.19.124>] rcvd [IPCP ConfAck id=0x4 <addr 10.248.41.100> <ms-dns1 83.149.19.123> <ms-dns2 83.149.19.124>] Could not determine remote IP address: defaulting to 10.64.64.64 local IP address 10.248.41.100 remote IP address 10.64.64.64 primary DNS address 83.149.19.123 secondary DNS address 83.149.19.124 Script /tmp/ppp/ip-up started (pid 107) Script /tmp/ppp/ip-up finished (pid 107), status = 0x0
и произойти подключение интернета через модем (синяя лампочка на модеме будет постоянно гореть).
Проверяем интернет, загрузив на компьютере браузер и посетив несколько сайтов.
Отлично. Теперь разорвем подключение комбинацией «Ctrl+C» в консоли и пропишем подключение через модем в автозагрузку роутера:
Выполним несколько команд:
mkdir /tmp/local/sbin echo "#!/bin/sh" > /tmp/local/sbin/post-boot echo "insmod usbserial vendor=0x12d1 product=0x1001" >> /tmp/local/sbin/post-boot echo "sleep 10" >> /tmp/local/sbin/post-boot echo "pppd call dialup" >> /tmp/local/sbin/post-boot chmod +x /tmp/local/sbin/post-boot
и проверим что получилось:
[admin@(none) root]$ cat /tmp/local/sbin/post-boot #!/bin/sh insmod usbserial vendor=0x12d1 product=0x1001 sleep 10 pppd call dialup
Если все верно, запишем результат в память маршрутизатора:
flashfs save && flashfs commit && flashfs enable
На этом все. Попытка подключения интернета через модем теперь будет происходить автоматически после перезагрузки роутера.
Эпилог
Теперь у нас есть рабочий WiFi-роутер, способный раздавать не только проводной интернет, но так же интернет от 3G USB-модема «Мегафон» и интернет от 4G-модемов WiMAX (последнее включается в web-админке роутера).
Напоследок скажу, что я в курсе существующих «альтернативных» прошивок для DIR-320 в которых подключение можно настроить проще (некоторые имеют встроенный usb-modeswitch и даже 3G-настройки в панели web-администрирования), но в силу ряда причин первое рабочее подключение у меня получилось именного с данной конфигурацией, которой я и решил поделиться.
Думаю, что руководство подойдет ко всей линейке маршрутизаторов ASUS WL-500gx / WL-550gE / WL-500gp / WL-500W / WL-320gE / WL-320gP / WL-330gE / WL-500gp V2 / WL-520gU за исключением способа прошивки.
Полезные ссылки
- Отключение эмуляции CD-ROM на модеме.
- Настройка 3G-интернета на DIR-320.
- Использование HTML-тега <a></a> (вспоминал как ставить «якорь»)
- Управление редакциями записей в WordPress. (Revision Control сокращает количество редакций)


