Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> OpenBSD —> Настройка —> Шлюз: Часть 1

Часть 1 - Простейший маршрутизатор

Автор: BlackCat.


Оглавление

  • Введение
  • Часть 1 - Простейший маршрутизатор
  • 1. Установка соединения с провайдером
  • 1.1. Связка ppp(8) и pppoe(8)
  • 1.2. Использование интерфейса pppoe(4)
  • 2. Включение маршрутизации
  • 3. Трансляция адресов (NAT) с помощью pf(4)
  • 4. Поддержка DNS
  • 5. Настройка узлов внутренней сети
  • 6. Заключение
  • 6.1. Связка ppp(8) & pppoe(8), встроенный NAT
  • 6.2. Интефейс pppoe(4), pf(4)
  • 6.3. Связка ppp(8) & pppoe(8), pf(4) NAT
  • 7. Список литературы

    Введение

    Стала задача - настроить шлюз для выхода небольшой частной сети в интернет. Для выполнения своей основной задачи было решено использовать IP-маршрутизацию и настроить трансляцию адресов. Соединение с провайдером осуществлялось по протоколу PPPoE. Помимо своей основной функции от шлюза требовалось решать следующие задачи:
  • максимальная прозрачность работы NAT;
  • возможность выполнения подключения из внешней сети к узлу внутренней сети (port forwarding);
  • поддержка DNS (разрешение внешних имен, кэширование, поддержка внутренних зон);
  • динамическое конфигурирование узлов внутри сети с использованием DHCP;
  • синхронизация времени в сети с использованием протокола NTP;
  • работа с DynDNS.org (сервис динамического DNS).

    Схема сети показана на схеме 1.

    Схема 1. Схема сети.
    +----------------+          +---------------+                +----------------+
    |                |  a.b.c.d |    OpenBSD    | 192.168.0.254  |  Private LAN   |
    | Internet (ISP) +----------+               +----------------+                |
    |                |          | Router/Server |                | 192.168.0.0/24 |
    +----------------+          +---------------+                +----------------+
     a.b.c.d        - Некоторый адрес, выдаваемый провайдером динамически.
     192.168.0.0/24 - Внутренняя подсеть.
     192.168.0.254  - Внутренний адрес маршрутизатора.
    


    Конфигурация шлюза и подключенных (обслуживаемых) сетей:

  • физические интерфейсы: rl0 - подключен к сети провайдера, rl1 - подключен к внутренней сети;
  • подключенная сеть: 192.168.0.0/24;
  • адрес во внутренней сети: 192.168.0.254;
  • поддерживаемый внутренний домен в DNS: internal.lan;
  • имя узла: gate;
  • пул динамически выделяемых адресов: 192.168.0.32 - 192.168.0.127.

    В качестве базовой была выбрана ОС OpenBSD 4.6 (последняя версия на момент написания).

    Допущения, использованные при написании статьи (отказ от ответственности):
  • статья является одним большим ИМХО, а следовательно - автор ни в коем случае не претендует на объективность;
  • исходя из предыдущего факта, по всему тексту опущены такие обороты как "по моему мнению" и "по мнению автора";
  • в статье практически отсутствуют авторские изыскания - это компиляция (реферат) информации размещенной в свободном доступе;
  • автор рассчитывает на то, что даже если читатель не искушен в настройке подобных узлов (сервера/маршрутизаторы), то он запоминает (записывает), какие изменения вносятся в конфигурационные файлы и всегда сможет откатить всё назад и тем самым восстановить систему;
  • читателю не требуется объяснять, как устанавливается IP-адрес интерфейса (читать hostname.if(5)), и как пользоваться утилитой ifconfig (читать ifconfig(8));
  • читатель различает понятия "не работает соединение" и "почему-то символьные имена узлов не разрешаются в адреса" (читать не работает DNS);
  • в статье не описывается применение специального ПО для обеспечения безопасности, т.к. вероятность атаки сети изнутри была принята минимальной.

    Вот все исходные данные использованные при написании данной статьи.

    Благодарности за помощь в написании статьи:
    Efim <efim.a.efim_dog_gmail_dot_com>

    Часть 1 - Простейший маршрутизатор

                   "Когда орёл летит, забывает ли он о том, что его лапы касались земли?
                   Когда тигр после прыжка настигает свою жертву, забывает ли он о
                   моменте, проведённом в воздухе? Три фунта VAX!"
                                   UNIX-коаны Мастера Фу.

    Если вы еще не читали введение, то настоятельно рекомендуется прочитать его до чтения данного раздела, во избежание недоразумений.

    Для того, что бы поставить и выполнить задачи по настройке простейшего маршрутизатора, необходимо определить какие функции он должен выполнять. Вот примерный список:
  • установка соединения с провайдером (PPPoE);
  • непосредственно сама маршрутизация;
  • трансляция внутренних адресов (NAT);
  • обработка и кэширование DNS-запросов.

    Оформляя каждую функцию в отдельную задачу, рассмотрим их решение.

    1. Установка соединения с провайдером

    Рассмотрим вариант, когда доступ как к внутренней сети провайдера, так и к внешней сети осуществляется через PPPoE-соединение. Примерами такой схемы являются ADSL-подключения и некоторые реализации выделенных каналов. В OpenBSD существуют, как минимум, два способа установления PPPoE соединения [1]:
  • на уровне пользователя: ppp(8) в связке с pppoe(8);
  • с использованием ядра и специального pppoe интерфейса: pppoe(4).

    Забегая вперед, опишу преимущества и недостатки, которыми обладает каждый из способов, помимо очевидных. При использовании связки ppp(8) и pppoe(8), имеется возможность гибкого использования LCP (Link Control Protocol). Основным достоинством здесь является получение в момент установления соединения адресов DNS-серверов провайдера и динамическое обновление файла resolv.conf(5). Так же можно отметить наличие встроенного NAT в ppp(8). Но в процессе тестирования обнаружился один существенный недостаток - ppp(8) ни в какую не хочет восстанавливать оборвавшееся соединение. Что касается интерфейса pppoe(4) ядра, то недостаток тут один, но существенный - невозможно запрашивать DNS-сервера провайдера и автоматически обновлять resolv.conf(5).

    1.1. Связка ppp(8) и pppoe(8)

    Для начала потребуется написать конфигурационный файл /etc/ppp/ppp.conf [2]. Вообще для проверки возможно использовать интерактивный режим, но файл - надежнее.

    Листинг 1.1.1. Конфигурационный файл /etc/ppp/ppp.conf
    #cat /etc/ppp/ppp.conf
    #############################################################
    # PPPoE Internet :-)
    #############################################################
    
    default:
    	Set log Phase Chat LCP IPCP CCP tun command
    	Disable ipv6cp
    
    pppoe:
    # Использовать утилиту pppoe(8)
    	set device "!/usr/sbin/pppoe -i rl0"
    # Настройка MTU & MRU параметров создаваемого интерфейса
    	set mtu max 1492
    	set mru max 1492
    # Указываем, что устройство работает в синхронном режиме
            set speed sync
    # Отключение сжатия заголовков
            disable acfcomp protocomp
            deny acfcomp
    # Запрашивать адреса DNS-серверов
            enable dns
    # Логин/пароль для аутентификации
            set authname user_login
            set authkey secret_pass
    # Добавлять маршрут по-умолчанию через провайдера
            add! default HISADDR
    


    Устанавливаем права доступа (рекомендуется). После этого только владелец ppp.conf (т. е. root) сможет его читать. А, если вы не забыли, там лежит пароль от PPPoE.

    Листинг 1.1.2. Установка прав доступа
    # chmod 600 /etc/ppp/ppp.conf


    Теперь проверяем соединение.

    Листинг 1.1.3. Установка соединения
    # ppp -ddial pppoe
    Working in ddial mode
    Using interface: tun0


    Если соединение работает нормально, можно настроить автоматическое включение при запуске. Для отключения соединения, необходимо послать управляющему демону сигнал HUP.

    Листинг 1.1.4. Автоматическое поднятие интерфейса
    # cat /etc/hostname.tun0
    !/usr/sbin/ppp -ddial pppoe


    На этом можно было бы и закончить, но не могу не упомянуть о включении встроенного NAT в ppp(8). Для этого требуется передать всего один ключ "-nat", т.е. файл для автоматического поднятия PPPoE соединения будет выглядеть следующим образом.

    Листинг 1.1.4. Автоматическое поднятие интерфейса с поддержкой NAT
    # cat /etc/hostname.tun0
    !/usr/sbin/ppp -nat -ddial pppoe
    


    1.2. Использование интерфейса pppoe(4)

    Теперь рассмотрим другой, не совместимый с предыдущим, вариант установления соединения. Интерфейс pppoe(4) по-умолчанию поддерживается ядром, для его создания используем файл следующего содержания.

    Листинг 1.2.1. Создание pppoe(4) интерфейса
    # cat /etc/hostname.pppoe0
    inet 0.0.0.0 255.255.255.255 NONE pppoedev rl0\
     authproto chap authname user_login authkey secret_pass up
    dest 0.0.0.1
    !/sbin/route add default 0.0.0.1
    


    Устанавливаем права на созданный конфигурационный файл интерфейса (опять же, рекомендуется, потому что в нем лежат логин и пароль от PPPoE).

    Листинг 1.2.2. Установка прав доступа
    # chmod 600 /etc/hostname.pppoe0


    И включаем новый интерфейс.

    Листинг 1.2.3. Ручное включение pppoe(4) интерфейса
    # sh /etc/netstart pppoe0
    add net default: gateway 0.0.0.1


    Заметьте, что в данном случае маршрутизатор по умолчанию прописан в hostname.pppoe0 (строчка #3).

    Если вы используете данный тип соединения, то для разрешения имен со шлюза (и только с него) вам потребуется вручную настроить resolv.conf(5). Потребуется указать адрес DNS-сервера, например можно указать сервера провайдера, или локального DNS-сервера.
    В листинге 1.2.4 приведен пример настройки resolv.conf(5), где w.x.y.z и a.b.c.d - IP-адреса DNS-серверов провайдера.

    Листинг 1.2.4. Пример resolv.conf(5)
    # cat /etc/resolv.conf
    # DNS servers list
    nameserver w.x.y.z
    nameserver a.b.c.d
    


    Если вы используете (планируете использовать) сервер имен, запущенный на шлюзе (на том же самом узле) и никаких хитрых настроек производить не собираетесь, то файл /etc/resolv.conf можно оставить пустым - по умолчанию, если не указан ни один DNS-сервер, обращение идет к серверу по адресу 127.0.0.1.

    2. Включение маршрутизации

    Это самый простой этап. Для того, что бы просто включить маршрутизацию IP-пакетов, выполняется следующая команда[1].

    Листинг 2.1. Включение маршрутизации
    # sysctl net.inet.ip.forwarding=1
    net.inet.ip.forwarding: 0 -> 1


    Чтобы маршрутизация включалась при запуске системы, правим sysctl.conf - добавляем или раскомментируем строку "net.inet.ip.forwarding=1"[1].

    Листинг 2.1. Включение маршрутизации при запуске.
    # vi /etc/sysctl.conf
    net.inet.ip.forwarding=1
    


    3. Трансляция адресов (NAT) с помощью pf(4)

    Если вы выбрали вариант со связкой ppp(8) & pppoe(8) и включили NAT в ppp(8) (см. раздел 1.1.1), то данный раздел можно пропустить или просто ознакомиться для общего развития. Использование pf(4) для трансляции адресов имеет ряд преимуществ и, как минимум, один недостаток. Этот недостаток заключается в увеличении общей сложности, т.е. использовании все больших элементов для достижения цели. Положительный момент тоже один, но за то какой: возможность гармонично использовать всю мощь межсетевого экрана (МСЭ) pf(4). Это и навороченная фильтрация, и т.н. проброс портов, и шейпинг - перечислять можно еще пару абзацев. Таким образом, если нужна только трансляция адресов и выбран вариант с ppp(8), то от использования pf(4) можно отказаться, но если требуются еще какой-то функционал МСЭ, а тем более если используется интерфейс pppoe(4), то pf(4) - это то что вам нужно.
    Хороший краткий обзор дан в [5], в этой же статье приведены ссылки на дополнительные материалы для изучения, здесь приведу только простой конфигурационный файл и команды для запуска. Конфигурация pf(4) находится в /etc/pf.conf (pf.conf(5)). Для управления используется утилита pfctl(8).

    Листинг 3.1. pf.conf(5) с поддержкой NAT
    # cat /etc/pf.conf
    ############################################################
    # Simple pf configuration
    ############################################################
    
    #
    # Macroses
    #
    
    # External interface
    if_ext="pppoe0"
    # Internal interface
    if_int="rl1"
    
    #
    # Options
    #
    
    # Soft packet reject
    set block-policy return
    
    # Don't filter loopback traffic
    set skip on lo
    
    #
    #  Translations
    #
    
    # Translate network addresses on external interface
    nat on $if_ext from !($if_ext) -> ($if_ext)
    
    #
    # Filtering
    #
    
    # Default - block all
    block all
    
    # Allow outgoing traffic
    pass out keep state
    
    # Allow all local traffic
    pass quick on $if_int
    


    Данный вариант не лишен многих недостатков, но он работает имеет некоторые настройки безопасности и достаточно краток. Теперь конфигурацию необходимо применить.

    Листинг 3.2. Применения конфигурации
    # pfctl -f /etc/pf.conf


    После проведения данных манипуляций можно проверить работоспособность конфигурации, запустив ping(8) на одном из узлов внутренней сети до узла из внешней сети. Лучше всего проверить доступность DNS-серверов провайдера, используя в качестве адреса назначения IP-адрес DNS-сервера. Во-первых, проверятся работоспособность маршрутизации, соединения, NAT, а во-вторых, использование IP-адреса снимает необходимость в DNS-сервере для разрешения имен, о чем в следующем разделе. Если тестирование прошло нормально, можно проверить применение настроек при запуске системы.

    Листинг 3.3. Проверка применение настроек pf.conf(5) при запуске системы
    # cat /etc/rc.conf | grep "pf"
    pf=YES # Packet filter / NAT
    pf_rules=/etc/pf.conf # Packet filter rules file


    У вас может быть еще куча разных строк, но наличие этих двух свидетельствует о том, что настройки будут применяться после каждого запуска системы. Если вы не обнаружили этих строк, то необходимо прописать их в /etc/rc.conf.local (перед этим стоит почитать rc.conf(5)).

    Листинг 3.4. Включение автоматического запуска pf(4)
    # echo pf=YES >> /etc/rc.conf.local
    # echo pf_rules=/etc/pf.conf >> /etc/rc.conf.local


    4. Поддержка DNS

    Почему важна корректная настройка DNS-серверов можно посмотреть в [4] и [6], только не пытайтесь сразу применять советы из статьи. Итак, как сказано в [4], в поставку OpenBSD начиная в версии 4.0 уже включен настроенный DNS-сервер, все что требуется - это включить его.

    Листинг 4.1. Включение DNS-сервера
    # named


    Теперь можно проверить доступность и работоспособность DNS-сервера на одном из узлов внутренней сети, например с помощью nslookup(1). В случае, если все работает корректно, необходимо включить автоматический запуск.

    Листинг 4.2. Автоматический запуск DNS-сервера
    # echo named_flags="" >> /etc/rc.conf.local


    Существует еще один способ настройки службы DNS - на каждом узле во внутренней сети указать адреса DNS-серверов провайдера и не использовать отдельный сервер на шлюзе, но такая настройка таит множество подводных камней, и необходимо точно знать, что вы делаете и зачем.

    Небольшое лирическое отступление: в стандартной настройке DNS-сервер для разрешения неизвестных имен будет использовать корневые DNS-сервера, а это значит, что вы не привязываетесь к серверам провайдера со всеми вытекающими последствиями:

  • вам не страшны падения внутренних серверов, а также последствия атак на них;
  • если провайдер поддерживает какие-то зоны для внутренних нужд, не относящиеся к общей структуре доменных имен, то они становятся недоступны.

    Самое неожиданное - многие провайдеры практикуют полную блокировку доступа к внешним ресурсам при дебетовой (предоплатной) системе расчётов и исчерпании средств на балансе расчётного счета. А это влечет за собой проблемы с разрешением имен внутренних сервисов, например для того, чтобы пополнить баланс счета с помощью карты оплаты.

    5. Настройка узлов внутренней сети

    Настройка внутренних узлов достаточна проста и сводится к установке шлюза по умолчанию и адреса DNS-сервера. В качестве этих адресов указывается адрес внутреннего интерфейса шлюза. В моем случае, это 192.168.0.254 (см. Схему 1 во введении). Конкретные действия, которые необходимо предпринять, зависят от операционной системы, установленной на конкретном узле, и их описание выходит за рамки данной статьи.

    6. Заключение

    Что бы собрать все воедино рассмотрим несколько возможных контрольных сценариев настройки шлюза в зависимости от выбранных технологий. Более подробное описание шагов описано в соответствующем разделе статьи.

    6.1. Связка ppp(8) & pppoe(8), встроенный NAT

  • Включаем маршрутизацию и сохраняем настройку в /etc/sysctl.conf.
  • Создаем ppp.conf.
  • Запускаем ppp(8), проверяем работу канала со шлюза.
  • Останавливаем ppp(8).
  • Запускаем ppp(8) с включенным NAT.
  • На внутреннем узле указываем шлюз по умолчанию.
  • Проверяем ping по IP-адресу DNS-сервера провайдера на внутреннем узле.
  • Сохраняем настройки соединения в /etc/hostname.tun0.
  • Запускаем DNS-сервер.
  • Проверяем работу DNS-сервера на внутреннем узле.
  • Включаем автоматический запуск DNS-сервера в /etc/rc.conf.local.
  • (Не обязательно) перезагружаем шлюз и смотрим, что забыли указать для запуска вместе с системой.
  • Настройка шлюза завершена, переходим к настройке и тестированию внутренних узлов.

    6.2. Интефейс pppoe(4), pf(4)

  • Включаем маршрутизацию и сохраняем настройку в /etc/sysctl.conf.
  • Создаем /etc/hostname.pppoe0.
  • Запускаем pppoe(4), проверяем работу канала со шлюза.
  • При необходимости, правим /etc/resolv.conf.
  • Создаем /etc/pf.conf.
  • Применяем конфигурацию с помощью pfctl(8).
  • На внутреннем узле указываем шлюз по умолчанию.
  • Проверяем ping по IP-адресу DNS-сервера провайдера на внутреннем узле.
  • Включаем, в случае необходимости автоматическую загрузку правил pf(4).
  • Запускаем DNS-сервер.
  • Проверяем работу DNS-сервера на внутреннем узле.
  • Включаем автоматический запуск DNS-сервера в /etc/rc.conf.local.
  • (Не обязательно) перезагружаем шлюз и смотрим, что забыли указать для запуска вместе с системой.
  • Настройка шлюза завершена, переходим к настройке и тестированию внутренних узлов.

    6.3. Связка ppp(8) & pppoe(8), pf(4) NAT

  • Включаем маршрутизацию и сохраняем настройку в /etc/sysctl.conf.
  • Создаем ppp.conf.
  • Запускаем ppp(8), проверяем работу канала со шлюза.
  • Сохраняем настройки соединения в /etc/hostname.tun0.
  • Создаем /etc/pf.conf.
  • Применяем конфигурацию с помощью pfctl(8).
  • На внутреннем узле указываем шлюз по умолчанию.
  • Проверяем ping по IP-адресу DNS-сервера провайдера на внутреннем узле.
  • Включаем, в случае необходимости автоматическую загрузку правил pf(4).
  • Запускаем DNS-сервер.
  • Проверяем работу DNS-сервера на внутреннем узле.
  • Включаем автоматический запуск DNS-сервера в /etc/rc.conf.local.
  • (Не обязательно) перезагружаем шлюз и смотрим, что забыли указать для запуска вместе с системой.
  • Настройка шлюза завершена, переходим к настройке и тестированию внутренних узлов.

    7. Список литературы

    1. OpenBSD FAQ Part 6 - Networking // http://www.openbsd.org/faq/faq6.html
    2. Настройка PPPoE-клиента с помощью pppoe(8) // http://www.openbsd.ru/docs/steps/pppoe-client.html
    3. Нарезаем трафик ломтиками // http://www.xakep.ru/magazine/xa/087/130/1.asp
    4. PPPoE Router and Firewall // http://openbsd-wiki.org/index.php?title=PPPoE_Router_and_Firewall
    5. Разбираем простой конфиг PF // http://www.lissyara.su/articles/openbsd/pf/pf/
    6. Как правильно настроить DNS // http://www.nbsp.ru/articles/2005/12/14/kak_pravilno_nastroit_dns_chast1.html



    размещено: 2010-03-01,
    последнее обновление: 2011-11-23,
    автор: BlackCat


    mamutoff, 2010-03-02 в 16:36:43

    Первый нах :-)

    orig>Для этого требуется предать всего один ключ "-nat"
    Наверное все-таки "передать.

    А так класс.

    BlackCat, 2010-03-02 в 19:01:49

    Исправил.

    gerk, 2010-03-09 в 14:56:52

    для внутренних зон провайдера в конфиг BIND добавляются
    зоны вида:
    ------------------------------------------------
    zone "<имя зоны>" IN {
       type forward;
       forwarders { <dns сервер провайдера>; };
    };
    ------------------------------------------------

    BlackCat, 2010-03-09 в 15:16:27

    2 grek: этот вопрос в третьей части раскрывается.

    XIX, 2011-03-31 в 8:53:28

    ваше утверждение не совсем верно:
    \"ppp(8) ни в какую не хочет восстанавливать оборвавшееся соединение\"
    я тоже так думал, потом почитал про ppp и теперь соединение восстанавливается при разрыве. Крутить надо:
    enable lqr echo
    set cd 60
    set redial x0 x1 (x0,x1 значения параметров сейчас не помню)

    Keen, 2011-04-29 в 15:43:32

    "6.3. Связака ppp(8) & pppoe(8), pf(4) NAT"

    Связака - это выпускник связного училища? =)

    BlackCat, 2011-04-29 в 15:55:22

    2Keen, он самый: ходит тунели всем в интернеты настраивает, пакеты вручную транслирует - очень полезный человек в штате.
    Вот это внимательность - никто не заметил, даже проверяльщик орфограффии. Вечером исправлю.

    alex, 2011-10-07 в 17:44:42

    2 BlackCat:
    Вечером какого дня и какого года=))?

    BlackCat, 2011-10-08 в 22:55:29

    2 alex: видимо у меня Одесские корни. Если звёзды сойдутся, то этого года.

    BlackCat, 2011-11-23 в 23:20:14

    Fixed.



  •  

      Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
      Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

    © lissyara 2006-10-24 08:47 MSK

    Время генерации страницы 0.0438 секунд
    Из них PHP: 34%; SQL: 66%; Число SQL-запросов: 70 шт.
    Исходный размер: 62785; Сжатая: 13783