Роутер на 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
и добавим следующие опции:
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 пропишем необходимые параметры:
и включение ограничений на количество одинаковых записей в логах
net.inet.ip.fw.verbose_limit=5
Теперь создадим файл /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
Теперь можно запустить службу ipfw
Далее устанавливаем dnsmasq
если использовать порты, то
# cd /usr/ports/dns/dnsmasq/ # make install clean
и внесём его в файл /etc/rc.conf для автоматической загрузки
Затем переименуем конфиг 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
Проверяем на другой машине. На борту Windows 7 и установленный Chrome. Сетевые настройки тянет с DHCP:
Откроем Состояние сети и убедимся в правильности подтянутых настроек
Открываем Chrome и входим в Интернет
Если всё это получилось, значит dnsmasq работает правильно.