Роутер на FreeBSD

Подробная инстукция по установке и настройке роутера на ОС FreeBSD 12.2 при помощи ipfw kernel NAT и dnsmasq.

Исходные данные

Имеем на машине 2 сетевых интерфейса:

em0 — для внешней сети 192.168.1.0/24

em1 — для внутренней сети 192.168.50.0/24

Также у нас есть шлюз во внешней сети. Это маршрутизатор с IP-адресом 192.168.1.1

Наша задача — настроить доступ в Интернет для внутренней сети. Для этого необходимо выполнить несколько этапов:

  • обновить FreeBSD и исходники
  • собрать и установить ядро с поддержкой firewall и NAT
  • включить в загрузку системы необходимые службы и параметры
  • создать правила для firewall и NAT
  • установить и настроить службы dns и dhcp при помощи dnsmasq
  • проверить работу на другой машине в сети

Для начала выкачиваем обновления FreeBSD и устанавливаем их

# freebsd-update fetch
# freebsd-update install

Затем переходим в корень, скачиваем исходники src и распаковываем их





# cd /
# fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/12.2-RELEASE/src.txz
# tar xjf src.txz

После распаковки переходим в каталог конфигурации ядра и копируем ядро по умолчанию в новое — ROUTER

# cd /usr/src/sys/amd64/conf
# cp GENERIC ROUTER

Затем открываем новый конфиг ядра

# vi /usr/src/sys/amd64/conf/ROUTER

исправим ident:

ident		ROUTER

и добавим следующие опции:

options		IPFIREWALL
options		IPDIVERT
options		IPFIREWALL_VERBOSE
options		IPFIREWALL_VERBOSE_LIMIT=5
options		IPFIREWALL_NAT
options		LIBALIAS
options		ROUTETABLES=2
options		DUMMYNET
options		HZ="1000"

Описание добавленных опций:

  • IPFIREWALL — включает поддержку ipfw
  • IPDIVERT — опция для работы NAT
  • IPFIREWALL_VERBOSE — включает логирование работы ipfw
  • IPFIREWALL_VERBOSE_LIMIT=5 — ограничение на количество одинаковых записей в логах, защита от атак
  • IPFIREWALL_NAT — поддержка ipfw NAT
  • LIBALIAS — поддержка библиотек libalias
  • ROUTETABLES=2 — две таблицы маршрутизации
  • DUMMYNET — включение функции шейпера трафика
  • HZ=»1000″ — ускорение работы гигабитного сетевого адаптера

Теперь переходим в каталог /usr/src, собираем и устанавливаем ядро

# cd /usr/src 
# make buildkernel KERNCONF=ROUTER
# make installkernel KERNCONF=ROUTER

После этого в файл /etc/rc.conf необходимо добавить такие строчки:

defaultrouter="192.168.1.1"
gateway_enable="YES"
firewall_enable="YES"
firewall_nat_enable="YES"
firewall_nat_interface="em0"
firewall_script="/etc/ipfw.conf"
natd_enable="YES"
natd_interface="em0"

Также в файл /etc/resolv.conf пропишем IP-адреса DNS-серверов:

nameserver 127.0.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4

Затем в файле /etc/sysctl.conf пропишем необходимые параметры:

для работы ipfw NAT

net.inet.ip.fw.one_pass=1

для ведения логов ipfw

net.inet.ip.fw.verbose=1

и включение ограничений на количество одинаковых записей в логах

net.inet.ip.fw.verbose_limit=5

Теперь создадим файл /etc/ipfw.conf

# touch /etc/ipfw.conf

открываем его

# vi /etc/ipfw.conf

и впишем в него необходимые параметры и правила для firewall и NAT:

exface="em0"
inface="em1"
in_ip="192.168.50.1"
cmd="ipfw -q"

$cmd -f flush
$cmd add 100 allow ip from any to any via lo0
$cmd add 200 deny ip from any to 127.0.0.1/8
$cmd add 300 deny ip from 127.0.0.1/8 to any
$cmd add 400 allow all from any to any via $inface
$cmd nat 1 config log if $exface reset same_ports deny_in
$cmd add 1030 nat 1 ip from any to any via $exface

Сделаем его исполняемым

# chmod u+x /etc/ipfw.conf

Теперь можно запустить службу ipfw

# service ipfw start

или перезагрузить машину

# shutdown -r now

Далее устанавливаем dnsmasq

# pkg install dnsmasq

если использовать порты, то

# cd /usr/ports/dns/dnsmasq/
# make install clean

и внесём его в файл /etc/rc.conf для автоматической загрузки

dnsmasq_enable="YES"

Затем переименуем конфиг dnsmasq по умолчанию, создадим новый и откроем его для редактирования

# mv /usr/local/etc/dnsmasq.conf /usr/local/etc/dnsmasq.conf.old
# touch /usr/local/etc/dnsmasq.conf
# vi /usr/local/etc/dnsmasq.conf

сделаем его содержание примерно таким:

domain-needed
bogus-priv
interface=em1
resolv-file=/etc/resolv.conf
dhcp-range=192.168.50.31,192.168.50.130,24h
cache-size=150

Можно теперь запустить службу dnsmasq

# service dnsmasq start

Проверяем на другой машине. На борту Windows 7 и установленный Chrome. Сетевые настройки тянет с DHCP:

Откроем Состояние сети и убедимся в правильности подтянутых настроек

Открываем Chrome и входим в Интернет

Если всё это получилось, значит dnsmasq работает правильно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *