Инструменты пользователя

Инструменты сайта


igor:pppd_i_ego_primenenie_dlja_mobilizacii_interneta

Все мои статьи: Статьи Игоря Романова

PPPD и его применение для "мобилизации" интернета в Linux

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

Сначала — немного теории

В основе мобильного интернета лежит «Протокол от точки к точке» - Point-to-Point Protocol — PPP. Этот протокол разработан достаточно давно для организации сетей с применением модемов, и хотя за прошедшее время техника продвинулась вперед, современная аппаратура для мобильного интернета по-прежнему создается с ориентацией на этот протокол.
Для реализации этого протокола имеется программа Point-to-Point Protocol Daemon — PPPD. Эта программа достаточно древняя, а значит хорошо отлаженная. Она имеется во всех юникс-подобных операционных системах. У меня в Debian Wheezy она обнаруживается сразу после установки системы (размещение: /usr/sbin/pppd — проверьте, так ли у вас, или может быть где-то в другом месте), так что вполне может считаться штатным компонентом ОС. В Gentoo само собой ничего не устанавливается - нужно установить пакет ppp.
PPPD — это основа основ, «гранит из Кузнечного, на котором стоим» (почти цитата из рекламы того самого гранита). Все остальные программы для подключения к интернету либо пытаются действовать в обход PPPD, либо создают «надстройку» над ним, либо представляют собой просто конфигурашки, за которыми в конечном счете стоит PPPD. Первые два подхода чреваты, как минимум, нестабильной работой вплоть до полной невозможности подключить данный компьютер к данному провайдеру, а как максимум - «дырами» в безопасности системы. Ну а что касается третьего подхода, то он, как минимум, ничему не учит, а как максимум, - опять-таки не дает гарантии решения каждой конкретной задачи. Кому-то повезет, кому-то нет.
А если не повезло, что остается? - Копать вглубь. До гранита. Это и будет «классический линуксоидный» подход: настройка непосредственно самого PPPD через его штатные файлы конфигурации. Эти файлы представляют собой тексты, так что все, что нам потребуется для их создания, - обычный текстовый редактор (который у вас, будем надеяться, есть), а никакого другого ПО устанавливать не потребуется. Единственный недостаток: копать придется действительно глубоко, но жалеть труда не следует, так как в результате получим не просто кое-как решенную задачу, а ПОНИМАНИЕ.

О физических и логических устройствах

Однако создавать конфигурационный файл будем чуть позже, а сначала нам надо кое-что выяснить, а конкретно: с каким логическим устройством наш PPPD будет работать?
И вот предвижу вопрос читателя: какие еще логические устройства, зачем? Только запутаешься!
На самом деле смысл логических устройств как раз в том, чтобы не запутываться, а наоборот: построить систему пусть «многоэтажную», зато более ясную и логичную. Чтобы ходить с этажа на этаж как по лестнице, а не блуждать в лабиринте. Я сам не сразу понял смысл такого подхода, но уж когда понял, то мое понимание компьютерно-сетевых технологий стало продвигаться гораздо быстрее.
В нашей системе каждая программа имеет четко определенный круг обязанностей. Всевозможных модемов в мире тысячи, и нет смысла учить PPPD работать с каждым из них. Поэтому с модемом работает драйвер - составная часть ядра ОС, который надстраивает над модемом логическое устройство, а PPPD, в свою очередь, над этим логическим устройством надстраивает свое - ppp0 (таких устройств может быть и несколько: ppp1 и т. д.). И, как принято в наших ОС, каждое логическое устройство представлено файлом в каталоге /dev/.
Логическое устройство, «изображающее» модем и служащее предметом работы пппдемона, скорее всего будет называться ttyUSB0 или ttyACM0, однако последняя цифра может варьироваться.
Несколько слов об этих названиях. TTY - teletype - телетайп, или буквопечатающий телеграфный аппарат, древнее устройство, которое ныне можно увидеть только в музее, в свое время служившее системной консолью первобытным компьютерщикам - создателям UNIXов и языка программирования C. С тех далеких времен этот термин сохранился в юниксоидных системах для обозначения любого устройства, обеспечивающего посимвольный ввод-вывод данных по некоторому проводу. Компьютер не знает, что за устройство находится на другом конце провода. Ему говорят: работай с этим устройством как с tty - он так и работает, даже если провода как такового уже нет… Так что в нашем нынешнем мире tty - это просто абстракция, за которой могут стоять самые различные приборы и аппараты. TtyUSB0 - очевидно, эмуляция tty посредством USB. ACM - Abstract Control Model - абстрактная модель управления… впрочем, не хочу залезать в дебри. Подробнее читайте здесь:
http://adminbook.ru/index.php?men2=2-4/18/14
http://rulinux.net.ru/node/112
https://www.rfc1149.net/blog/2013/03/05/what-is-the-difference-between-devttyusbx-and-devttyacmx/
Итак, входим в консоль и подаем следующие команды… (В своих статьях я придерживаюсь определенной системы представления текста. Вот такой текст будет имитировать экран компьютера, на котором мы видим наши команды (подчеркнутым шрифтом) и ответ системы на них):

igor@ovragi:~$ ls /dev/ttyUSB0
ls: невозможно получить доступ к /dev/ttyUSB0: Нет такого файла или каталога
igor@ovragi:~$ ls /dev/ttyACM0
ls: невозможно получить доступ к /dev/ttyACM0: Нет такого файла или каталога


Результат закономерен и предсказуем: мы еще ничего не подключили. Дальнейшие действия буду описывать применительно к скайлинковскому модему фирмы AnyData (в просторечии такое устройство называется свистком). Включаем «свисток» в USB-гнездо непосредственно или через кабель-удлиннитель и выжидаем примерно четверть минуты (на модеме должна загореться лампочка готовности), затем снова подаем те же самые команды:

igor@ovragi:~$ ls /dev/ttyUSB0
/dev/ttyUSB0
igor@ovragi:~$ ls /dev/ttyACM0
ls: невозможно получить доступ к /dev/ttyACM0: Нет такого файла или каталога


Что видим? У нас образовалось устройство ttyUSB0, которого только что не было.
Но вот сейчас у меня в руках 3G-свисток ZTE MF627 (МТС). Включаем?

igor@ovragi:~$ ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3


Чем дальше в лес, тем меньше дров и злее партизаны! Откуда там целых четыре модема???
Модем на самом деле, конечно, один. TtyUSB0, ttyUSB1, ttyUSB2 и ttyUSB3 - это мнимые (хочется сказать «виртуальные») провода или тракты, на другом конце которых этот единственный модем и находится. Один из этих трактов - «грузовой» или «товарный» - именно его следует использовать для подключения к интернету. Остальные (в разных модемах их может быть большее или меньшее количество) - служебные. Когда мы сидим в интернете, «грузовой» провод занят перекачкой нужных нам данных. Благодаря наличию служебных «проводов» можно, не нарушая интернет-соединения, подавать модему команды и слушать его ответы. Можно, например, узнать, сколько у нас денег на сим-карте, наблюдать уровень сигнала сотовой сети, отправлять и принимать СМСки… Впрочем, это фишки для продвинутых пользователей, к тому же специфичные для разных устройств. Так что вернемся к основной теме.
Как узнать, который из них «грузовой»?
Способ не на 100% проверенный, но вроде есть вариант:

igor@ovragi:~$ ls -l /dev/gsmmodem
lrwxrwxrwx 1 root root 7 Янв 14 21:25 gsmmodem → ttyUSB3


То есть операционная система сама как-то «договаривается» с модемом, чтобы найти «грузовой» тракт, и создает символическую ссылку на него. Будет ли имя ссылки всегда именно таким? Попробуйте.
Кстати, сейчас мы наблюдаем преимущество линукса перед виндами. Если бы мы работали в Windows, первое, что нам пришлось бы сделать, - это установить драйверы для модема. Но сначала их еще надо найти, скачать… (а как скачивать, когда интернет еще не подключен — об этом кто-нибудь подумал???) В общем, мороки хватило бы. А у нас — все автоматом.
Итак, наш модем опознан системой и будет обзываться именем, которое мы только что узнали. Или, как принято говорить в линуксоидном мире: физическое устройство село на данное логическое устройство.

А если не село?

Когда я жил в Дебиане (версий 7..8) и работал со скайлинковским свистком и с простыми сотовыми телефонами фирм «Моторола» и «Нокиа», у меня таких ситуаций не случалось. Однако вы, вероятно, скажете, что это техника позавчерашнего века, и захотите использовать что-то более современное? Вероятно модем-свисток 3G/4G? А у меня свои тараканы: я с Дебиана пересаживаюсь на Генту. И вот тогда подобная проблема у нас с вами прогнозируется с определенной вероятностью.
Сначала про Генту и вообще про все линуксоидные системы, отличные от Дебиана. Начну с них потому, что здесь есть единственный вопрос, который, собственно, почти даже и не вопрос: есть ли у нас в ядре программная поддержка для USB-модемов?
Мы должны понимать, что все линуксоидные системы имеют в своей основе практически один и тот же агрегат - ядро. В некоторых системах типа генты он поставляется нам из репозитория в виде набора «Сделай сам» и собирается на месте, разработчик принципиально ничего за нас не делает. Короче, если в ядре нет поддержки мобильного интернета, то ядро придется пересобрать. Ничего принципиально страшного в этом нет, просто некоторое время потратить. Разработчик Дебиана поставляет нам несколько готовых ядер и к ним кучу модулей. Если устанавливать систему в режиме «Expert install», то на определенном этапе установки нам предложат выбор: установить драйверы для этого компьютера или установить все драйверы. Выбираем последнее - и получаем ядро с поддержкой PPP. Очевидно, под драйверами подразумеваются модули ядра.
Сборка ядра с использованием команды make menuconfig - операция, имеющая место во всех линуксоидных системах. Как она осуществляется, я здесь подробно останавливаться не буду. (можно посмотреть, например, вот здесь: Установка Gentoo: глазами новичка). На что следует обратить первостепенное внимание?
В меню верхнего уровня находим раздел Device drivers и входим во вложенное меню (меню следующего уровня). Там ищем пункты:
Network Device support –> PPP support - поддержка собственно протокола ppp, безотносительно к модемам;
USB support –> USB serial converter –> USB driver for GSM and CDMA - ядерный драйвер, который раньше назывался usbserial, потом option;
USB support –> USB modem (CDC ACM) - ядерный драйвер для сотовых телефонов - это он отвечает за ttyACM0.
Нажимая клавишу пробел, помечаем нужные пункты звездочкой (для монолитного включения в ядро) или буквой М - для модульного включения. Что лучше? Я предпочитаю полностью монолитные ядра, но допускаю, что в определенных ситуациях модульное подключение может быть предпочтительно.
Вернемся к USB модемам 3G/4G. Многие из них сделаны чрезвычайно криво и путано (чем новее - тем кривее), поэтому наладка их может стать нетривиальной задачей. Если же модем залочен, т. е. запрограммирован для работы с каким-то одним сотовым провайдером, то давайте сразу договоримся: заставить его работать под линуксами - авантюра с шансами фифти-фифти. Говорят, что такие модемы можно разлочить, но внятной технологии я пока что нигде не видел, а экспериментировать по непроверенным методикам - так недолго вообще без связи остаться.
Чтобы разобраться, для начала представим себе, что такое современный 3G/4G модем.
Обычно любое периферийное устройство поставляется в комплекте с диском, на котором записано фирменное ПО, в т. ч. драйверы. Абсолютное большинство изготовителей периферии напрочь игнорируют существование линуксов и разрабатывают ПО для своих устройств только под Windows. Нам как бы ничего и не надо, у нас ведь есть все необходимое в ядре, но… Изготовители модемов решили диск с драйверами не прикладывать к модему, а встроить внутрь. Конечно это не настоящий диск, а эмулятор - устройство на основе флэш-памяти, изображающее из себя диск. Придумали даже название для этой технологии: ZeroCD. Решение было бы вполне разумно, если бы ничему не мешало. Когда модем подключают к компьютеру с Windows, операционная система читает этот «диск», проверяет, не установлено ли ПО на этот компьютер, и если нет, то устанавливает его. Когда же ПО установлено, дается команда такая же, как для того, чтобы выдвинуть настоящий диск из дисковода. И вот здесь изготовители модемов из разных стран как сговорились: модем становится «виден» компьютеру только после выполнения этой команды. Вот отсюда и идет основная неприятность для нас. Модем имеет систему команд, и в этой системе имеются ясные и простые команды для управления тем, как устройство будет представляться компьютеру… Но чтобы заслать эти команды в модем, нам нужно логическое устройство ttyUSB0, а его нет. Замкнутый круг, из которого надо как-то выбираться.
(Извините, эта часть статьи еще не готова, прошу рассматривать как черновик)
Впрочем это все теория. Мы же с вами инженеры, и мы дружим не столько с теорией, сколько с информационно-справочной литературой. И нам хотелось бы иметь готовые списки модемов: «черный» и «белый». Чтобы в магазине не хватать то, что предложит продавец, и потом танцевать с бубном, а заранее залезть на известный сайт в интернете, выяснить, какое устройство нам нужно, и целенаправленно покупать его.
Списков будет даже не два, а целых четыре. С черным и белым - все понятно. Еще будет серый список - в него включим модемы, которые просто так не заработают, но можно их заставить работать, выполнив определенные технологические операции. В красный список я включил модемы, требующие дополнительных исследований: у меня они работают, но мне их подарили бэушными и, похоже, в неродной комплектации. Во всяком случае, ведут они себя не совсем так, как можно было бы от них ожидать. Но что конкретно с ними делали, не перешивали ли, - узнать не удалось. Готовые списки, однако, будут лет через несколько. А по состоянию на сегодня черный список возглавляет Huawei 827F - это основная модель четвертого поколения, которую нам предлагает МТС. В то же время более старые МТСовские модемы третьего поколения: ZTE MF627 и Huawei E171 - в красном списке.

Создание конфигурационного файла

Итак, мы определились с логическим устройством, с которым пппдемон будет работать. Приступаем ко второму этапу работы — к созданию конфигурационного файла.
Поскольку PPPD задумывался как гибкий и мощный инструмент, имеется возможность всю его конфигурационную информацию разделить на несколько файлов, размещаемых в отведенных для них каталогах. В интернет-блогах часто встречается рекомендация использовать файлы /etc/ppp/peers/… и /etc/chatscripts/… Если нам требуется подключиться к одному-единственному провайдеру и мы абсолютно травоядно настроены работать с ним длительное время, то считаю более целесообразным другой путеь: использовать единственный файл /etc/ppp/options. Он основной, но надо иметь в виду, что заданные в нем параметры могут быть переопределены параметрами из других файлов, если таковые существуют и будут упомянуты при запуске PPPD. Возможно, ваша операционная система уже содержит этот файл «в коробке», а если нет, то можете попытаться найти его в интернете… Но в том и в другом случае вы получите полуфабрикат, с которым придется основательно поработать. В линуксоидном мире есть выражение «работать напильником», но это не наша сегодняшняя ситуация. Работать напильником — значит подгонять некоторое типовое решение под свои индивидуальные потребности и вкусы. А сегодня я только еще превращаю полуфабрикат в типовое решение, и для этого потребуется не напильник, а как минимум ацетиленовая горелка и походная кузница. Впрочем, в их роли все равно снимается наш обычный, любимый и повседневный текстовый редактор. Он у каждого свой, и я в своих статьях не касаюсь темы, как редактор вызвать и как в нем выполняется каждая операция. С помощью редактора я перекроил весь файл, сгруппировав описанные в нем параметры по темам. На восприятие их пппдемоном это не влияет, а на понимаемость для людей — очень даже. Получилось так, что первые три пункта содержат параметры, диктуемые аппаратурой и провайдером, а пункты начиная с 4 - параметры, которые мы выбираем сами, чтобы пппднмон выполнял ту работу, которая нужна нам.
Мой вариант файла содержит готовые наборы параметров для подключения к конкретным мобильным провайдерам, обитающим в наших краях (имеется в виду Питер и Ленобласть, а вообще-то эти провайдеры работают по всей России).

# Это основной конфигурационный файл для PPPD
# Размещение: /etc/ppp/options
#
# 1). Логическое устройство - интерфейс к модему и скорость передачи данных
# 1а). модем-свисток:
/dev/ttyUSB0 115200
# 1б). телефон, подключенный через простой USB-кабель: /dev/ttyACM0 38400
# 1в). телефон, подключенный через bluetooth: /dev/rfcomm0 921600
# 1г). телефон, подключенный через инфракрасный порт: /dev/ircomm0 38400
#
# 2). Имя пользователя и пароль (уточнить у провайдера):
# 2а). Для питерского Скайлинк:
user «mobile»
password «internet»
# 2б). Для ТЕЛЕ2: user «» password «»
# 2в). Для Билайн: user «beeline» password «beeline»
# 2г). Для МТС: user «mts» password «mts»
# 2д). Для Мегафон: user «gdata» password «gdata»
#
# 3). Чат-программа и чат-скрипт
# 3а). Для скайлинковского свистка фирмы AnyData:
connect '/usr/sbin/chat -v \
TIMEOUT 5\
ABORT «BUSY»\
ABORT «NO CARRIER»\
ABORT «VOICE»\
ABORT «NO DIALTONE»\
ABORT «NO ANSWER»\
ABORT «ERROR»\
«» AT\
OK AT+CRM=1;&C0\
OK ATDT#777\
CONNECT «»'
# 3б). Общий вариант для мобильных телефонов GSM:
#connect '/usr/sbin/chat -v \
#TIMEOUT 5 \
#ABORT «BUSY» \
#ABORT «NO CARRIER» \
#ABORT «VOICE» \
#ABORT «NO DIALTONE» \
#ABORT «NO ANSWER» \
#ABORT «ERROR» \
#«» ATZ \
#OK ATH \
#OK ATE1 \
# Команда инициализации модема, рекомендуемая GSM-провайдерами
# вместо tele2 подставить: beeline или mts, а для мегафона просто 'internet'
# Для билайна может быть 'home.beeline.ru'
#OK AT+CGDCONT=1,'IP','internet.tele2.ru' \
# Команда набора номера — возможны варианты!
#OK ATDT*99# \
#CONNECT «»'
# Следующие команды, имеющиеся в шаблонных файлах и в интернет-блогах,
# мне оказались не нужны, но могут понадобиться:
# Команда AT+CPIN задает PIN-код
#OK AT+CPIN=0000
# AT+CFUN may allow to configure the handset to limit operations to
# GPRS/EDGE/UMTS/etc to save power, but the arguments are not standard
# except for 1 which means «full functionality».
#OK AT+CFUN=1
# Uncomment the following line to see the connect speed.
# It will be logged to stderr or to the file specified with the -r chat option.
#REPORT CONNECT
# 3в). Упрощенный вариант для телефонов Nokia:
#connect '/usr/sbin/chat -v \
#TIMEOUT 5 \
#ABORT «BUSY» \
#ABORT «NO CARRIER» \
#ABORT «VOICE» \
#ABORT «NO DIALTONE» \
#ABORT «NO ANSWER» \
#ABORT «ERROR» \
#«» ATZ \
#OK ATDT*99# \
#CONNECT «»'
#
# 4). Требуем подробного отображения хода процесса на консоль:
debug
#
# 5). Режим активного дозвона с повторным дозвоном при обрыве соединения:
persist
# Повторный дозвон через 15 секунд
holdoff 15
# Делаем 10 попыток повторного дозвона, прежде чем отключиться
maxfail 10
#
# 6). Требуем эксклюзивного доступа пппдемона к устройству:
lock
#
# 7). Должен ли пппдемон работать в фоновом режиме (отключаться от консоли):
# 7а). Уходить в фон сразу: detach
# 7б). Уходить после поднятия протокола: updetach
# 7в). Не уходить в фон:
nodetach
#
# 8). Сетевая адресация, маршрутизация и протокольные формальности
# Не использовать IP-адрес, обычно назначенный для этого хоста:
noipdefault
# Требуем, чтобы провайдер назначил IP-адрес нам и себе динамически:
ipcp-accept-local
ipcp-accept-remote
# Не требуем от провайдера аутентифицироваться:
noauth
# Требуем, чтобы провайдер предоставил свой DNS-сервер:
usepeerdns
# Используем это соединение в качестве маршрута по умолчанию:
defaultroute
# Control character handling:
asyncmap 20A0000
escape FF
# Опции контроля линии (Line Control Protocol — LCP):
lcp-echo-interval 12
lcp-echo-failure 10
# MaximalReceiveUnit:
mru 1500
#MaximalTransmitUnit:
mtu 1400
#
# 9). Отказываемся от каких-либо методов сжатия данных:
nopcomp
novj
novjccomp
nobsdcomp
nodeflate
noaccomp
#
# Опции для последовательного порта (COM-port)
# Нам они не нужны, поскольку используем USB
# crtscts
# local и modem — взаимно противоположны


Для тех, кто первый раз заму в линуксах, напоминаю: в каждой строке все, что правее символа #, - комментарий. Если какая-то команда нам не нужна, не уничтожаем ее совсем, а «лишаем свободы, посадив за решетку» (потому что удалишь совсем, потом она понадобится, а поди вспомни, где что было). Основываясь на этом принципе, я составил конфигурационный файл как универсальный шаблон, который вы можете приспособить к своей ситуации, не вводя никаких букв или цифр, а используя только клавиши Enter и Backspace.
Поскольку представленный здесь файл подробно прокомментирован, этого будет достаточно для поверхностного знакомства с PPPD (или, например, для защиты студенческой лабораторной работы). Если хотите узнать глубже, читайте здесь:
http://www.mini-server.ru/books/37-tcp-ip/598-ppp-daemon
http://www.altlinux.org/Pppoptions
http://manpages.ylsoftware.com/ru/pppd.8.html
Однако не могу не остановиться подробнее на некоторых пунктах.
По пункту 1: здесь я привожу старый вариант файла, в котором имя устройства указано явно. В моем новом варианте вместо настоящего имени устройства указана символическая ссылка на него: /dev/gsmmodem.
По пункту 2: уточните имя пользователя и пароль у вашего провайдера.
Ну и по пункту 3 - эту тему я хочу выделить в отдельную главу.
mtu и mru: при плохой связи можно уменьшить до 800, источник: http://wiki.lblss.ru/%D0%9A%D0%BE%D0%BD%D0%BD%D0%B5%D0%BA%D1%82_%D0%BF%D1%80%D0%B8_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D0%B8_pppd

Чат-программа и чат-скрипт

Это, наверно, самый интересный момент, тем более что в указанных источниках об этом ничего не говорится.
Начнем с элементарного: чат (англ. chat — разговор) — это последовательность сигналов, которыми компьютер и модем должны обменяться, чтобы модем вообще мог передавать и принимать какие-либо данные. Осуществить этот «обмен любезностями» можно разными способами. Ну для начала: мы ведь помним, что каждое логическое устройство представляет собой файл, в который мы можем что-то писать и что-то из него читать. Примерно вот так:

igor@ovragi:~$ echo что-нибудь >/dev/ttyUSB0
igor@ovragi:~$ cat /dev/ttyUSB0
ERROR


Это ERROR модем нам прислал в ответ на наше что-нибудь.
Еще в линуксах есть программа minicom - по большому счету, просто эмулятор терминала. Не эмулятор системной консоли, напрямую подключенной к командной оболочке, а просто терминал, который отсылает нажимаемые на клавиатуре символы в указанное логическое устройство и отображает на экране символы, поступившие из этого устройства.
Однако для решения нашей сегодняшней задачи не придумать ничего лучше, чем программа /usr/sbin/chat (проверьте, есть ли она у вас, - скорее всего да, хотя в других ОС размещение может быть другим). Ключ -v в командной строке означает verbose — болтливый — практически то же самое, что debug для PPPD — подробное отображение происходящего на консоли. Я люблю, чтобы от меня ни у кого не было секретов, а вы? Подробное описание чат-программы (на английском) здесь:
http://www.opennet.ru/man.shtml?topic=chat&category=8
Далее идет очень длинная командная строка, для наглядности разбитая обратными слэшами на несколько строк. Это сценарий, по которому «разговор» должен пройти слово-в-слово, как на киносъемках (термин чат - из лексикона кинематографистов). Этот сценарий будем называть чат-скриптом. В интернет-блогах чаще всего можно увидеть рекомендацию выделить чат-скрипт в отдельный файл. Для этого в системе даже предусмотрен специальный каталог: /etc/chatscripts. Рекомендация во многих отношениях разумная, но сегодня я просто хочу вам показать, что есть и вот такой путь. На эту мысль меня навела вот эта статья:
http://doc.marsu.ru/modems/zelax/pppd/call.html
Рассмотрим подробнее сам чат-скрипт. Он состоит из двух половин.
В первой половине указываются условия, при которых выход в интернет невозможен и придется прервать работу (ABORT). Эти условия — в основном бюрократическая престраховка, кроме одного: NO CAREER («нет несущей») — эта команда нас спасет от мелких неприятностей, если мы попытаемся выйти в интернет, находясь вне зоны действия нашей сети.
Во второй половине чат-скрипта каждая строка содержит сигнал от модема и команду, которую мы должны подать в ответ на него (а следующий сигнал будет ответом на нашу команду). Команды в той или иной мере специфичны для каждого модема. Если команда выполнена успешно, модем откликается: ОК. В противном случае его ответ может быть ALARM, ERROR или еще в этом духе. В частности, ответ ALARM прогнозируется, если мы вместо «грузового» ttyUSB пытаемся использовать «служебный».
Те команды, что приведены здесь для модема-свистка AnyData, подключенного к Скайлинку, — абсолютно рабочие, так что мудрить над этим чат-скриптом едва ли придется. Над чем придется помудрить — так это над чат-скриптом для GSM/3G/4G. Приведенный выше упрощенный вариант мною проверен на телефонах фирмы Nokia, подключенных к провайдеру TELE2. Для других телефонов и провайдеров могут потребоваться различные команды, в т. ч. те, которые я поместил в свой файл «про запас», и не только…
Сейчас я хочу остановиться на информации, которая имеется в интернет-блогах, но не получила подтверждения в моей практике. Первое: кроме опции connect, якобы еще нужна опция disconnect с соответствующим чат-скриптом. Я сделал все, как там было написано, результат: выход в интернет удавался, но по завершении работы возникала ошибка. И хотя эта ошибка по существу уже ничего не меняет, зачем нам лишняя нервотрепка? В общем, я удалил эти опции и с тех пор спокойно обхожусь без них. Второе: совет прописать имя пользователя и пароль в файлы /etc/ppp/pap-secrets и/или /etc/ppp/chap-secrets. У меня эти файлы пусты — выходит, что и без них можно обойтись. И третье - касательно команды AT+CGDCONT… Сколько раз я ее видел в линуксоидных интернет-блогах, в мануалах по Windows, в инструкциях к сотовым телефонам и памятках абонентам сотовых сетей, столько раз по жизни я без нее обходился. Значит ли это, что она совсем не нужна? - Боюсь что не значит.

Запуск

Итак, аппаратура подключена, конфиги составлены… Проверено — мин нет? Тогда с Богом:

igor@ovragi:~$ pppd
bash: pppd: команда не найдена


ЧМДНТ?
А то мы ДНТ, что PPPD вообще-то должен запускаться суперпользователем. Наши варианты:
Вариант 1: всегда давать команду su или sudo. Это не слишком удобно, но приемлемо, если компьютер строго персональный. Если же к компьютеру допущены ваши домочадцы и им необходимо самостоятельно выходить в Сеть, то знать команду su, а тем более пароль суперпользователя, им совсем необязательно, так? Ну и в любом случае недостаток: риск что-то напортачить, работая длительное время под рутом. В линуксах это не принято.
Вариант 2: выполнять PPPD под sudo, предварительно сконфигурировав файл sudoers так, чтобы все (или некоторые) пользователи, имеющие доступ к компьютеру, могли запускать PPPD, не зная пароля суперпользователя. Это вариант для тех, кто достаточно хорошо изучил команду sudo. На мой взгляд, самый правильный вариант.
Вариант 3: прописать (из-под рута, конечно) chmod a+x /usr/sbin/pppd. Вообще-то это потенциальная дыра в безопасности, но на это можно согласиться, если доступ к компьютеру имеют только надежные люди.
Вариант 4: используя рутовые полномочия и команду gpasswd, прописать нужных пользователей в группу dip (в других системах может быть dialup или dialout), которой принадлежит pppd (или сменить саму эту группу?).
В любом случае, если мы запускаем пппдемон от имени простого пользователя, следует указать полный путь к программе. Итак, снова:

igor@ovragi:~$ /usr/sbin/pppd
Serial connection established.
using channel 1
Using interface ppp0
Connect: ppp0 ←→ /dev/gsmmodem
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x5ef7353a>]
rcvd [LCP ConfReq id=0x0 <asyncmap 0x0> <auth chap MD5> <magic 0x105729f> <pcomp> <accomp>]
sent [LCP ConfRej id=0x0 <pcomp> <accomp>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x5ef7353a>]
rcvd [LCP ConfReq id=0x1 <asyncmap 0x0> <auth chap MD5> <magic 0x105729f>]
sent [LCP ConfAck id=0x1 <asyncmap 0x0> <auth chap MD5> <magic 0x105729f>]
sent [LCP EchoReq id=0x0 magic=0x5ef7353a]
rcvd [LCP DiscReq id=0x2 magic=0x105729f]
rcvd [CHAP Challenge id=0x1 <cec7b3d70414035ccc4117cec821e158>, name = «UMTS_CHAP_SRVR»]
sent [CHAP Response id=0x1 <b35b5e78cc5dc52e91042014283c8b67>, name = «mts»]
rcvd [LCP EchoRep id=0x0 magic=0x105729f 5e f7 35 3a]
rcvd [CHAP Success id=0x1 «»]
CHAP authentication succeeded
CHAP authentication succeeded
sent [IPCP ConfReq id=0x1 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
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 <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 ConfNak id=0x2 <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=0x3 <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=0x3 <ms-wins 10.11.12.13> <ms-wins 10.11.12.14>]
sent [IPCP ConfReq id=0x4 <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=0x4 <addr 10.183.42.115> <ms-dns1 217.66.153.253> <ms-dns2 217.66.153.254>]
sent [IPCP ConfReq id=0x5 <addr 10.183.42.115> <ms-dns1 217.66.153.253> <ms-dns2 217.66.153.254>]
rcvd [IPCP ConfAck id=0x5 <addr 10.183.42.115> <ms-dns1 217.66.153.253> <ms-dns2 217.66.153.254>]
Could not determine remote IP address: defaulting to 10.64.64.64
local IP address 10.183.42.115
remote IP address 10.64.64.64
primary DNS address 217.66.153.253
secondary DNS address 217.66.153.254
Script /etc/ppp/ip-up started (pid 1308)
Script /etc/ppp/ip-up finished (pid 1308), status = 0x0


По «выхлопу» (здесь я его привожу с некоторыми сокращениями) пробежимся галопом.
Сначала мы видим, как выполняется чат-скрипт (если, конечно, был ключ -v в командной строке чат-программы). Он завершается сообщением: Serial connection established. using channel 1. Using interface ppp0 . Далее следует обмен «протокольными любезностями», при этом мы передаем провайдеру имя пользователя и пароль (в заифрованном виде), от провайдера мы этого не требуем (параметр noauth в конфигурационном файле) — на этом «знакомство» можно считать состоявшимся (CHAP authentication succeeded). Далее видим, что провайдер назначает нам IP-адрес и сообщает свой, и дает два адреса DNS-серверов: primary DNS address 217.66.153.253 , secondary DNS address 217.66.153.254 или что-то в этом духе. Затем запускается скрипт /etc/ppp/ip-up started и finished (pid 1308), status = 0x0 - это говорит о том, что скрипт завершился благополучно. Сам этот скрипт — в основном формальность, но он запускает другой скрипт, /etc/ppp/ip-up.local (если таковой имеется) — основная задача его в том, чтобы выполнять какие-то действия, которые конкретно нам требуются при каждом выходе в интернет. Какие действия? — первое, что приходит на ум, — это прием и отправка почты.
Теперь, когда протокол поднят, PPPD действует согласно параметру detach/updetach/nodetach: либо уходит в фоновый режим (на консоли видим системное приглашение), либо не уходит (консоль занята). Включаем браузер, работаем! Выходя из дома в интернет, не забываем выключить газовые и электрические приборы, кипятильник, хамильник и матюгальник.
Закончив сеанс работы в Сети, закрываем браузер — попадаем снова в консоль. Теперь нужно закрыть PPPD. Если он в фоне (detach/updetach), консоль свободна - даем команду:

