[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: