Мы — долго запрягаем, быстро ездим, и сильно тормозим.
|
||||||||||||||||||||
www.lissyara.su
—> статьи
—> OpenBSD
|
|
Конфигурация шлюза и подключенных (обслуживаемых) сетей:
физические интерфейсы: 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
|
Устанавливаем права доступа (рекомендуется). После этого только владелец 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
|
1.2. Использование интерфейса pppoe(4)
Теперь рассмотрим другой, не совместимый с предыдущим, вариант установления соединения. Интерфейс pppoe(4) по-умолчанию поддерживается ядром, для его создания используем файл следующего содержания.
Листинг 1.2.1. Создание pppoe(4) интерфейса
|
Устанавливаем права на созданный конфигурационный файл интерфейса (опять же, рекомендуется, потому что в нем лежат логин и пароль от 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)
|
Если вы используете (планируете использовать) сервер имен, запущенный на шлюзе (на том же самом узле) и никаких хитрых настроек производить не собираетесь, то файл /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. Включение маршрутизации при запуске.
|
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
|
Данный вариант не лишен многих недостатков, но он работает имеет некоторые настройки безопасности и достаточно краток. Теперь конфигурацию необходимо применить.
Листинг 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
Комментарии пользователей [10 шт.]