Библиотека сайта rus-linux.net
diald-examples - примеры конфигурации diald
diald-examples.ru(5) Документация по diald diald-examples.ru(5) НАЗВАНИЕ diald-examples - примеры конфигурации diald КРАТКИЙ ОБЗОР /etc/diald.conf ОПИСАНИЕ Эта страница руководства описывает несколько примеров конфигурации diald. Diald конфигурируется с помощью файла конфигурации. Diald всегда читает файл /etc/diald.conf при старте, кроме того, в командной строке могут быть указаны дополнительные файлы конфигурации. В приведенных примерах считается, что вся конфигурация осуществляется только с помощью файла /etc/diald.conf. Конфигурирование diald состоит из трех основных задач: 1) Создание "скрипта соединения", маленькой программы, звонящей по телефону и запускающей PPP или SLIP на другом конце соединения, 2) основной конфигурации diald, указывающей устройства и режимы работы, а также 3) настройки правил, использующихся для определения необходимости установки соединения. Это руководство делится на три части, соответствующих каждой из этих трех задач. Сначала кратко обсуждается написание скрипта соединения. Затем приводятся несколько примеров конфигурации с использованием стандартных правил фильтрации. Наконец, обсуждается построение альтернативных правил фильтрации. СКРИПТЫ СОЕДИНЕНИЯ Когда diald решает, что необходимо установить соединение, он должен дозвониться по телефону и войти в удаленную систему. Diald требует, чтобы пользователь предоставил для этой цели программу, называемую скриптом соединения. Очевидно, что написание скрипта соединения -- критичная задача, и может быть устрашающей для не-программиста. Если у вас уже есть работающая связь с помощью pppd, то у вас уже есть скрипт соединения, который также может использоваться с diald. Например, предположим, что вы запускаете pppd с помощью команды типа: pppd /dev/ttyS1 connect "chat -f /etc/ppp/chatscript" Тогда вы просто используете connect "/usr/sbin/chat -f /etc/ppp/chatscript" В качестве опции connect для diald. Заметьте, что вы должны указать полный путь к программе chat, так как diald будет работать с пустой переменной среды PATH. Если же у вас нет работающего скрипта соединения, то вы должны сделать его. Пример, названный connect , находится в директории /usr/lib/diald. Этот скрипт можно приспособить к вашим нуждам, изменяя параметры конфигурации в начале скрипта. Этим скриптом обрабатывается большинство вариантов дозвона и методов регистрации. Комментарии в примере объясняют, зачем нужны те или иные настройки. Если скрипт соединения из директории /usr/lib/diald невозможно сконфигурировать для ваших нужд, вам потребуется написать свой собственный скрипт. Если вам понадобится сделать это, прочтите руководство по chat. Можно также попробовать использовать expect, чтобы писать скрипты со сложным поведением. Вам следует также знать о состоянии среды, в которой работает скрипт соединения. В частности, стандартные вход, выход и stderr соединены с последовательным устройством (модемом). Вдобавок, переменная среды MODEM содержит имя этого устройства, и, если diald использует командный FIFO, то переменная среды FIFO содержит его имя. Эти переменные среды могут использоваться для довольно сложных взаимодействий между diald и скриптом соединения. ПРОСТЫЕ КОНФИГУРАЦИИ Конфигурация diald контролируется файлом /etc/diald.conf. В этой главе рассказывается о нескольких различных вариантах конфигурации, начиная с очень простых и заканчивая более сложными. В этой главе подразумевается, что скрипт соединения находится в /usr/lib/diald/connect. Каждый пример содержит файл /etc/diald.conf, который может использоваться в качестве образца для вашего собственного /etc/diald.conf. Вам, вероятно, следует изучить примеры перед созданием своего собственного /etc/diald.conf. В частности, большинство примеров укорочено до минимально необходимого количества опций, требуемых для запуска diald. Несколько дополнительных опций обсуждается в последнем примере -- вы наверняка захотите использовать их. Узел со статическим IP адресом, использующий PPP. Самый простой случай -- использование фиксированного IP адреса, присвоенного вашей локальной машине, причем эта машина не подсоединена к локальной сети. Обычно правильная настройка PPP проще, чем настройка SLIP. Предположим, что ваша машина будет работать с PPP, что ей присвоен фиксированный адрес 137.130.1.14, и что машина, с которой вы будете соединяться, имеет адрес 137.130.2.44. Также предположим, что ваш модем находится на последовательном устройстве /dev/ttyS1, и что вы хотите установить скорость вашего модема в 115200, потому что у вас быстрый модем. Нижеследующий /etc/diald.conf содержит минимальную конфигурацию для этого случая: mode ppp connect /etc/diald/connect device /dev/ttyS1 speed 115200 modem lock crtscts local 137.130.1.14 remote 137.130.2.44 defaultroute include /usr/lib/diald/standard.filter Опция mode указывает diald использовать протокол PPP. Опция connect указывает diald, где искать скрипт соединения. Опция device говорит diald, что модем находится на устройстве /dev/ttyS1, а опция speed указывает, что diald должен соединяться с модемом на скорости 115200 bps. Опция modem говорит diald, что на последовательном устройстве находится модем. Без этой опции diald будет считать, что он соединен с удаленной системой напрямую с помощью последовательного кабеля. Если это не так, то вам требуется опция modem. Опция lock сообщает diald, что он должен блокировать серийное устройство во время работы с ним, чтобы предотвратить доступ к нему со стороны других программ. Опция crtscts указывает diald, что необходимо использовать "железный" контроль пересылки по серийному устройству. Это, скорее всего, обязательно при использовании высокоскоростных последовательных соединений. Опция local Указывает IP адрес вашей машины. Точно так же, опция remote указывает IP адрес машины с другого конца соединения. Опция defaultroute указывает diald установить маршрут по умолчанию на соединение, которым управляет diald. Если это через это соединение и происходит ваше подключение к Internet, вам потребуется эта опция. Наконец, последняя строка указывает diald прочитать опции из файла /usr/lib/diald/standard.filter. Эти опции устанавливают набор правил, которые diald будет использовать для определения, когда следует установить соединение и когда разорвать его. Изменение этих правил обсуждается в третьей части этого руководства. Узел со статическим IP адресом, использующий SLIP Предположим, вам надо совершать соединения, используя протокол SLIP, а не PPP. В этом случае строка "mode ppp" необходимо заменить на "mode slip" (если вы используете компрессированный SLIP, напишите "mode cslip"). Предполагая, что ваш скрипт соединения правильно запускает протокол SLIP на удаленной машине, этого может быть достаточно. Однако, обычно требуется установить значение Максимальной Единицы Передачи (MTU) для SLIP-соединения, так как это значение должно быть идентично на обоих концах SLIP-соединения, а значение по умолчанию (1500) может быть неправильным. Предполагая, что значение MTU должно быть 576, может использоваться такой файл /etc/diald.conf: mode slip connect /etc/diald/connect device /dev/ttyS1 speed 115200 modem lock crtscts local 137.130.1.14 remote 137.130.2.44 mtu 576 defaultroute include /usr/lib/diald/standard.filter Узел с динамическим адресом удаленной машины, использующий PPP Теперь предположим, что, когда вы дозваниваетесь до удаленной машины, вы можете соединиться с одним из терминальных серверов, каждый из которых имеет разный адрес. Что выбрать в качестве адреса удаленной машины в конфигурации diald? Ответ любопытен: это неважно. Удаленный адрес, присвоенный интерфейсу -- в действительности лишь локальная метка, которую программа route использует для нахождения нужного интерфейса. Когда маршрутизация установлена, этот адрес более не используется. Таким образом, в вышеуказанной ситуации вы можете выбрать адрес одного из терминальных серверов, с которыми вы соединяетесь, в качестве удаленного адреса. Узел с динамическим локальным адресом, использующий PPP Давайте еще немного усложним ситуацию. Предположим, что вы не только не знаете адреса системы, с которой соединитесь, но и что она может выдавать вам разные адреса при каждом соединении. В этой ситуации вы должны использовать опцию dynamic. Заметьте, что вы все равно должны задать начальный локальный адрес, в противном случае diald не сможет сэмулировать еще не установленное соединение. Этот локальный адрес должен быть взять из одной из подсетей, оставленных специально для приватных IP адресов. Обычно в этом случае можно также "подделать" адрес удаленной системы. Если у вас нет локальной IP-сети, использующей приватные адреса, вы можете просто использовать адреса 192.168.0.1 и 192.168.0.2. Если вы уже используете эти адреса в вашей сети, просто выберите свободные, еще не назначенные вашим машинам адреса. Так может выглядеть минимальный /etc/diald.conf для этого случая: mode ppp connect /etc/diald/connect device /dev/ttyS1 speed 115200 modem lock crtscts local 192.168.0.1 remote 192.168.0.2 dynamic defaultroute include /usr/lib/diald/standard.filter Узел с динамическим локальным адресом, использующий SLIP Ситуация с использованием SLIP с динамическими IP адресами несколько более сложна, из-за того, что протокол SLIP не обеспечивает двум машинам возможности договориться об адресах для обеих точек соединения. Стандартный способ -- когда удаленный SLIP-сервер выдает сообщение, сообщающее адреса, перед тем, как войти в режим SLIP. Ваша машина может прочитать это сообщение перед тем, как перейдет в режим SLIP. Diald способен читать и интерпретировать эти строки, но ему требуется небольшая помощь. В частности, diald не знает заранее, в каком порядке сообщаются локальный и удаленный адреса, или даже появятся ли они оба или только один. Команда dslip-mode позволяет указать, какие адреса будут сообщены и в каком порядке они появятся. Например, если удаленная машина печатает свой адрес, за которым следует ваш локальный адрес, вероятно, с каким-то еще текстом между ними), вы можете использовать следующий минимальный файл /etc/diald.conf: mode slip connect /etc/diald/connect device /dev/ttyS1 speed 115200 modem lock crtscts local 192.168.0.1 remote 192.168.0.2 dynamic dslip-mode remote-local mtu 576 defaultroute include /usr/lib/diald/standard.filter Более сложный пример Рассмотрим теперь более сложный пример, иллюстрирующий несколько более продвинутых опций, о которых вам следует знать. Предположим, у вас есть небольшая сеть, которой были присвоены IP-адреса в сети 137.130.1.0/255.255.255.0, которую необходимо подключить к главному офису с помощью PPP сервера, имеющего адрес 137.130.2.44. Также предположим, что ваша основная работа с Интернетом осуществляется через другое соединение, и что вы хотите маршрутизировать адреса в сети 137.130.2.0/255.255.255.0 через соединение, которым управляет diald. Также допустим, что сервер в главном офисе предоставляет вам выбор адреса локальной машины, потому что вам может потребоваться изменить его, а в главном офисе не желают заниматься переконфигурацией сервера, каждый раз, когда это произойдет. В этом случае следует передать pppd параметр "137.130.1.14:". Наконец, предположим, что у вас имеется несколько модемов на устройствах начиная с /dev/ttyS1 по /dev/ttyS5, и что выходящие звонки должны использовать эти модемы, если они уже не используются. Нижеследующий /etc/diald.conf может использоваться в этом случае. Опции, которые не использовались в предыдущих примерах, обсуждаются ниже. # Общие опции mode ppp accounting-log /var/log/diald.log fifo /etc/diald/diald.ctl pppd-options 137.130.1.14: # Конфигурация устройств connect /etc/diald/connect device /dev/ttyS1 device /dev/ttyS2 device /dev/ttyS3 device /dev/ttyS4 device /dev/ttyS5 rotate-devices speed 115200 modem lock crtscts # Сетевая конфигурация local 137.130.1.14 remote 137.130.2.44 netmask 255.255.255.0 mtu 576 mru 576 window 2048 addroute /etc/diald/addroute ip-up /etc/diald/shipmail # Таймауты redial-backoff-start 4 redial-backoff-limit 300 dial-fail-limit 15 # Стандартная фильтрация пакетов include /usr/lib/diald/standard.filter Опция accounting-log задает файл, в который diald будет писать журнал телефонных звонков, которые он совершает. Если вам не нужен такой журнал, просто не указывайте эту опцию. Опция fifo указывает diald создать управляющий FIFO, называющийся /etc/diald/diald.ctl, который может использоваться для управления выполняемой копией diald. Программы dcntl и diald-top используют этот FIFO, и вообще, несложно написать программу, использующую его. Заметьте, что необязательно, чтобы этот FIFO существовал при старте diald, хотя директория, в которой он создается, (в данном примере -- /etc/diald) обязана существовать. Опция pppd-options задает список из одной и более опции, которую diald будет передавать pppd при запуске. В этом случае передается опция "137.130.1.14:", чтобы pppd знал правильный локальный адрес при установлении соединения. Заметьте, что указано более одной опции device. Каждая задает одно из возможных модемных устройств. Опция rotate-devices указывает diald использовать новое устройство каждый раз, когда он пытается совершить соединение. Это предохраняет от случаев, когда при поломке одного из модемов diald будет заблокирован, постоянно пытаясь использовать один и тот же сломанный модем. Опция netmask устанавливает сетевую маску с локальной стороны PPP-интерфейса. Здесь случае мы устанавливаем маску в 255.255.255.0. Часто diald сам может угадать правильную сетевую маску, зная IP-адрес, но если это не так -- вам надо использовать эту опцию. В отличие от предыдущего примера с режимом PPP, в этом примере мы явно указываем значение MTU. Значение по умолчанию для MTU в режиме PPP равно 1500. Чтобы получить лучшую работу в интерактивном режиме, вы можете задать меньшее значение. В этом примере мы хотим установить MTU на обоих концах соединения в значение 576. Опция mtu задает MTU с этой стороны соединения. Опция mru заставляет diald просить сервер, чтобы тот установил MTU со своей стороны также в значение 576. Опция window также используется для тонкой настройки производительности. В частности, протокол TCP обычно может слать довольно большой размер данных (30-40k) одним пакетом. Такое количество данных может занять ощутимое время при пересылке по модему. Эта опция указывает diald задать размер окна в своих строчках в таблице маршрутизации. Это ограничивает размер пакета данных TCP и может сильно улучшить производительность при интерактивной работе. Смотри также страницу руководства по diald, чтобы прочитать обсуждение правильной установки размера окна. Опция addroute просит diald выполнить скрипт /etc/diald/addroute, когда он готов добавить строки в таблицу маршрутизации. Мы делаем здесь это для того, чтобы настроить маршрутизацию для сети 137.130.2.0/255.255.255.0, что требуется нашими условиями, заданными в начале этого примера. Соответствующий скрипт /etc/diald/addroute выглядит так: #!/bin/sh /sbin/route add -net 137.130.2.0 \ netmask 255.255.255.0 gw $4 \ window 2048 metric $5 dev $1 Опция ip-up указывает diald выполнить скрипт /etc/diald/shipmail каждый раз, когда появляется IP-соединение. В этом случае мы можем предположить, что этот скрипт посылает почту, направленную на адреса в главном офисе. Вы можете заставить этот скрипт совершать при установлении соединения любые действия, которые вам понадобятся. Опции redial-backoff-start, redial-backoff-limit, и dial- fail-limit помогут ограничить количество попыток соединения, которые diald попытается сделать. Опция redial-backoff-start указывает diald начать удвоение времени между звонками после четырех неудачных попыток подряд. Опция redial-backoff-limit указывает diald, чтобы время между неудачными звонками было не более 300 секунд. Наконец, опция dial-fail-limit указывает diald совершать не более 15 неудачных звонков подряд. Если diald совершит 15 неудачных звонков подряд, он прекратит попытки дозвониться, сообщит об этом в системный журнал и будет ждать, пока администратор не даст ему команду возобновить работу. Страница руководства по diald описывает эти опции более подробно. Правила фильтрации Diald постоянно поддерживает виртуальное соединение с удаленной машиной. Это соединение находится в одном из двух режимов: соответствующее физическое соединение должно быть установлено или же оно должно быть разорвано. Когда физическое соединение должно быть установлено, diald будет поддерживать физическое соединение, звоня и перезванивая в случае необходимости. Также он будет отслеживать пакеты, проходящие по виртуальному соединению, чтобы определить, когда следует разорвать физическое соединение. Когда физическое соединение должно быть разорвано, diald будет отслеживать пакеты, проходящие по виртуальному соединению, чтобы определить, что физическое соединение должно быть установлено. Общий подход, используемый diald для определения необходимости переключения режимов, заключается в создании группы "предметов соединения", с каждым из которых связан соответствующий таймаут. Когда таймаут заканчивается, соответствующий предмет удаляется из группы. Когда группа пуста, diald считает, что физическое соединение должно быть разорвано, в противном случае -- что физическое соединение должно быть установлено. В этой секции обсуждаются правила, по которым diald создает группу соединения. Основы правил фильтрации Правила "accept", "bringup", "keepup" и "ignore" управляют добавлением новых предметов соединения в группу. Каждое правило "accept", "bringup" и "keepup" содержит набор условий, которым должен соответствовать пакет, метод, которым пакет преобразуется в предмет соединения, и таймаут. Правила "ignore" содержать только набор условий, которым должен соответствовать пакет. Когда прибывает пакет, соответствующий какому-нибудь правилу "accept", из него создается предмет соединения, предположим, <id>, и этот предмет соединения добавляется в группу с таймаутом, указанным в правиле. Если <id> уже находится в группе, то новый таймаут замещает старый таймаут. Заметьте, что новый таймаут может быть меньше, чем старый таймаут. Каждый оператор "accept", "bringup", "keepup" или "ignore" должен указывать имя протокольного правила. Протокольные правила указывают, как создавать идентификаторы соединений. Содержащийся в дистрибутиве файл /usr/lib/diald/diald.defs содержит следующие четыре определения: prule tcp tcp 9:12:13:14:15:16:17:18:19:+0:+1:+2:+3:9:9:9 prule udp udp 9:12:13:14:15:16:17:18:19:+0:+1:+2:+3:9:9:9 prule icmp icmp 9:12:13:14:15:16:17:18:19:9:9:9:9:9:9:9 prule any any 9:12:13:14:15:16:17:18:19:9:9:9:9:9:9:9 Правила "tcp" и "udp" соответствуют TCP- и UPD-пакетам, и создают идентификаторы соединений, состоящие из протокола пакета, адресов отправителя и получателя, и номеров портов отправителя и получателя. Правила "icmp" и "any" создают идентификаторы, состоящие только из протокола пакета и IP-адресов отправителя и получателя. Важно заметить, что diald не создает идентификаторы соединений прямо из совпавшего пакета. Перед созданием идентификатора diald может поменять местами адреса отправителя и получателя, чтобы меньший адрес всегда находился в поле "адрес отправителя". Это делается для того, чтобы создавался один и тот же идентификатор соединения, несмотря на направление, в котором пакет проходит по интерфейсу. Каждое правило "accept", "bringup", "keepup" и "ignore" также должно указывать набор условий, относящийся к содержимому пакета. Определения переменных позволяют получать доступ к содержимому пакета в операторах "accept" и "reject". Находящийся в дистрибутиве файл /usr/lib/diald/diald.defs определяет переменные для всех полей заголовка IP-пакета, а также для всех полей заголовков TCP-, UPD- и ICMP-пакетов. Имена совпадают с теми, которые используются в #include-файлах, находящихся в /usr/include/linux. Переменные для заголовка IP-пакета таковы: ip.ihl длина заголовка ip.version версия формата ip.tos типа сервиса (type of service) ip.tot_len длина IP-пакета в словах ip.id id пакета ip.frag_off смещение фрагмента ip.ttl время жизни (TTL) ip.protocol ip протокол ip.check контрольная сумма заголовка ip ip.saddr IP-адрес отправителя source address ip.daddr IP-адрес получателя Переменные для заголовка TCP-пакета: tcp.source TCP-порт отправителя tcp.dest TCP-порт получателя tcp.seq номер последовательности TCP tcp.ack_seq подтвержденный номер последовательности TCP tcp.doff tcp смещение данных в словах tcp.fin флаг tcp finish tcp.syn флаг tcp synchronize tcp.rst флаг tcp reset tcp.psh флаг tcp push tcp.ack флаг tcp acknowledge tcp.urg флаг tcp urgent tcp.live состояние соединения TCP Последняя переменная (tcp.live) -- это псевдо-переменная, которую создает diald. Она имеет значение "истина" тогда и только тогда, когда TCP-соединение еще не было завершено. Переменные заголовка UDP-пакета таковы: udp.source UDP-порт отправителя udp.dest UDP-порт получателя udp.len длина заголовка UDP udp.check контрольная сумма UDP-пакета Переменные заголовка ICMP-пакета таковы: icmp.type типа пакета ICMP icmp.code код пакета ICMP icmp.checksum контрольная сумма ICMP-пакета icmp.echo.id ICMP echo id icmp.echo.sequence ICMP echo sequence icmp.gateway ICMP gateway Простые примеры Полезно было бы рассмотреть несколько примеров. Правило accept tcp 10 any указывает "взять любой TCP-пакет и присвоить получившемуся предмету соединения таймаут в 10 секунд. Метод, используемый для создания предметов соединения, специфичен для TCP-пакетов. Правилу accept tcp 10 any соответствует любой TCP-пакет, а таймаут, присвоенный соответствующему предмету соединения, равен 10 секундам. Метод, используемый для генерации предметов соединения, специфичен для TCP-пакетов -- из пакета берется протокол, IP-адрес отправителя и получателя, и номер портов отправителя и получателя. Точно так же, правилу accept any 10 any соответствует любой пакет, а таймаут, присвоенный соответствующему предмету соединения, равен 10 секундам. Более сложному правилу accept tcp 60 tcp.dest=tcp.www,ip.daddr&255.255.0.0=149.100.0.0 соответствует любой TCP-пакет с номером порта отправления, совпадающим с номером TCP-порта для www, который указан в файле /etc/services, а IP-адрес получателя находится в подсети 149.100.0.0. Стандартные правила фильтрации Теперь мы опишем строение большинства правил, находящихся в файле /usr/lib/diald/standard.filter. Вместо того, чтобы приводить полное содержимое этого файла, мы обсудим небольшие группы правил в порядке их появления. Учтите, что для полного понимания некоторых примеров требуется определенное понимание работы протоколов Интернет. Также учтите, что что это описание направлено на то, чтобы помочь вам понять, как писать правила фильтрации. Некоторые правила, находившиеся в реальном файле на момент написания этого руководства, не были в нем упомянуты, и файл мог несколько измениться с тех пор. Это никак не должно повлиять на полезность обсуждения. Заметьте, что порядок, в котором указаны правила фильтрации, критичен. При сравнении пакетов diald будет применять первое подходящее правило. Правила в файле стандартных фильтров разделены на три секции: правила TCP, правила UDP и общий набор правил. Правила TCP Перед дальнейшим описанием правил полезно сделать несколько общих замечаний, касающихся принципов, лежащих в основе этих правил. Вообще, мы хотели бы считать важными с точки зрения таймаутов только данные, проходящие по TCP соединениям. Поэтому мы стараемся игнорировать пакеты без данных. Так как самый короткий набор заголовков в пакете TCP/IP имеет длину в 40 байт, то любой пакет, имеющий такую длину, не содержит данных. Мы можем упустить некоторые пустые пакеты (в IP заголовке может содержаться дополнительная информация о маршрутизации и прочие дополнительные сведения), но большую их часть мы все же получим. Заметьте, что мы не отфильтровываем пакеты с пустым полем tcp.live, так как далее используем их для ускорения разрыва некоторых TCP соединений. Также нам надо убедиться, что WWW пакеты живут даже когда TCP сокет закрыт. Это делается потому, что WWW не удерживает соединение открытым после передачи данных, а постоянно разрывать и устанавливать заново соединение при работе с WWW было бы очень неудобно. Кроме WWW TCP чаще всего используется для длительных соединений, разрыв которых означает, что нам больше не требуется доступ к сети. Необязательно десять минут ждать разрыва соединения, когда нет ни одной сессии telnet или rlogin, поэтому мы хотим ускорит таймаут для закрытых TCP соединений. Это делается с помощью пакетов с очищенным флагом "live." Первое правило сделано, чтобы добавить к продолжительности соединения 15 секунд при установлении TCP соединения. Идея в том, что существует возможность недоступности сети с другой стороны соединения. В этом случае не следует предоставлять соединению целых 10 минут. С помощью нижеуказанного правила мы сначала даем соединению 15 секунд. Если сеть доступна, в течение 15 секунд мы обычно получаем ответ, содержащий данные. Если это вызывает проблемы из-за того, что у вас большое время доступа к машине, с которой вам часто приходится связываться, вы можете увеличить таймаут или удалить это правило. accept tcp 15 tcp.syn Когда у вас работает named, он периодически пересылает определенные данные, чтобы синхронизироваться с другими серверами доменных имен. Так как это может случиться в любой момент, то нежелательно устанавливать для этого соединение. Поэтому мы можем игнорировать любой трафик от доменных серверов или к доменным серверам. ignore tcp tcp.dest=tcp.domain ignore tcp tcp.source=tcp.domain Обычно пакет, устанавливающий соединение, длиннее 40 байт, потому что он содержит TCP опции для установки MSS. Однако, некоторые реализации TCP не используют этих опций. Поэтому мы должны быть аккуратны и не игнорировать SYN-пакеты длиной всего лишь в 40 байт..IP accept tcp 5 ip.tot_len=40,tcp.syn Мы все же хотим игнорировать TCP пакеты длиной в 40 байт, потому что они не содержат данных. Однако, мы не желаем игнорировать 40-байтные пакеты, отмечающие конец соединения, потому что мы используем их для сокращения таймаутов для завершившихся соединений. Таким образом мы должны проверять флаг tcp.live. Если он не установлен, то мы хотим обработать этот пакет в дальнейшем..IP ignore tcp ip.tot_len=40,tcp.live Убедимся, что пересылки по http удерживают соединение в течение двух минут даже после своего завершения. Это избавляет от постоянного дергания соединения. Вам может показаться, что две минуты -- это слишком мало. accept tcp 120 tcp.dest=tcp.www accept tcp 120 tcp.source=tcp.www После того, как TCP-соединение прекращено, мы пытаемся быстро завершить телефонное соединение. Заметьте, что если трубка уже положена, то закрытие соединения (создающее некоторый трафик), не приведет к его повторному звонку. keepup tcp 5 !tcp.live ignore tcp !tcp.live Пересылка данных по FTP обычно создает довольно интенсивный трафик, поэтому можно использовать короткий таймаут. accept tcp 120 tcp.dest=tcp.ftp accept tcp 120 tcp.source=tcp.ftp Наконец, если TCP пакет не соответствует ни одному вышеуказанному правилу, то мы увеличиваем время жизни соединения на 10 минут. Этому правилу соответствует большинство TCP пакетов. accept tcp 600 any Правила UDP Немногие программы общаются посредством UPD пакетов, а те, которые все же делают это, принадлежат к числу программ, ради которых необязательно держать соединение поднятым, потому что они рассылают UDP пакеты каждые несколько минут. Однако, обычно, когда соединение отсутствует, пользователь запускает программу, которой требуется обратиться к серверу доменных имен перед тем, как совершить TCP-соединение. Таким образом, когда в сети появляется пакет, обращенный к DNS, необходимо установить модемное соединение. Все прочие виды UDP пакетов мы явно игнорируем. Не устанавливать соединение для rwho. ignore udp udp.dest=udp.who ignore udp udp.source=udp.who Не устанавливать соединение для пакетов маршрутизации. ignore udp udp.dest=udp.route ignore udp udp.source=udp.route Не устанавливать соединение для NTP или timed. ignore udp udp.dest=udp.ntp ignore udp udp.source=udp.ntp ignore udp udp.dest=udp.timed ignore udp udp.source=udp.timed Не устанавливать соединение для обменов запросами между двумя named'ами. ignore udp udp.dest=udp.domain,udp.source=udp.domain Установить соединение при появлении запроса доменного имени откуда-нибудь кроме named. Запросы к DNS имеют небольшой таймаут. Мы хотим, чтобы они только лишь поднимали соединение, а не держали его, потому что обычно соединение устанавливается по запросу от библиотеки резолвера, но когда оно установлено, мы получаем ответ и устанавливаем TCP соединение. Если соединение не установлено, мы не хотим, чтобы соединение оставалось поднятым из-за предварительного запроса об имени домена. Заметьте, что не следует делать таймаут короче, чем ожидаемое время ответа от сервера DNS. accept udp 30 udp.dest=udp.domain accept udp 30 udp.source=udp.domain Мы обращаемся с широковещательным запросам netbios-ns так же, как и с запросами к DNS. ignore udp udp.source=udp.netbios- ns,udp.dest=udp.netbios-ns accept udp 30 udp.dest=udp.netbios-ns accept udp 30 udp.source=udp.netbios-ns Все прочие UDP пакеты удерживают соединение в течение двух минут. Если вы наблюдаете проблемы, связанные с тем, что какая-либо программа, использующая UDP, удерживает соединение без надобности, вы можете изменить это правило так, чтобы UDP пакеты игнорировались. Конечно, это может привести к проблемам в другом месте. accept udp 120 any Catch All Rules Поймать все пакеты, которые не отфильтровались выше и дать им таймаут в 30 секунд. Чаще всего сюда будут попадать ICMP пакеты с пингами. accept any 30 any Ограничения времени и импульсы Простые ограничения времени Часто случается, что вам хотелось бы использовать разные наборы правил в разное время. Это может быть достигнуто использованием операторов restrict и or-restrict. Например, предположим, что вы хотите, чтобы diald постоянно удерживал соединение в промежутке между 08:00 и 18:00 с понедельника по пятницу, и с 08:00 по 14:00 по субботам, а во все остальное время линия должна быть свободна. Это достигается таким набором правил фильтрации: restrict 08:00:00 18:00:00 1-5 * * or-restrict 08:00:00 14:00:00 6 * * up restrict * * * * * down Заметьте, что оператор "restrict * * * * *" означает, что правило "down" применимо все время. Причиной, по которой этот набор правил работает, является то, что diald использует первое же правило, которому соответствует пакет. В то время, когда применимо правило "up", правило "down" никогда не будет использоваться. В остальное время правило "down" будет единственным использующимся правилом. В качестве более сложного примера предположим, что мы хотели, чтобы вместо того, чтобы в нерабочее время быть постоянно разорванным, соединение устанавливалось бы "по запросу." Вдобавок предположим, что нам также необходимо держать линию свободной в течение 15 минут в конце рабочего дня, чтобы нам могли дозвониться из филиала и обновить базу данных продаж. Это может быть достигнуто следующими правилами фильтрации: restrict 08:00:00 18:00:00 1-5 * * or-restrict 08:00:00 14:00:00 6 * * up restrict 18:15:00 18:30:00 1-5 * * restrict 14:15:00 14:30:00 6 * * down restrict * * * * * include /usr/lib/diald/standard.filter Импульсы Во многих странах телефонные звонки оплачиваются с использованием фиксированных квантов времени, называемых "импульсами". Когда импульс начался, с вас берут деньги за весь импульс. Это означает, что если положить трубку немедленно после начала импульса, то никакой экономии не будет. Diald имеет возможность указать, что используется механизм импульсов, и сделать так, чтобы трубка вешалась только в конце импульса. В качестве примера предположим, что с понедельника по пятницу с 08:00 до 15:00 телефонные звонки оплачиваются импульсами в 3 минуты, в остальное время -- импульсами в 9 минут. Вдобавок, предположим, что первый импульс любого телефонного звонка всегда 3 минуты. Нижеследующие правила, помещенные перед правилами фильтрации в /etc/diald.conf, расскажут diald об этой системе импульсов. restrict 08:00:00 15:00:00 1-5 * * impulse 150,510,30 restrict * * * * * impulse 150,30 Следует проконсультироваться со страницей руководства по diald, чтобы узнать точную семантику команды impulse. Ограничения не всемогущи Существует несколько проблем, которые вы, вероятно, захотите решить, используя временные ограничения, и которые гораздо лучше решаются другими способами. Например, предположим, что вы хотите совершать звонок каждые 30 минут, чтобы забрать свою почту. Вы можете поместить вызов почтовой программы в скрипт ip-up, и написать длинную последовательность правил типа restrict 00:00:00 00:05:00 * * * or-restrict 00:30:00 00:35:00 * * * . . . up Это будет работать, но потребует написания довольно длинной последовательности правил. Более того, эта проблема может быть гораздо лучше решена, используя cron для запуска задания, которое пошлет diald команду "up" в его управляющий fifo, или пошлет ему сигнал SIGUSR1, что равнозначно, Это заставит diald сделать единичную попытку дозвониться, и, если дозвон пройдет успешно, будет запущен скрипт ip-up, в котором и произойдет получение почты. СМОТРИ ТАКЖЕ diald(8), dctrl(1), diald-monitor(5), diald-control(5) АВТОР Eric Schenk (Eric.Schenk@dna.lth.se) ПЕРЕВОД Copyright (C) Alexey Mahotkin 1998-1999 alexm@hsys.msk.ru, http://alexm.here.ru