Подбирал конфиг под себя, так что его можно использовать в целях ознакомления.
Ядро не пересобирал, на стандартном 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. #