Re: firewalls (was: ipchains)
> А зачем писать их все руками?
Когда-то был написан один, а в дальнейшем все остальные писались с него
исправлениями под конкретные нужды. ;)
Надо было очень быстро поставить 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
Reply to: