> А зачем писать их все руками? Когда-то был написан один, а в дальнейшем все остальные писались с него исправлениями под конкретные нужды. ;) Надо было очень быстро поставить firewall'ы на несколько хостов. Там одна RH7.x была, так я посмотрел на тот default'ный шкрыпт для firewall'а (shell'овый), что там есть .. так жутко стало. Одноразовый он больно. Тяжело его перенести на другой хост, а тем более на его базе сделать сразу для нескольких. А потом уже просто написал один базовый, с которого уже всегда дописываю под конкретные нужды.
В ferm мне синтаксис очень понравился. Очень наглядный и понятный. И писать проще. Один из рабочих вариантов приложу к письму, поизучайте, кому будет интерестно, может и пригодится. ;) Это прямо со своей машинки ("woody",2.4.18), у нее реальный ip. forwarding'а нет. Там еще мне было лень вправлять локальные порты в соответствии с "http://www.iana.org/assignments/port-numbers" - работает, и так сойдет. :) Некогда. И не охвачены tcp с флагом "rst", но они бывают очень редко, пока сильно не допекало. :) До других (более навороченых) конфигов для ferm просто сейчас "стучаться" долго. Эо не как самое универсальное решение (хотя по крайней мере для меня в большинстве случаев так), просто как вариант. :) > > Конфиг кидается в /etc, перестраиваем firewall только руками (генерим, > > проверяем, запускаем, сохраняем), а для woody используем > > /etc/init.d/iptables load/save :) Я имел в виду так: текущий firewall хранится в /var/lib/iptables/active, Оттуда грузится при загрузке хоста, туда сохраняется вместе со счетчиками. ipac-ng запускается после iptables. Иначе ip-accounting на нем нормально работать не будет. Если надо что-то исправить - вправляю /etc/ferm.conf, потом генерю, проверяю, если что-то очень критично и работаю удаленно - то на at или cron вешаю восстановление оригинального firewall'а минут эдак через 15, чтобы себя не заблокировать, если все нормально - /etc/init.d/iptables save active. > А вот на эту фичу я посмотрел, почитал комментарии мейнтейнера и > последовал его совету - не использовать, а использовать что-нибудь > другое. А можно линку где он это пишет или хотя бы направление поисков ? Я только что попробовал - сам не нашел. А стало интерестно. Не спроста ж ведь он так :) > В данном случае развил свой старый /etc/init.d/firewall IMHO, в potato. Потому как там специальных скриптов для менеджмента firewall'а (типа /etc/init.d/iptables) не видел - потому свой писать надо. > Впрочем ferm в набор рекомендуемых ВМЕСТО /etc/init.d/iptables > инструментов вполне себе входит. Большой "минус" - медленно генерит правила. Потому как perl. При загрузке хоста это время может оказаться критично. И еще один - если в момент изменения firewall'а произойдет краш (мало ли .. питание отключат а в УПС в этот же момент "боинг" попадет), то есть риск что firewall будет частично недостроен из-за ошибок в конфиге (сохранили еще не доделаный), а последствия могут быть самые разные, от "ничего" вплоть до весьма неприятных. WBR, Burzumie.
#!/usr/bin/ferm # variables # interfaces set IF_WAN eth0 # local IP-addresses and networks connected to them set IP_WAN <some real ip> set NET_LAN <some real net, local to this host> # local port-ranges set PORTS_LOCAL 1024:65535 set PORTS_PRIV 1:1023 set PORTS_UNPRIV 1024:65535 # global directives option iptables option clearall option createchains # TCP input/LAN chain TCP_from_LAN proto tcp { # new and eslablished connections mod state state (NEW, ESTABLISHED, RELATED) ACCEPT; # closing TCP-connections tcp-flags (SYN,ACK,FIN,RST) (ACK,FIN) ACCEPT; LOG logprefix "TCP from LAN:"; REJECT; } # TCP_from_LAN # UDP input/LAN chain UDP_from_LAN proto udp { ACCEPT; } # UDP_from_LAN # TCP input/WAN chain TCP_from_WAN proto tcp { # --- #dport echo LOG log-tcp-sequence logprefix "to port 7:"; # new incoming connections dport ( ssh smtp http ) mod state state NEW ACCEPT; # established connections mod state state (ESTABLISHED, RELATED) ACCEPT; # closing TCP-connections tcp-flags (SYN,ACK,FIN,RST) (ACK,FIN) ACCEPT; LOG logprefix "TCP from WAN:"; DROP; } # TCP_from_WAN # UDP input/WAN chain UDP_from_WAN proto udp { # reply from outgoing DNS sport domain dport (domain,$PORTS_LOCAL) ACCEPT; # ICQ sport (4000,5190) dport $PORTS_LOCAL ACCEPT; # traceroute sport 32769:65535 dport 33434:33523 ACCEPT; # NTP sport ntp dport ($PORTS_LOCAL,ntp) ACCEPT; LOG logprefix "UDP from WAN:"; DROP; } # UDP_from_WAN # TCP output/LAN chain TCP_to_LAN proto tcp { # new and established connections mod state state (NEW, ESTABLISHED, RELATED) ACCEPT; # closing TCP-connections tcp-flags (SYN,ACK,FIN,RST) (ACK,FIN) ACCEPT; LOG logprefix "TCP to LAN:"; REJECT; } # TCP_to_LAN # UDP output/LAN chain UDP_to_LAN proto udp { ACCEPT; } # UDP_to_LAN # TCP output/WAN chain TCP_to_WAN proto tcp { # --- #sport echo LOG log-tcp-sequence logprefix "from port 7:"; # outgoing new,established,masqueraded connections and passive FTP mod state state (NEW, ESTABLISHED, RELATED) ACCEPT; # closing TCP-connections tcp-flags (SYN,ACK,FIN,RST) (ACK,FIN) ACCEPT; LOG logprefix "TCP to WAN:"; REJECT; } # TCP_to_WAN # UDP output/WAN chain UDP_to_WAN proto udp { # outgoing DNS requests sport (domain,$PORTS_LOCAL) dport domain ACCEPT; # traceroute sport 32769:65535 dport 33434:33523 ACCEPT; # NTP sport ntp dport ntp ACCEPT; # ICQ dport (4000,5190) ACCEPT; LOG logprefix "UDP to WAN:"; REJECT; } # UDP_to_WAN # ICMP chain ICMP_from_LAN proto icmp { goto allicmp; RETURN; } chain ICMP_from_WAN proto icmp { goto allicmp; RETURN; } chain ICMP_to_LAN proto icmp { goto allicmp; RETURN; } chain ICMP_to_WAN proto icmp { goto allicmp; RETURN; } chain allicmp proto icmp { icmptype (ping,pong,destination-unreachable,source-quench, time-exceeded,parameter-problem) ACCEPT; RETURN; } ### # built-in chains chain OUTPUT table mangle { outerface $IF_WAN { protocol tcp { # rapid response protocols dport (ssh,ftp) settos min-delay TOS; # keep these from timing out dport (http,nntp,smtp,domain) settos max-reliability TOS; # bulk stuff dport ftp-data settos max-throughput TOS; RETURN; } settos min-cost TOS; # RETURN; } RETURN; } # traffic, received by this host chain INPUT table filter policy ACCEPT { # local communications interface lo ACCEPT; # WAN interface $IF_WAN daddr ! $NET_LAN { LOG logprefix "dst WAN-> INPUT(filter):"; DROP; }; # LAN saddr $NET_LAN { protocol tcp goto TCP_from_LAN; protocol udp goto UDP_from_LAN; protocol icmp goto ICMP_from_LAN; LOG logprefix "proto LAN-> INPUT(filter):"; REJECT; } # goto WAN_bl; protocol tcp { # Syn-flood protection syn mod limit limit 3/s ACCEPT; # port-scanning protection tcp-flags ( SYN,ACK,FIN,RST ) RST mod limit limit 1/s ACCEPT; } # Ping-of-death protection protocol icmp icmp-type echo-request mod limit limit 3/s ACCEPT; saddr (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 224.0.0.0/4, 240.0.0.0/5, 255.255.255.255/32) { LOG logprefix "src WAN-> INPUT(filter):"; DROP; }; protocol tcp goto TCP_from_WAN; protocol udp goto UDP_from_WAN; protocol icmp goto ICMP_from_WAN; LOG logprefix "end of INPUT(filter):"; DROP; } # traffic generated by this host chain OUTPUT table filter policy ACCEPT { # local communications outerface lo ACCEPT; saddr ! $IP_WAN { LOG logprefix "src ->WAN OUTPUT(filter):"; REJECT; } daddr $NET_LAN { protocol tcp goto TCP_to_LAN; protocol udp goto UDP_to_LAN; protocol icmp goto ICMP_to_LAN; LOG logprefix "proto ->LAN OUTPUT(filter):"; REJECT; } daddr (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 224.0.0.0/4, 240.0.0.0/5, 255.255.255.255/32) { LOG logprefix "dst ->WAN OUTPUT(filter):"; REJECT; }; protocol tcp goto TCP_to_WAN; protocol udp goto UDP_to_WAN; protocol icmp goto ICMP_to_WAN; LOG logprefix "end of OUTPUT(filter):"; REJECT; } # blacklist chain WAN_bl { RETURN; } # end