воскресенье, 2 июня 2013 г.

Как же подгружать правила iptables через Network Manager?

Network Manager - пожалуй, самая ненавистная всеми вещь, которую я, несмотря на общественное мнение, с удовольствием использую.

Так вот, в ней есть замечательная вещь - в ответ на разные события, связанные с интерфейсами, он способен запускать скрипты, которые лежат в /etc/NetworkManage/dispatcher.d, и это можно использовать, в том числе, для подгрузки правил iptables. Самое главное, чтобы скрипт был 1) обычным файлом; 2) владельцем был root; 3) не был доступен на запись кому-то еще; 4) не был suid; 5) разрешен для исполнения владельцем (короче, права должны быть не более разрешающими, чем 755).
Все подробности о том, как этот скрипт исполняется и какие параметры получит, можно выгрести в man NetworkManager(8). Единственная печаль - он не получает никакого имени профиля настроек для интерфейса, а только его имя.
Но уже имея это, можно сунуть пару простых скриптов для настройки IPv4 или IPv6 фильтров (просто сменив iptables на ip6tables):

1:  if [ -x /usr/bin/logger ]; then  
2:      LOGGER="/usr/bin/logger -s -p daemon.info -t FirewallHandler"  
3:  else  
4:      LOGGER=echo  
5:  fi  
6:  case "$2" in  
7:      up)  
8:          if [ ! -r /etc/iptables.rules ]; then  
9:              ${LOGGER} "No iptables rules exist to restore."  
10:              return  
11:          fi  
12:          if [ ! -x /sbin/iptables-restore ]; then  
13:              ${LOGGER} "No program exists to restore iptables rules."  
14:              return  
15:          fi  
16:          ${LOGGER} "Restoring iptables rules"  
17:          /sbin/iptables-restore -c < /etc/iptables.rules  
18:          ;;  
19:      down)  
20:          if [ ! -x /sbin/iptables-save ]; then  
21:              ${LOGGER} "No program exists to save iptables rules."  
22:              return  
23:          fi  
24:          ${LOGGER} "Saving iptables rules."  
25:          /sbin/iptables-save -c > /etc/iptables.rules  
26:          ;;  
27:      *)  
28:          ;;  
29:  esac  
Скрипт нужно назвать, например, /etc/NetworkManager/dispatcher.d/01firewall и обязательно установить разрешения 0755.

UFW - Ubuntu firewall - такая нужная вещь? :)

Была как-то давно мысль посмотреть на все эти фронтенды к iptables, написанные для "упрощения жизни". Да, возможно, не все могут понимать синтаксис правил iptables, всю его гибкость и мощь, так что им нужно пользоваться чем-то более простым. Итак, сейчас речь пойдет про ufw - Ubuntu-фронтенд к iptables.
Наверное, использовать именно его - самый простой способ "защититься". Включается он просто -

$ sudo ufw enable


По-умолчанию он запрещает весь входящий траффик и разрешает исходящий:

$ ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip

Теперь посмотрим, что же стоит за всем этим...

На самом деле ufw создает примерно полтора десятка разных цепочек iptables, рассовывая по ним кучу разных правил, так что разобраться, что же сломалось после его применения будет в разы сложнее:

# iptables -L -v -n
Chain INPUT (policy DROP 2 packets, 64 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  344 31500 ufw-before-logging-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  344 31500 ufw-before-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
   23  2608 ufw-after-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    5   160 ufw-after-logging-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    5   160 ufw-reject-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    5   160 ufw-track-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ufw-before-logging-forward  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ufw-before-forward  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ufw-after-forward  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ufw-after-logging-forward  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ufw-reject-forward  all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  254 23653 ufw-before-logging-output  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  254 23653 ufw-before-output  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
   56  3591 ufw-after-output  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
   56  3591 ufw-after-logging-output  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
   56  3591 ufw-reject-output  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
   56  3591 ufw-track-output  all  --  *      *       0.0.0.0/0            0.0.0.0/0          

Что радует (или огорчает) - он по-умолчанию сразу разрешает DHCP запросы, так что хотя-бы DHCP-клиент у вас ломаться не должен. Одновременно с этим он разрешает и сервис avahi. Все остальное нужно разрешать самим. Кроме того, он настраивает логирование заблокированных пакетов, так что в dmesg или syslog они будут.

Как же после этого разрешать что-либо?

$ sudo ufw allow 22/tcp

Просто разрешить ssh. Или только себе, скажем:
 
$ ufw allow from 172.20.1.4 to any port 22 proto tcp

На этом моменте начинает казаться, что ufw писали фанатики синтаксиса ipfw. :)

Дальше - хуже. Удобства от ufw кончаются, как только вам нужно что-то более сложное, например, nat. Тут вам придется таки учить синтаксис iptables:

/etc/ufw/before.rules:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 172.16.0.0/24 -o eth0 -j MASQUERADE
COMMIT

Такие вот дела, может кому-нибудь и нужен такой малофункциональный фронтенд к пакетному фильтру. У него есть одно достоинство - он загружает и сохраняет правила, что обычно является проблемой. А если кто не хочет и хочет что-то посложнее, в следующей заметке я расскажу, как ноутбучным и десктопным пользователям к NetworkManager прикрутить загрузку правил iptables.