Шлюз (NAT) + DHCP-сервер на OpenBSD

В этой статье я хочу рассказать о своём опыте создания шлюза на базе операционной системы (ОС) OpenBSD, так как, по-моему, это оптимальное решение для большинства организаций, офисов и, в особенности, для дома. Здесь я не буду давать подробные теоретические выкладки, коих и так полно в Интернете и документации, а просто постараюсь кратко и лаконично изложить основные шаги для достижения цели.

Содержание:

Введение

Итак. Почему я выбрал в качестве основы для сервера (шлюза) именно систему OpenBSD, а не какую-то другую? Этот выбор не случайный, а вполне обоснованный, и причин для выбора данной ОС более чем достаточно. Дело в том, что до OpenBSD мне приходилось работать со многими системами (DOS, Windows, Linux, Lindows, BeOS, FreeBSD и т.д.), однако ни одна из них меня настолько не впечатлила своей простотой, целостностью, гибкостью и надёжностью как OpenBSD.
Для начала давайте определимся чего мы хотим, что конкретно и как должен делать наш сервер. Если это обычный шлюз (типа "мост"), то достаточно просто включить перенаправление сетевого трафика с одной сетевой карты на другую и всё. Делается это правкой всего двух-трёх конфигурационных файлов. Если же наш сервер должен выполнять ещё какие-то функции, то это уже сложнее, но не намного.

Установка

Возьмём более или менее стандартную ситуацию. Допустим нам нужно просто-напросто соединить локальную сеть провайдера, типа 10.135.62.0 (класса A), провод от которой приходит к нам в дом или офис, и нашу внутреннюю (локальную) сеть Ethernet, типа 172.18.7.0 (класса B), которая проложена по офису или квартире. Адреса сетей могут быть и другими (и других классов), это несущественно. Практически то же самое представляет собой соединение через ADSL- или кабельный модем, который имеет обычный сетевой выход и выполняет функцию роутера. Плюс к этому, для уменьшения точек (узлов) настройки и облегчения администрирования, на шлюз мы поставим DHCP-сервер, который будет автоматически назначать адреса всем компьютерам локальной сети. Теперь, когда задача ясна, приступим к её решению.
Для этого понадобится сделать всего 4 шага:

  1. собрать компьютер для нашего шлюза (возьмём старый IBM PC Pentium II).
  2. установить и настроить саму ОС (мы будем ставить OpenBSD 4.8 для платформы i386).
  3. настроить пересылку пакетов (трансляцию трафика) между сетевыми интерфейсамию.
  4. настроить сервер DHCP (DHCPD).

На выполнение всех этих действий уйдёт всего несколько минут! Итак, приступим.

Оборудование

Для шлюза можно взять любой старый компьютер (например, приготовленный на выброс или списанный в утиль) или, при его отсутствии, покупаем такой компьютер через Интернет или у знакомых (или берём старьё в другой организации). Стоит он копейки, или даже совсем ничего не стоит, так как это хлам. Также, можно собрать такую машину из старых запчастей, которых в организациях и у компьютерщиков, обычно, навалом! Не забудьте поставить в него 2 сетевые карты (ведь сети у нас 2).

Операционная система

Дальше скачиваем с официального сайта http://openbsd.org/ последний стабильный релиз OpenBSD (ISO-образ) и записываем его на CD или DVD (ну или на другой носитель, если Вы будете ставить систему с него). Затем вставляем этот диск в наш будущий сервер и устанавливаем с него OpenBSD. Для полноценного понимания установки можете прочитать статью Установка OpenBSD 4.5

Сетевые настройка

Теперь у нас есть действующий сервер с уже работающими и подключёнными сетевыми интерфейсами, если конечно Вы их правильно настроили при установке. Если нет, тоже не так страшно, просто отредактируйте конфигурационные файлы сетевых карт типа /etc/hostname.fxp0 и /etc/hostname.rtl0 (здесь предполагается, что наши сетевые карты определены как fxp0 и rtl0). Посмотреть список всех подобных файлов можно командой ls, например:

# ls /etc/hostname.*

Чтобы убедиться в правильности настроек, можно вывести параметры всех сетевых интерфейсов с помощью команды ifconfig, например так:

# ifconfig -a

Или же просто пустить ping на те адреса, которые вы указали в настройках, например:

# ping 10.135.62.26

10.135.62.26 - IP-адрес от Вашего провайдера или модема.
# ping 172.18.7.1

172.18.7.1 - IP-адрес Вашего внутреннего интерфейса.

Если проверка прошла успешно, переходим к настройкам трансляции сетевого трафика между нашими сетями (NAT).

NAT

Для трансляции сетевого трафика между нашими сетями (NAT) достаточно включить forwarding (пересылку) в файле /etc/sysctl.conf:

net.inet.ip.forwarding=1   # для протокола TCP 4-й версии
net.inet6.ip6.forwarding=1 # для TCP 6-й версии, если она используется

А также настроить встроенный пакетный фильтр (pf) на работу в качестве NAT (Network Address Translation). Делается это в файле конфигурации /etc/pf.conf с помощью параметра nat-to, например так:

pass out on $ext_if from 172.18.7.0/16 nat-to 10.135.62.26

В данном случае мы перенаправляем весь трафик из внутренней (локальной) сети 172.18.7.0 на адрес провайдера (или модема) 10.135.62.26.
Обратите внимание на переменную $ext_if. Вместо неё должно быть подставлено название внешнего интерфейса (который подключён к сети провайдера). Обычно она определяется в самом начале pf.conf примерно следующим образом:

ext_if="fxp0" # если fxp0 имеет адрес 10.135.62.26, как в нашем примере

Ну вот и все настройки NAT-а в OpenBSD. Как видите это делается правкой всего двух конфигов, в которые нужно дописать по одной строчке. Простота и доступность - главные преимущества систем BSD!

Автозагрузка

Осталось только добавить NAT (точнее pf) в автозагрузку. Самый простой способ это сделать - найти и изменить строчку типа "pf=" в файле /etc/rc.conf, должно быть так:

pf=YES

После перезагрузки Вы увидите, что pf был запущен и настроен, а следовательно, все пользователи локальной сети могут подключаться к сети провайдера и наслаждаться доступом в Интернет!

DHCPD

Ну и последний штрих в настройке нашего сервера - включение и настройка DHCPD. Эта штука позволит нам автоматически раздавать IP-адреса, ограничивать количество компов в сети, а также изолировать некоторые компьютеры в отдельные сетевые группы не вставая из-за консоли сервера. Причём все настройки делаются в одном единственном файле - /etc/dhcpd.conf, например так:

option domain-name-servers 10.135.62.2;
 
 subnet 172.18.7.0 netmask 255.255.0.0 {
 
  routers 172.18.7.1;
 
  range 172.18.7.130 172.18.7.190;
 
 }

В этом примере мы указываем общий для всех DNS-сервер 10.135.62.2, затем создаём подсеть (блок адресов) из 60 адресов (с 172.18.7.130 по 172.18.7.190) и прописываем для неё шлюз (маршрутизатор) 172.18.7.1. Таким образом, компьютеры локальной сети, при обращении к нашему серверу будут получать свободный адрес из указанного диапазона, шлюз 172.18.7.1 и DNS-сервер 10.135.62.2. И таких подсетей можно сделать сколько угодно с разными настройками.
Если же в этот диапазон попал, например, принтер или просто требуется жёсткая привязка компьютера к какому-то IP-адресу, тоже не проблема. Нужно всего лишь указать MAC-адрес сетевой карты этого компа и выделить ему IP, например так:

host static-client {
 
hardware ethernet 00:12:25:2a:3c:17;
fixed-address 172.18.7.150;
 
}

Таким образом мы делаем постоянную привязку IP-адреса 172.18.7.150 к MAC-адресу 00:12:25:2a:3c:17. То есть только компьютер (или принтер) с MAC-ом 00:12:25:2a:3c:17 будет получать IP-шник 172.18.7.150, он будет для этой машины зарезервирован. И, опять же, таких привязок можно сделать сколько угодно, хоть на всю подсеть, например так:

subnet 172.18.7.0 netmask 255.255.0.0 {
 
  routers 172.18.7.1;
 
  range 172.18.7.130 172.18.7.190;
 
 host static-client {
 
   hardware ethernet 00:12:25:2a:9c:12;
   fixed-address 172.18.7.140;
 
 }
 
 host static-client1 {
 
   hardware ethernet 00:12:25:2a:3c:17;
   fixed-address 172.18.7.150;
 
 }
 
 host static-client2 {
 
   hardware ethernet 00:12:25:4b:3c:45;
   fixed-address 172.18.7.160;
 
 }
 
}

В этом примере зарезервированы 3 адреса: 172.18.7.140, 172.18.7.150, 172.18.7.160.
В завершение включаем автоматический запуск данного демона (службы) всё в том же /etc/rc.conf следующей строчкой:

dhcpd_flags=""

Её просто нужно найти и поменять значение параметра.

Ну вот и всё. После перезагрузки компьютера Вы увидите запуск всех настроенных демонов (сервисов), а проверить их работу и состояние можно с помощью команды pgrep, например:

# pgrep -lf dhcpd

При этом на экран будет выведен номер процесса (PID) и ссылка на сам DHCP-сервер. Аналогично проверяется работа и других сервисов (демонов), запущенных в OpenBSD.

Для более расширенной настройки DHCPD демона прочтите следующую статью ISC-DHCP

Заключение

Как видите в создании сервера (шлюза) на базе операционной системы OpenBSD нет ничего сложного и страшного. Попробуйте, у Вас обязательно получится!

Калегин Сергей Николаевич
май 2011 года

Дополнительные материалы
Ваша оценка: Нет Средняя: 3.3 (43 голоса)

P.S. ВАЖНО!

так как автор не добавил эту информацию придётся сделать мне.
бывает редко но не взлетел dhcp =( или у провайдера чёто стряслось

В случае если на сервере не запущен named то на клиентских компьютерах надо в поле DNS указать пограничный DNS сервер, или настраивать named самим

как это сделать куча статей но самый простой вариант

vi /etc/rc.conf

named_enable="YES"

Затем надо указать в named.conf наш шлюз, для этого:

Надо найти строки listen-on и forwarders и добавьте адрес внутреннего интерфейса (который) 172.18.7.1
а вообще автор молодец спс за статью =)

vi /etc/namedb/named.conf

listen-on { 127.0.0.1; 172.18.7.1;};
forwarders { 127.0.0.1; 172.18.7.1;};

и в /etc/resolv.conf добавим днс сервер гугла =)
/etc/resolv.conf

search	local
domain	local
nameserver	127.0.0.1
nameserver	8.8.8.8

всё теперь у нас свой днс который зависит от гуглового днса =)
ЗЫ если кому vi не юзерфрендли то ставим то что нравится nano ee mcedit каждому своё =)
а вообще автор молодец спс за статью =)

Страховочный DNS-сервер

Спасибо за дополнение! Однако для страховки работы DNS не обязательно поднимать ещё один сервак на шлюзе (что ведёт к допнагрузке и уменьшению стабильности работы). Достаточно дописать дополнительные адреса в поле domain-name-servers в файле /etc/dhcpd.conf, например так:

option domain-name-servers 10.135.62.2, 8.8.8.8; (адресов может быть много)

Вот здесь подробно расписано как это сделать:
http://www.bsdadmin.ru/index.php/manuals/112-dhcpdconf-dhcpd-.html

Или же можно прописать их на клиентских машинах в файле /etc/resolv.conf после параметра nameserver следующим образом:

nameserver 10.135.62.2
nameserver 172.18.7.1
nameserver 8.8.8.8
nameserver 34.52.107.18

И так сколько угодно. Можно брать любые открытые DNS-сервера (с внешними адресами), например разных провайдеров и т.д. Но при большом количесве различных машин в сети это не очень удобно. Зато супер надёжно! ;-)

www.pfsense.org

если лень всё настраивать, может тогда уже проще поставить PfSense или Vyatta и не морочить голову?

rc.conf.local

vi /etc/rc.conf - в опёнке не переписывают, как и в фри /etc/defaults/rc.conf, для этого в опёнке создаётся /etc/rc.conf.local, и в него вписываются требуемые переменные. Во фри - да, стандартный рц.конф, в опёнке - нет.
Сама статья ничего, начинающие поймут, но не стоит их учить сразу плохому этикету, с точки зрения опёнка. При обновлении системы - файл рц.конф просто перезапишется, и человеку потом просто трудно будет вспомнить, где и что он менял. А рц.конф.локал - при обновлениях не заменяется.

Плагиат да и только

тогда есть вопрос а если у меня провайдер по тунелю при каждом соединении дает новый ИП ?? че тогда ??

Внешний динамический IP

Если вы подключены к провайдеру через ADSL-модем, тогда просто укажите локальный адрес этого модема вместо 10.135.62.26. Если же вы подключены к сети прова напрямую, то нужно настроить внешнюю сетевушку на работу с DHCP (смотрите man hostname.if), а затем прописать название этого сетевого интерфейса вместо IP 10.135.62.26. Посмотреть названия и адреса всех сетевых интерфейсов можно командой ifconfig -a

Спасибо за статью. Давно

Спасибо за статью. Давно дкмал, как сделать из своего ПК свой Сервер.
Благодарю за Просвещение!

Последние статьи

Новые комментарии

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer