Наши партнеры








Книги по Linux (с отзывами читателей)

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