http://www.opennet.ru/docs/RUS/iptables/
однако некоторые недостатки подобного фаервола - трудности с добавлением новых сервисов, блокирования нежелательных адресов, отслеживания блокированных соединений, необходимость в шейпинге - заставили меня искать более гибкое решение. Свой выбор я остановил на shorewall.
Постановка задачи:
Есть роутер с двумя интерфейсами eth0 - смотрит в интернет, и ath0 - wifi интерфейс смотрящий на локальную сеть, надо ограничить доступ из интернета на роутер и обеспечить доступ сети в интернет.
Ставим (система Debian Etch):
aptitude install shorewall
После установки в /etc/shorewall лежит только конфиг shorewall.conf и Mаkefile. Это сделано специально. Нужные шаблоны файлов конфигурации можно найти в
/usr/share/doc/shorewall/examples/two-interfaces/. Скопируйте нужные Вам файлы из этой директории в /etc/shorewall и отредактируем копии.
Начнем по-порядку:
в файле interfaces поставим в соответствие зоны и интерфейсов.
tail -n4 /etc/shorewall/interfaces
#ZONE INTERFACE BROADCAST OPTIONS inet eth0 detect tcpflags,blacklist,nosmurfs,logmartians wifi ath0 detect blacklist,maclist,nosmurfs,dhcp #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
Про опции в этом файле написано, объясню три из них:
- blacklist - "черный" список блокированных адресов (/etc/shorewall/blacklist) если в опциях интерфейса есть - то адрес будет проверятся по этому списку
- maclist - список соответствия мак-адресов ip-адресам
- dhcp - если на интерфейсе раздаются адреса по dhcp или получаем адрес, необходимо указывать эту опцию
в файле zones указываются настройки зон.
tail -n6 /etc/shorewall/zones
#ZONE TYPE OPTIONS IN OUT # OPTIONS OPTIONS fw firewall wifi ipv4 inet ipv4 #LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE
Здесь объявлено 3 зоны: fw - это сам роутер, wifi - беспроводная сеть, inet - интернет.
Далее необходимо определить политики по умолчанию для перехода из зоны в зону:
grep '#SOURC' /etc/shorewall/policy; grep -v ^$ /etc/shorewall/policy|grep -v ^#
#SOURCE DEST POLICY LOG LEVEL LIMIT:BURST wifi inet ACCEPT wifi $FW REJECT info wifi all REJECT info $FW inet ACCEPT $FW wifi ACCEPT $FW all ACCEPT inet $FW DROP info inet wifi DROP info inet all DROP info all all REJECT info
Здесь определены следующие политики:
- разрешено соединение из локалки в инет
- соединение из локалки на роутер отвергается с записью в лог-файл
- соединение из локалки во все остальное отвергается с записью в лог-файл
- ну и т.д.
последним правилом стоит отвергать все другие запросы на соединение (Shorewall требует наличия такой политики, применимой для всех остальных запросов).
Далее нужно разрешить SNAT для локалки:
tail -n3 /etc/shorewall/masq
#INTERFACE SUBNET ADDRESS PROTO PORT(S) IPSEC eth0 ath0 #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
Да кстати, для того чтоб все работало надо разрешить форвардинг в конфиге:
grep 'IP_FORWAR' /etc/shorewall/shorewall.conf
IP_FORWARDING=On
Теперь приступим к настройке правил файервола:
grep '^#ACTIO' /etc/shorewall/rules; grep -v ^$ /etc/shorewall/rules|grep -v ^#
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL DNS/ACCEPT $FW inet #запросы с роутера на ДНС SSH/ACCEPT wifi $FW #SSH из локалки Ping/ACCEPT wifi $FW #PING из локалки Ping/REJECT inet $FW #PING из инета ACCEPT $FW wifi icmp #icmp в локалку ACCEPT $FW inet icmp #icmp в инет SSH/ACCEPT inet:xx.xx.xx.xx-xx.xx.xx.xx $FW #SSH из инета на роутер HTTP/ACCEPT inet $FW #сайтег VNC/ACCEPT inet:xx.xx.xx.xx $FW #проброс VNC порта в локалку DNAT inet wifi:192.168.x.x tcp 5900 #vnc REDIRECT wifi 3128 tcp www - !192.168.x.x #permanent proxy DNS/ACCEPT wifi $FW #ДНС запросы на кэш. роутера HTTP/ACCEPT wifi $FW #сайтег из локалки ACCEPT wifi:192.168.x.x $FW:192.168.x.x tcp 111 #NFS ACCEPT wifi:192.168.x.x $FW:192.168.x.x tcp 2049 #NFS ACCEPT wifi:192.168.x.x $FW:192.168.x.x udp #NFS
Готовые макросы, использованные в этом конфиге:
ls /usr/share/shorewall/macro.*
Так теперь соответствие мак-адресов ip-адресам:
tail -n5 /etc/shorewall/maclist
#DISPOSITION INTERFACE MAC IP ADDRESSES ACCEPT ath0 00:80:48:xx:xx:xx 192.168.x.x #comp ACCEPT ath0 00:11:95:xx:xx:xx 192.168.x.x #nout # (Optional) #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
Чтобы после случайной остановки файервола не тащить монитор и клаву к роутеру пропишем еще:
tail -n3 /etc/shorewall/routestopped
#INTERFACE HOST(S) OPTIONS ath0 - #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
Ну вот вроде-бы и все:
ls /etc/shorewall/
blacklist interfaces maclist Makefile masq policy routestopped rules shorewall.conf zones
Теперь тестируем конфигурацию:
shorewall check
И если все нормально делаем:
пробуем конфиг:
shorewall try
стартуем:
shorewall safe-restart
Тут есть особенность - после запуска конфигурации идет запрос на сохранение - если все нормально и консоль не висит - жмем y. Если висим - через 60 сек. идет откат.
Да еще что-бы shorewall запустился при старте системы надо поправить /etc/default/shorewall - прописать startup=1.
Полезняшки:
shorewall hits
- показывает кол-во сброшенных соединений
shorewall show connections
- показывает текущие соединения
links:
http://www.shorewall.net/3.0/traffic_shaping_ru.html
http://www.shorewall.net/standalone_ru.html
http://www.uptimebox.ru/2007/10/traffic-shapingcontrol-shorewall.html