Все мои статьи: [[igor:glavnaja|Статьи Игоря Романова]]
=====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 - операция, имеющая место во всех линуксоидных системах. Как она осуществляется, я здесь подробно останавливаться не буду. (можно посмотреть, например, вот здесь: [[igor:gentoo_installation|Установка 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 ] \\
rcvd [LCP ConfReq id=0x0 ] \\
sent [LCP ConfRej id=0x0 ] \\
rcvd [LCP ConfAck id=0x1 ] \\
rcvd [LCP ConfReq id=0x1 ] \\
sent [LCP ConfAck id=0x1 ] \\
sent [LCP EchoReq id=0x0 magic=0x5ef7353a] \\
rcvd [LCP DiscReq id=0x2 magic=0x105729f] \\
rcvd [CHAP Challenge id=0x1 , name = "UMTS_CHAP_SRVR"] \\
sent [CHAP Response id=0x1 , 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 ] \\
rcvd [IPCP ConfNak id=0x1 ] \\
sent [IPCP ConfReq id=0x2 ] \\
rcvd [IPCP ConfNak id=0x2 ] \\
sent [IPCP ConfReq id=0x3 ] \\
rcvd [IPCP ConfReq id=0x0] \\
sent [IPCP ConfNak id=0x0 ] \\
rcvd [IPCP ConfRej id=0x3 ] \\
sent [IPCP ConfReq id=0x4 ] \\
rcvd [IPCP ConfReq id=0x1] \\
sent [IPCP ConfAck id=0x1] \\
rcvd [IPCP ConfNak id=0x4 ] \\
sent [IPCP ConfReq id=0x5 ] \\
rcvd [IPCP ConfAck id=0x5 ] \\
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 г.