Конфигурация фаерволла для домашнего сервера c помощью ferm

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# -*- 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);