FreeBSD

FreeBSD: Настройка ipfw + kernel nat

ADVERTISEMENT

Подбирал конфиг под себя, так что его можно использовать в целях ознакомления.

Ядро не пересобирал, на стандартном GENERIC

В /etc/rc.conf добавляем строчки:

ADVERTISEMENT
# Включаем Firewall
firewall_enable="YES"
# Указываем файл с правилами
firewall_script="/etc/rc.firewall"
# Включаем лог
firewall_logging="YES"
# Включаем nat
firewall_nat_enable="YES"
# Если нужно ограничить скорости интернета у пользователей
#dummynet_enable="YES"

Добавляем в /etc/sysctl.conf

net.inet.ip.fw.verbose=1
net.inet.ip.fw.verbose_limit=100
net.inet.ip.fw.one_pass=0

Редактируем rc.firewall до такого вида:

#!/bin/sh

# Задаём строку для обращения к ipfw.
ipfw="/sbin/ipfw -q"

# Сетевая карта в которую вставлен провод от провайдера.
LanOut="vr0"
IpOut="1.2.3.4"

# Сетевая карта "смотрящая" во внутреннюю сеть.
LanIn="nfe0"
IpIn="192.168.20.254"

# IP адрес машины во внутренней сети.
HOME="192.168.20.1"
HOME2="192.168.20.2"

# Внутренняя подсеть.
NetIn="192.168.20.0"

# Сетевая маска внутренней подсети.
NetMask="24"

# Если до выполнения этого сценария в фаерволе
# были какие-то правила - сбрасываем их.
${ipfw} -f flush

# Создаём таблицу с пользователями, которым разрешен доступ в Интернет.
#  Если в таблице 0 были какие-то значения - сбрасываем их.
${ipfw} -f table 0 flush

# В эту таблицу будем добавлять тех, кому будет разрешен доступ в интернет.
${ipfw} table 0 add 192.168.20.1
${ipfw} table 0 add 192.168.20.2
${ipfw} table 0 add 192.168.20.3
${ipfw} table 0 add 192.168.20.4
${ipfw} table 0 add 192.168.20.5
# Если нужно больше адресов - добавляем больше.

# Создаём таблицы Fail2ban.
sshd_ban_table="table(50)"
proftpd_ban_table="table(51)"
exim_ban_table="table(52)"
wordpress_ban_table="table(53)"

# Сбрасываем все ограничители.
${ipfw} -f pipe flush

# Сбрасываем все очереди.
${ipfw} -f queue flush

# Далее простой firewall.

# Fail2ban.
${ipfw} add 10 deny tcp from ${proftpd_ban_table} to me 21 via ${LanOut}
${ipfw} add 11 deny tcp from ${sshd_ban_table} to me 22 via ${LanOut}
${ipfw} add 12 deny tcp from ${exim_ban_table} to me 25 via ${LanOut}
${ipfw} add 13 deny tcp from ${wordpress_ban_table} to me 80 via ${LanOut}

${ipfw} add 2000 check-state

${ipfw} add allow ip from any to any via lo0
${ipfw} add deny ip from any to 127.0.0.1/8
${ipfw} add deny ip from 127.0.0.1/8 to any

# block unuseful traffic.
${ipfw} add deny ip from any to 10.0.0.0/8 in via ${LanOut}
${ipfw} add deny ip from any to 172.10.0.0/12 in via ${LanOut}
${ipfw} add deny ip from any to 192.168.0.0/16 in via ${LanOut}
${ipfw} add deny ip from any to 0.0.0.0/8 in via ${LanOut}
${ipfw} add deny ip from any to 169.254.0.0/16 in via ${LanOut}
${ipfw} add deny ip from any to 240.0.0.0/4 in via ${LanOut}

# Запрещаем фрагментированные ICMP.
${ipfw} add deny icmp from any to any frag

# Запрещаем широковещательные ICMP на интерфейсе подключенном к Интернет.
${ipfw} add deny icmp from any to 255.255.255.255 in via ${LanOut}
${ipfw} add deny icmp from any to 255.255.255.255 out via ${LanOut}

# Конфигурируем проброс портов через IPFW NAT.
${ipfw} nat 1 config if ${LanOut} log reset same_ports unreg_only 
 redirect_port tcp ${HOME}:51414 51414 
 redirect_port tcp ${HOME2}:51415 51415

# Теперь определяем какие пакеты будут проходит NAT.
${ipfw} add nat 1 all from table(0) to any out via ${LanOut}
${ipfw} add nat 1 all from any to ${IpOut} in via ${LanOut}


# Запрещаем пакеты с адресами частных сетей на интерфейсе подключенном к Интернет.
${ipfw} add deny ip from 10.0.0.0/8 to any out via ${LanOut}
${ipfw} add deny ip from 172.16.0.0/12 to any out via ${LanOut}
${ipfw} add deny ip from 192.168.0.0/16 to any out via ${LanOut}
${ipfw} add deny ip from 0.0.0.0/8 to any out via ${LanOut}

# Так же запрещаем автоконфиг. частной сети.
${ipfw} add deny ip from 169.254.0.0/16 to any out via ${LanOut}

# Запрещаем мультикаст-рассылки на интерфейсе подключенном к Интернет.
${ipfw} add deny ip from 224.0.0.0/4 to any out via ${LanOut}

# Разрешаем самому маршрутизатору ходить в Интернет.
${ipfw} add allow ip from ${IpOut} to any out via ${LanOut}

# Разрешаем все установленные соединения.
${ipfw} add allow tcp from any to any established

# UDP трафик от сервера.
${ipfw} add allow udp from ${IpOut} to any out via ${LanOut}

# UDP трафик к серверу на порт 51413 (Transmission).
${ipfw} add allow udp from any to ${IpOut} 51413 in via ${LanOut}

# Доступ к DNS серверу.
${ipfw} add allow udp from any to ${IpOut} 53 in via ${LanOut}
${ipfw} add allow udp from ${IpOut} 53 to any out via ${LanOut}
${ipfw} add allow udp from any 53 to ${IpOut} in via ${LanOut}
${ipfw} add allow udp from ${IpOut} to any 53 out via ${LanOut}

# Разрешаем серверу собирать статистику с устройств в Интернете "Cacti".
${ipfw} add allow ip from any 161 to ${IpOut} in via ${LanOut}

# Разрешаем входящие TCP и UDP на те IP, которые имеют доступ к Интернет.
${ipfw} add allow udp from any to table(0) in via ${LanOut}
${ipfw} add allow tcp from any to table(0) in via ${LanOut}

# Разрешаем ICMP запросы типов 0,8,11 .
${ipfw} add allow icmp from any to any icmptypes 0,8,11

# Разрешаем FTP с ограничением в 10 .
${ipfw} add allow tcp from any to ${IpOut} 20,21 in via ${LanOut} setup limit src-addr 10

# Разрешаем входящие соединения на порт SSH с ограничением в 2 .
${ipfw} add allow tcp from any to ${IpOut} 22 in via ${LanOut} setup limit src-addr 2

# Открываем 25 порт, есть почтовый сервер.
${ipfw} add allow tcp from any to ${IpOut} 25 in via ${LanOut} setup

# Доступ в DNS серверу.
${ipfw} add allow tcp from any to ${IpOut} 53 in via ${LanOut} setup

# Доступ к 80,443 порту, на сервере крутится сайт.
${ipfw} add allow tcp from any to ${IpOut} 80 in via ${LanOut} setup
${ipfw} add allow tcp from any to ${IpOut} 443 in via ${LanOut} setup

# Iperf для теста скорости.
${ipfw} add allow tcp from any to ${IpOut} 5001 in via ${LanOut} setup

# Выпускаем icecast2 в Интернет.
${ipfw} add allow tcp from any to ${IpOut} 8000 in via ${LanOut} setup

# Доступ с Интернета к web интерфейсу Transmission.
${ipfw} add allow tcp from any to ${IpOut} 9091 in via ${LanOut} setup

# Разрешаем любые ICMP запросы на внутреннем сетевом интерфейсе.
${ipfw} add allow icmp from any to any via ${LanIn}

# Разрешаем трафик внутренней сети на внутреннем интерфейсе.
${ipfw} add allow ip from ${NetIn}/${NetMask} to any via ${LanIn}
${ipfw} add allow ip from any to ${NetIn}/${NetMask} via ${LanIn}

# Запрещаем всё и пишим в лог.
${ipfw} add 65534 deny log all from any to any

Fail2ban блокирует тех, кто лезет на 21, 22, 25, 80 порты.

Перезагружаем firewall

# /etc/rc.d/ipfw restart
net.inet.ip.fw.enable: 1 -> 0
net.inet6.ip6.fw.enable: 1 -> 0
Firewall rules loaded.
Firewall logging enabled.
#

ADVERTISEMENT
Подписаться
Уведомить о
guest

9 Comments
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии