# -*- shell-script -*-
#
# Конфигурация фаерволла для домашнего сервера
#
#
# Задаем интерфейсы у меня фактически их 3,
# два физических и один PPP.
# Для удобства объединяем все внешние интерфейсы в DEV_WORLD
@def $DEV_WORLD = (ppp0 eth0);
@def $DEV_PPP = ppp0; # PPP интерфейс
@def $DEV_CORBINA = eth0; # Внешний интерфейс на провайдера
@def $DEV_PRIVATE = eth2; # Внутренний интерфейс
# Задаем внутреннею подсеть
@def $NET_PRIVATE = 172.16.77.0/24;
# ferm позволяет делать скрипты
# Ниже приведен пример использования, небольшой
# скрипт для проброса портов во внутреннюю сеть
# через DNAT
@def &FORWARD_TCP($proto, $port, $dest) = {
table filter chain INPUT interface $DEV_WORLD proto $proto dport $port ACCEPT;
table nat chain PREROUTING interface $DEV_WORLD proto $proto dport $port DNAT to $dest;
}
# Примеры использования скрипта проброса
#
# &FORWARD_TCP(tcp, http, 192.168.1.2);
# &FORWARD_TCP(tcp, smtp, 192.168.1.3);
# &FORWARD_TCP((tcp udp), domain, 192.168.1.4);
table filter {
chain INPUT {
policy DROP;
# connection tracking
mod state state INVALID DROP;
mod state state (ESTABLISHED RELATED) ACCEPT;
# Разрешить локальные соединения
interface lo ACCEPT;
# Разрешить ping
#proto icmp icmp-type echo-request ACCEPT;
# Делаем корзинку для icmp пакетов на случай попытки DOS.
# Корзина 100 пакетов, смотка корзины по 20 пакетов в секунду
protocol icmp mod limit limit 20/sec limit-burst 100 ACCEPT;
# Разшаем сервисы на всех интерфейсах
proto tcp dport (ssh http https smtp ftp) ACCEPT;
# Разрешаем DNS (TCP и UDP)
proto (udp tcp) dport domain ACCEPT;
# Разрешаем rtorrent
proto tcp dport 57000 ACCEPT;
interface $DEV_WORLD {
# Для того чтобы работал IPsec
proto udp dport 500 ACCEPT;
proto (esp ah) ACCEPT;
# Некоторые IRC требуют чтобы было
proto tcp dport auth ACCEPT;
proto tcp dport (8080 3128) REJECT;
}
# Правила для CorbinaTV разрешаем IGMP и мультикастовую сетку
interface $DEV_CORBINA {
proto igmp ACCEPT;
daddr 224.0.0.0/4 ACCEPT;
}
# Только для внутренней сети
interface $DEV_PRIVATE {
#Разрешаем Samba в домашней сети
proto (tcp udp) dport (netbios-ns netbios-dgm netbios-ssn) ACCEPT;
#Разрешаем Cherokee Admin
proto tcp dport 9090 ACCEPT;
}
# Остальное отбрасывается (DROP) согласно политики выше
}
# Исходящие соединения не лимитируем
chain OUTPUT policy ACCEPT;
chain FORWARD {
policy DROP;
# Отслеживам mtu на на всем протяжонности пути
# Для Кобины обычно надо
proto tcp tcp-flags (SYN RST) SYN TCPMSS clamp-mss-to-pmtu;
protocol icmp {
# Делаем корзинку для icmp пакетов на случай попытки DOS.
# Корзина 100 пакетов, смотка корзины по 20 пакетов в секунду
mod limit limit 20/sec limit-burst 100 ACCEPT;
DROP; #По умолчанию ICMP отбрасывается, если не выполняется правило выше
}
# connection tracking
mod state state INVALID DROP;
mod state state (ESTABLISHED RELATED) ACCEPT;
# Разрешить соединения из внутренней сети
# в интернет и другие сети
interface $DEV_PRIVATE ACCEPT;
# Разрешаем форвард мультикастинга для CorbinaTV
interface $DEV_CORBINA {
daddr 224.0.0.0/4 ACCEPT;
}
# Остальное отбрасывается (DROP) согласно политики выше
}
}
table nat {
chain POSTROUTING {
# Разрешаем маскарадинг для приватной подсети
saddr $NET_PRIVATE outerface $DEV_WORLD MASQUERADE;
}
}
table mangle {
chain PREROUTING {
policy ACCEPT;
# Для Corbina TV сбрасываем TTL
daddr 224.0.0.0/4 protocol udp TTL ttl-inc 1;
}
}
# emule на werebear77
#&FORWARD_TCP(tcp, 24662, 172.16.77.1);
#&FORWARD_TCP(tcp, 24711, 172.16.77.1);
#&FORWARD_TCP(udp, 24672, 172.16.77.1);
# lDC++ на werbear77
#&FORWARD_TCP(tcp, 26230, 172.16.77.1);
#&FORWARD_TCP(udp, 28017, 172.16.77.1);