Библиотека сайта 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
