Всем привет!
Небольшая заметка о настройке шлюза на FreeBSD с NAT.
Более 10 лет использую FreeBSD в различных инсталляциях, как правило в 90% случая использую FreeBSD как шлюз, начиная с версии 4.11.
В данный момент для себя решил, что проще и возможно дешевле использовать шлюзом готовые решения такие как MikroTik.
В таком решение есть как плюсы, так и минусы.
Но это все не по теме:)Итак, дано:
- FreeBSD 11.2-RELEASE-p3
- Сетевой интерфейс em0 IP 4.4.4.4 — смотрит в мир (WAN)
- Сетевой интерфейс em1 IP 192.168.33.1 — смотрит в локальную сеть (LAN)
Если вы имеете реальную сеть смаршрутизировунную провайдером на вашем WAN интерфейсе, то сделать шлюзом FreeBSD очень просто, достаточно добавить в /etc/rc.conf запись об этом:
gateway_enable="YES"
И перезагрузить сервер, либо применить настройки на лету с помощью sysctl
# sysctl net.inet.ip.forwarding=1
На клиентах указываем шлюзом наш LAN интерфейс (только он у нас будет не с адресом BOGON сети, а с реальным) и пакеты начинают идти.
Но в 90% мы имеем сеть с /29 (255.255.255.248) маской с доступными 5 адресами (откидываем бродкаст адрес и адрес шлюза), поэтому нам остается только NAT
Пишем:
# vi /boot/loader.conf net.inet.ip.fw.default_to_accept=1
Для того, чтобы не потерять доступ к машине при конфигурировании IPFW (можно по другому, но в моем случае оно не работает, дальше увидите почему)
# vi /etc/rc.conf gateway_enable="YES" #sysctl net.inet.ip.forwarding=1 firewall_enable="YES" firewall_logging="YES" firewall_script="/etc/fw.sh" natd_enable="YES" natd_interface="em0"
Добавляем скрипт с правилами FireWall (IPFW):
# vi /etc/fw.sh #!/bin/sh wan="em0" lan="em1" wan_int="4.4.4.4" lan_int="192.168.33.1" ipfw="/sbin/ipfw -q" # Сбрасываем все правила: ${ipfw} -f flush ${ipfw} -f pipe flush ${ipfw} -f queue flush ${ipfw} add allow ip from any to any via lo0 ${ipfw} add deny ip from any to 127.0.0.0/8 ${ipfw} add deny ip from 127.0.0.0/8 to any ${ipfw} add divert natd ip from any to any via em0 ${ipfw} add allow ip from any to any
Делаем его исполняемым:
# chmod +x /etc/fw.sh
Если есть физический доступ к консоли, то запускаем:
# /etc/netstart
Если сделаете так удаленно, то потеряете доступ к серверу, т.к. запрещающее default правило IPFW сработает самым первым и отрубит вам доступ, в реальном времени не получится сделать команду для изменения поведения IPFW с Deny all на Allow all:
# kenv net.inet.ip.fw.default_to_accept=1
Поэтому перезагружаем сервер должно все работать, команда ipfw show покажет вам счетчики правил.
P.S. это сырой пример, firewall открыт для всех и всего, перед эксплуатацией обязательно дополните конфиг (/etc/fw.sh) нужными вам правилами, последней строкой должна быть команда запрещающая все и всем deny log ip from any to any!
firewall_enable= «YES»
firewall_type= «OPEN»
firewall_nat_enable= «YES»
firewall_nat_interface= «em0»
>>Если сделаете так удаленно, то потеряете доступ к серверу, т.к. запрещающее default правило IPFW сработает самым первым и отрубит вам доступ, <<<
Добавляем в конфиг ipfw две строки и не отрубает. Прямо указываем разрешение на разрешение работы по 22 порту (SSH)
# — блок открытия 22 порта для ssh.
${ipfw} add allow tcp from any to me 22
${ipfw} add allow tcp from me 22 to any
Так же, для того что бы IPFW не отрубил доступ по удаленке, можно его запустить отдельно командой.
# kldload ipfw && ipfw add 65530 allow ip from any to any
Это загрузит ядерный модуль ipfw сразу с указанием правила «все открыть».