Все мои статьи: [[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 г.