НАСТРОЙКА ОДНОВРЕМЕННОГО ИСПОЛЬЗОВАНИЯ GPRS И DIAL-UP В LINUX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Автор: Андрей Рахматуллин Версия: черновик пре-альфы. ++++++++ +ТЕОРИЯ+ ++++++++ Обоснование ~~~~~~~~~~~ В случае, когда есть возможность использования Internet через обычный модем (с оплатой по времени) и GPRS (с оплатой по траффику), имеет смысл использовать их поочередно/одновременно для различных задач. Это связано с некоторыми особенностями обоих видов подключения. Особенности GPRS ~~~~~~~~~~~~~~~~ + время подключения не оплачивается: * число подключений/отключений можно и нужно свести к минимуму; * идеально подходит для задач, в которых важнейшим фактором является время, а не траффик (IM, отправка небольших объемов почты, прием (заведомо) небольших объемов почты, и т.д.); - высокая цена 1 Мб (в разы выше, чем на dial-up) и низкая скорость, сравнимая с dial-up: * бессмысленно использовать для выкачивания сколько-нибудь больших объемов; * необходимо контролировать объем идущего через интерфейс траффика, а также не допускать ненамеренной передачи через интерфейс больших объемов (например: получение/отправка большого письма); Особенности dial-up ~~~~~~~~~~~~~~~~~~~ + траффик не оплачивается, при этом в пересчете на время цена 1 Мб гораздо ниже, чем на GPRS: * нет необходимости контролировать объем проходящего траффика; * подходит для скачивания больших объемов информации; - оплачивается время подключения: * необходимо минимизировать общее время подключения, что может привести к необходимости частых подключений/отключений; Задачи ~~~~~~ 1. В то время, как GPRS может и должен быть подключен постоянно, dial-up подразумевает частые подключения различной длительности. При этом нет смысла отключать GPRS. Более того, GPRS - это дополнительная ширина канала, и через него можно и нужно пустить отдельные виды соединений (см. преимущества GPRS). Таким образом: 1.1. Необходимо обеспечить возможность установки подключения одновременно и независимо по GPRS и dial-up. При этом наличие или отсутствие одного из подключений не должно никоим образом влиять на другое. 1.2. В период, когда имеются оба подключения, (почти) весь траффик должен быть пущен через dial-up. При этом желательно (но не обязательно) пустить соединения, почти не расходующие траффика, через GPRS. 1.3. При установке одного подключения не должно быть необходимости разрывать соединения, установленные на другом подключении (следует из 1.1, но учитывая 1.2 требует 1.4). 1.4. Желательна/необходима возможность переноса соединения, открытого через один вид подключения, на другой без его разрыва (следует из 1.2 и 1.3). 1.5. В любой момент времени необходимо иметь возможность к.-л. образом различать интерфейсы/соединения, использующие(ся) обоими видами подключений. 2. GPRS - это постоянное подключение к Сети. Это означает удобство в случае одних приложений и излишние расходы в случае других. Так, скачать 200К мейл-листов и 100К html-рассылок лучше по dial-up, а вот отправить 10К ответов на мейл-листы можно через GPRS по мере написания. Но скачивать упомянутые 300К почты по GPRS нежелательно. Таким образом: 2.1. Определенные приложения не должны иметь возможности обмена данными с внешним миром иначе, как через dial-up. При этом они должны сохранять нормальный режим работы. Пример: отправка/получение больших объемов почты. 2.2. Указанные в 2.1 приложения, тем не менее, в случаях, определенных пользователем, должны получать доступ к Internet. Желательна автоматизация, т.е. разрешение доступа на основании неких критериев, в конечном счете сводящихся к объему получаемой/передаваемой информации. Пример: отправка/получение небольших объемов почты (учитывая, что этим занимаются те же приложения, что в примере из п.2.1.). 2.3. Необходимо учитывать, что некоторые приложения в каждый момент времени (по тем или иным причинам) могут быть настроены на работу лишь через один вид подключения. При этом изменение настроек не всегда может быть выполнено автоматически и/или без перезапуска приложения, а попытка использовать неактивный (по различным причинам) интерфейс, либо обратиться к одному интерфейсу, используя настройки для другого, может быть чревата ошибками, вплоть до неразрешимых без ручного вмешательства. Пример: postfix, при попытке отправки письма из очереди на неправильный relayhost может получить 554 и уничтожить неотправленное письмо. В этом случае письмо придется отправлять заново, и хорошо, если оно было сохранено в архивах MUA при отправке. Таким образом, приложение должно позволять автоматическую либо простую ручную перенастройку при смене активного интерфейса. 3. При использовании GPRS оплачивается каждый мегабайт траффика, причем сравнительно дорого. Поэтому: 3.1. Необходима возможность контроля и учета траффика, идущего через GPRS. 3.2. При этом недопустимо смешивать траффик, идущий через dial-up и GPRS. Т.е. должна быть возможность различения и разделения соединений/пакетов/и т.д. на том же уровне, на котором идет учет траффика. При этом нет необходимости учитывать траффик, идущий через dial-up. ++++++++++ +ПРАКТИКА+ ++++++++++ Описываю текущие настройки моей системы. GPRS-модем использует устройство /dev/usb/acm/0, обычный - /dev/modem. Подключение к dial-up осуществляется kppp со стандартными настройками для dial-up. Подключение к GPRS осуществляется командой pppd call gprs с использованием файла /etc/ppp/peers/gprs, отключение - killall -1 pppd. При этом, разумеется, на момент отключения GPRS dial-up не подключен. Соблюдается порядок подключения: сначала GPRS, затем dial-up. При этом GPRS всегда использует интерфейс ppp0, dial-up - ppp1, что используется при подсчете траффика gkrellm (считается только ppp0) и в некоторых правилах iptables (см. ниже). В других случаях подключения различаются по имени устройства. Кроме того, используется тот факт, что при подключении к GPRS ("БиЛайн") удаленный IP всегда равен 192.168.100.101. Из-за опции defaultroute в /etc/ppp/peers/gprs при подключенном GPRS все соединения идут через него. При подключении dial-up он становится маршрутом по умолчанию, все установленные соединения фактически разрываются (об этом обе стороны могут узнать только по таймауту), все новые соединения идут через dial-up. После отключения dial-up в системе не остается маршрута по умолчанию, поэтому он восстанавливается скриптом /etc/ppp/ip-down.d/00gw: ----------------------------------------------------------------------------- $ cat /etc/ppp/ip-down.d/00gw #!/bin/sh [ "$DEVICE" = "/dev/usb/acm/0" ] && exit 0 route add -net 0.0.0.0 gw 192.168.100.101 ----------------------------------------------------------------------------- Перед подключением к dial-up во избежание некорректных завершений необходимо вручную закрыть все открытые соединения там, где это важно (IM, IRC). fetchmail работает в режиме демона с таймаутом 9999999, скрипт /etc/ppp/ip-up.d/fetchmail выполняет его перезапуск при подключении к dial-up: ----------------------------------------------------------------------------- $ cat /etc/ppp/ip-up.d/fetchmail #!/bin/sh [ "$DEVICE" = "/dev/usb/acm/0" ] && exit 0 service fetchmail reload ----------------------------------------------------------------------------- Таким образом, почта принимается только сразу после подключения к dial-up и при ручном запуске fetchmail. postfix настроен на SMTP-сервер провайдера dial-up: ----------------------------------------------------------------------------- $ grep ^relayhost /etc/postfix/main.cf relayhost = smtp.myprovider.ru ----------------------------------------------------------------------------- Во избежание пропадания отправляемых при отключенном dial-up писем средствами iptables запрещены исходящие соединения на 25 порт через интерфейс ppp0: ----------------------------------------------------------------------------- # grep ppp0 /etc/rc.d/rc.firewall $IPTABLES -A OUTPUT -p tcp -o ppp0 --dport 25 -j DROP ----------------------------------------------------------------------------- Таким образом, отправка почты происходит только при подключенном dial-up. Подсчет траффика в реальном времени происходит через gkrellm, расход траффика за текущий сеанс показывает ifconfig ppp0. При этом задачи 1.2, 1.5, 2.1, 3.1, 3.2 в достаточной степени решены, остальные - практически нет. vim:tw=78:ai: