Всплыл теоретический вопрос на днях, можно ли запасной канал на серверах контор делать с помощью МТСовского или, там, Мегафоновского брелка, какие продают под брендами а-ля «МТС Коннект»? В теории всё просто: купил этот USB-модемчик, воткнул его в сервер, создался какой-то интерфейс, получился какой-то айпишник, и при желании можно в него роутить и натить конторскую сеть. На практике всё не так просто.

В общем, я взял для экспериментов МТСовский модем, который на самом деле ни что иное как HUAWEI E1550, о чем там мелкими буквами на корпусе и написано. Стандартная проблема, на которую все такие экспериментаторы натыкаются, чего нагуглить можно тысячи страниц форумов, обсуждения на которых обычно заканчивается ничем: модем этот определяется как угодно, но только не как модем. Втыкая этот стик в USB-порт сервера получаем обычно примерно следующее:

umass0: <HUAWEI Technology HUAWEI Mobile, class 0/0, rev 2.00/0.00, addr 2> on usbus4
umass0:  SCSI over Bulk-Only; quirks = 0x0000
umass0:0:0:-1: Attached to scbus0
umass1: <HUAWEI Technology HUAWEI Mobile, class 0/0, rev 2.00/0.00, addr 2> on usbus4
umass1:  SCSI over Bulk-Only; quirks = 0x0000
(probe0:umass-sim0:0:0:0): TEST UNIT READY. CDB: 0 0 0 0 0 0
(probe0:umass-sim0:0:0:0): CAM status: SCSI Status Error
(probe0:umass-sim0:0:0:0): SCSI status: Check Condition
(probe0:umass-sim0:0:0:0): SCSI sense: NOT READY asc:3a,0 (Medium not present)
cd0 at umass-sim0 bus 0 scbus0 target 0 lun 0
cd0: <HUAWEI Mass Storage 2.31> Removable CD-ROM SCSI-2 device
cd0: 40.000MB/s transfers
cd0: Attempt to query device size failed: NOT READY, Medium not present
umass1:1:1:-1: Attached to scbus1
(probe0:umass-sim1:1:0:0): TEST UNIT READY. CDB: 0 0 0 0 0 0
(probe0:umass-sim1:1:0:0): CAM status: SCSI Status Error
(probe0:umass-sim1:1:0:0): SCSI status: Check Condition
(probe0:umass-sim1:1:0:0): SCSI sense: NOT READY asc:3a,0 (Medium not present)
da0 at umass-sim1 bus 1 scbus1 target 0 lun 0
da0: <HUAWEI MMC Storage 2.31> Removable Direct Access SCSI-2 device
da0: 40.000MB/s transfers
da0: Attempt to query device size failed: NOT READY, Medium not present

То есть как сидиром — да, как флэшка — да, как модем — нет. Забавно, по-моему. По всему судя модем таким образом пытается отдать со своей встроенной флэш-памяти любым доступным образом свои драйверы под Windows, но, честно говоря, смонтировать эту флэшку ни под фрёй, ни под виндой у меня не вышло, да особо и не надо было. В общем обыкновенный тупик на форумах по этому вопросу следующий: модем надо перевести в режим, собственно, модема, для чего нужно использовать <u>линуксовую</u> программу usb_modeswitch. Программа действительно очень линуксовая, предлагает устанавливать конфиг прямо в /etc, рекомендует использовать команду lsusb (которой во фре разумеется нет) — всё это можно игнорировать. В общем программу надо для начала скачать в исходниках и собрать под фрю, это минутка. Качаем тут: http://www.draisberghof.de/usb_modeswitch/
на момент написания статьи последней версией была 1.1.9, соотвественно я скачал http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-1.1.9.tar.bz2
Распаковываем и делаем make. make install делать не надо, дабы во-первых не засорять систему, а во-вторых, чтобы это сделать, надо крепко править Makefile чтобы избавиться от линуксовости, так что забиваем на инсталл, так даже удобнее, программа будет искать свой конфиг не где-то, а непосредственно в директории сборки. На выходе получаем usb_modeswitch — бинарник, и usb_modeswitch.conf — конфиг. Ну и вот, в конфиг надо добавить следующую информацию, соотвествующую модему:

DefaultVendor=0x12d1
DefaultProduct=0x1446

TargetVendor=0x12d1
TargetProduct=0x1001

То есть мы переводим девайс вендора 0x12d1 из режима 0x1446 в режим 0x1001, эти параметры соответствуют указанному мной модему, так что если вы тоже экспериментируете с сабжем, то менять и искать ничего не надо, копипаста вполне сработает. Далее даём такую команду:

./usb_modeswitch -H -с usb_modeswitch.conf

-H в данном случае указывает, что надо сделать изменения способом, характерным именно для устройств фирмы Huawei. Программа выдаст всякую разную информацию, может даже ругнуться, но всё это уже совершенно не важно, потому что дело она своё сделает. Далее, модем надо вытащить. Дело в том, что нам понадобится фрёвый драйвер USB-3G-модемов, и почему-то если загрузить его, как любой драйвер, моментального обнаружения устройства не происходит, и нужные ноды в /dev не создаются, не знаю, почему так, обычно это срабатывает, но не в данном случае. В общем вытаскиваем модем, уже переключенный в режим модема, и даём команду kldload u3g, можно сразу прописать строчку u3g_load=»YES» в /boot/loader.conf чтобы после каждого ребута этого не делать. Теперь модем можно вставить обратно, драйвер секунд 10 подумает и кроме уже упомянутой шелухи про cd и da напишет в dmesg еще нечто такое:

u3g0: <HUAWEI Technology HUAWEI Mobile, class 0/0, rev 2.00/0.00, addr 2> on usbus4
u3g0: Found 3 ports.

А в /dev должно будет появиться несколько новых нод: cuaU0.0 и иже с ними. Не путайте cuau0 и cuaU0.0 — это разные вещи, должны быть именно большая буква U и две цифры через точку. Ура, теперь модем работает как модем. Можно начать стандартную модемную процедуру коннекта. Создадим файлик /etc/ppp/ppp.conf — он у вас наверняка уже есть, забэкапьте его и создайте новый, пустой. И поместите в него конфиг. Мой конфиг работает для новосибирского МТСа, но вроде как конфиги МТСа по всей стране одинаковые. Мегафоновский и Билайновский в принципе тоже отличаются только адресов прокси, у МТСа это internet.mts.ru, у Билайна  internet.beeline.ru, а Мегафона просто internet. В общем у вас в /etc/ppp/ppp.conf должно получиться нечто вот такое:

default:
enable force-scripts
set device /dev/cuaU0.0
ident user-ppp VERSION (built COMPILATIONDATE)

set log Phase Chat LCP IPCP CCP tun command

set speed 460800
set timeout 0
set phone «*99***1#»
set authname mts
set authkey mts
set login

disable pap
disable chap
disable ipv6cp

set dial «ABORT BUSY TIMEOUT 10 \
\»\» \
AT OK-AT-OK \
AT+CFUN=1 OK-AT-OK \
AT+CMEE=2 OK-AT-OK \
AT+CSQ OK \
AT+CGDCONT=1,\\\»IP\\\»,\\\»internet.mts.ru\\\» OK \
AT+CGACT? OK-AT-OK \
AT+CGATT? OK \
AT+CGCLASS? OK \
AT+COPS? OK \
ATD*99***1# CONNECT»

# enable dns
# resolv rewrite

set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
add! default HISADDR

Этот конфиг не предусматривает ввода пин-кода на симке модема, если пинкод есть — лучше его отключить в каком-нибудь телефоне, и вернуть симку в модем уже без этого идиотического запроса. Хотя в принципе я встречал AT-команду для передачи пинкода модему, но это уж вы как-нибудь сами. У меня закомментированы строки об использовании ДНСа и переписывании содержимого resolv.conf потому что ДНС у меня на сервере есть и так, предпочитаю юзать локальный, но вы можете юзать и МТСовский, или чей он у вас там, который выдаётся при установлении соединения. Обратите внимание, в последней строке после add стоит восклицательный знак. Дело в том, что если у вас уже есть интернет канал, то есть и основной шлюз. Если знак не поставить, ppp наткнется на route already in table и у вас будет всё так же работать старый канал после установления соединения. А если при этом перезапишется еще и resolv.conf, то работать не будет ничего вообще. И не забудьте поправить internet.mts.ru на то, что у вас, а то я на этом деле потерял полтора часа, пока не допёр, что у меня было написано в строке инициализации просто internet.

Проверяем: даём команду ppp — оказываемся в окне ppp, где видим приглашение типа:

Working in interactive mode
Using interface: tun0
ppp ON ваш хостнейм>

Пробуем дать команду dial
Буквы p должны начать становиться большими, сначала первая, потом вторая, потом третья. В мане это объясняется так:

ppp ON awfulhak>               # No link has been established
Ppp ON awfulhak>               # We’ve connected & finished LCP
PPp ON awfulhak>               # We’ve authenticated
PPP ON awfulhak>               # We’ve agreed IP numbers

У меня последняя p долго не росла, так вот дело было как раз в правильном адресе прокси, который должен быть internet.mts.ru, а не что попало.

После того как все буквы вырастут, можно посмотреть ifconfig, вы должны будете наблюдать нечто такое:

tun0: flags=8051 metric 0 mtu 1500
options=80000<linkstate>
inet 10.64.11.65 —> 10.0.0.2 netmask 0xffffff00
Opened by PID 1574

Основным шлюзом ppp пропишет именно 10.0.0.2, пинговать этот адрес смысла нет, пинговаться он не будет, но вот интернет при этом должен работать вполне нормально, так что можно попинговать, например, ya.ru.

Ну, собственно, вот и всё, 3G-модем работает. Дальше можете настроить нат (в ppp это лучше делать средствами ppp, читайте man ppp) и всё остальное. остается лишь добавить, что я делал это на FreeBSD 8.2, потому что на 7.4, на сколько я знаю, есть какие-то заковырки на эту тему, хотя может быть их и нет, и надо пробовать.

Бачило Дмитрий.

Page last updated on 17.08.2011 at 18:26