костыль для контроля за pppoe BASH великий и могучий.
Создано: 04-07-2009 20:25:57 изменено: 23-08-2009 13:24:47  Метки: firewall linux nat shorewall sysadmin
Обычно на роутерной конфигурации я использовал самописный скрипт - основанный на туториале:
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
2826 просмотров комментировать

костыль для контроля за pppoe BASH великий и могучий.