igor@ovragi:~$ killall pppd
Terminating on signal 2
Connect time 6.1 minutes.
Sent 52867 bytes, received 1270004 bytes.
Script /etc/ppp/ip-down started (pid 2963)
sent [LCP TermReq id=0x3 «User request»]
rcvd [LCP TermAck id=0x3]
Connection terminated.
Script /etc/ppp/ip-down finished (pid 2963), status = 0x0


Если же PPPD работал не в фоне (nodetach), то просто нажимаем Ctrl/C. Ответ системы будет таким же.

Варианты конфигурации PPPD

Я вам говорил про злых партизан? Смейтесь если смешно: я тоже партизан, и тоже порядком злой. Почему? - Потому что в нормальных деревнях и садоводствах по всей Ленобласти у людей уже оптоволокно, а у нас нет. И вот мне, как всамделишному партизану, а не как цивильно-гражданскому лицу, приходится вместо одного провода поддерживать в готовности два, а то и три взаиморезервирующих радиоканала для связи с «Центром». Ну примерно так:
Свисток AnyData, подключенный к Скайлинк: это дорого, зато дальнобойно (каких-то 4 года назад в нашей аномальной зоне вообще ничего кроме Скайлинка не ловилось);
Простой сотовый телефон «Нокиа», подключенный к ТЕЛЕ2: это очень дешево. Более дешевого интернета вы физически нигде не найдете! Но скоростишка, увы… Правда, сейчас в ТЕЛЕ2 уже есть 3.5G, но мой старый телефон ловит только простой GPRS;
3G-свисток (ZTE MF627 или Huawei E171), подключенный к МТС: дороже, чем ТЕЛЕ2, зато и скорость совсем другая.
Итак, имеем несколько наборов параметров для пппдемона, и осуществить все в рамках одного файла /etc/ppp/options не удастся.
Однако я уже говорил, что пппдемон - гибкий и мощный инструмент, и было бы удивительно, если бы при его разработке не предусмотрели решения для такой ситуации.
Многие линуксоидные программы, для которых предусмотрены конфигурационные файлы, ведут себя следующим образом. Если в файле заданы какие-то параметры для постоянного использования, а нам надо сегодня один раз запустить программу с другими параметрами, то мы их задаем в командной строке. А вот этого пппдемон, похоже, делать не умеет. Вообще все, что мы записали в файл options, можно было бы задать командной строкой. Но, поскольку файл уже имеется, то пппдемон будет брать все параметры из него, и «перебить» их командной строкой не удастся.
Можно нижнюю часть файла (начиная с пункта 4 - там опции, одинаковые для всех гаджетов/провайдеров) оставить как есть, а верхнюю (пункты 1-3) выделить в отдельные файлы для каждого варианта подключения. Назовем эти файлы skylink, nokia-tele2 и zte-mts и разместим в каталоге /etc/ppp/peers, который как раз для этого и предназначен. Слово peer переводится с английского с некоторой погрешностью как партнер, т. е. peers - наши провайдеры. Теперь команда запуска пппдемона должна выглядеть примерно так:

igor@ovragi:~$ /usr/sbin/pppd call skylink

Возвращаемся к тому, что было сказано выше по выделение чат-скрипта в отдельный файл. Для скайлинка можно оставить как есть, а вот для nokia-tele2 и zte-mts чат-скрипт один и тот же - по упрощенному варианту, так что сейчас такое выделение целесообразно.

При подготовке этой статьи были использованы, помимо вышеперечисленных, следующие материалы:
http://mydebianblog.blogspot.com.au/2007/01/gprs-debian-gnulinux-siemens-me45.html
http://ubuntuguide.org/wiki/Ubuntu:Gutsy#Using_mobile_phone.2FGPRS.2FEDGE_as_Internet_modem
http://vladimir-stupin.blogspot.ru/2009/04/gprs-sony-ericsson-k530i-linux-debian.html
http://ru.wikibooks.org/wiki/%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_GPRS/EDGE_%D0%B2_GNU/Linux

———————
Игорь Романов
Статья написана в 2014 г., редакция: январь 2017 г.

igor/pppd_i_ego_primenenie_dlja_mobilizacii_interneta.txt · Последнее изменение: 2021/12/12 23:02 — igor