Pull to refresh

Web-интерфейс для Iptables

Reading time 4 min
Views 72K
# iptables -t nat -N test
# iptables -t nat -A test -p tcp -j REDIRECT --to-port 80
# iptables -t nat -A test -p tcp -j MASQUERADE
# iptables -t nat -A POSTROUTING -j test
iptables: Invalid argument. Run `dmesg' for more information.
# dmesg | tail -n 1
ip_tables: REDIRECT target: used from hooks POSTROUTING, but only usable from PREROUTING/OUTPUT
# iptables -t nat -A PREROUTING -j test
iptables: Invalid argument. Run `dmesg' for more information.
# dmesg | tail -n 1
ip_tables: MASQUERADE target: used from hooks PREROUTING, but only usable from POSTROUTING


Это пост о программе Iptables и о веб-интерфейсе для неё.

Тем, кто не знаком с такой замечательной программой как Iptables, адресованы две последниие секции поста.

Фабула


http://iptadmin.confmgr.org/

Iptadmin — попытка упростить работу с файрволлом в Linux. На данный момент это простой веб-интерфейс, который умеет работать лишь с несколькими опциями iptables. BSD3.

Преимущества, которые даёт Iptadmin:
  • Отображение списка правил красиво в браузере с нумерацией внутри каждой цепочки. А кое-где даже с подсветкой цветом. Вместо необходимости постоянно набирать iptables -L -vn –line-numbers для контроля правил.
  • Возможность создавать и редактировать правила с помощью курсора мыши и чекбоксов.
  • Где это возможно, предлагаются только правильные варианты входных данных. Ситуация, описанная в начале поста, предупреждена.
  • Автоматическое добавление опций-модулей.
  • Защита от создания правила, которое запрещает доступ к интерфейсу управления по сети.
  • Установка Iptadmin ничего не изменяет и не портит в правилах Iptables. Iptadmin не хранит в системе никакие промежуточные данные. В любой момент можно воспользоваться привычным консольным интерфейсом или вообще удалить Iptadmin.

Минусы программы относительно Iptables:
  • Ещё один постоянно работающий прожорливый демон. Требует для работы порядка нескольких мегабайт памяти. Можно запускать только на время настройки. Но запускать, а потом останавливать демон это лишние телодвижения.
  • Процесс с правами рута слушает по сети. Процесс отлаженный, протестированный, статически типизированный, на высокоуровневом языке без указателей, со сборкой мусора. Но он работает под рутом и слушает сетевой порт.
  • Пока поддерживается только несколько самых часто используемых опций Iptables. Любые нетривиальные правила всё равно придётся задавать из консоли.

Есть ли аналоги?


Похожие программы есть. Но подробного сравнительного анализа не проводилось. Вот несколько ссылок и небольшие комментарии:
  • Модуль для Webmin. Работает на уровне Iptables. Поддерживает все или почти все опции правил. Ломает конфигурационные файлы. Написан на perl. http://doxfer.webmin.com/Webmin/LinuxFirewall.
  • System-config-firewall от Red Hat. Один из лучших GUI для Iptables. Позволяет открывать/закрывать порты, настраивать трансляцию. Но всё скрыто от пользователя. На одну галочку добавляется несколько правил (например, при добавлении интерфейса в список «доверенных»). Нетривиальные правила программа не отображает никак. http://fedoraproject.org/wiki/SystemConfig/firewall
  • Uncomplicated firewall + GUI для Ubuntu. Также высокоуровневый интерфейс, но он проработан хуже чем в System-config-firewall. Перед началом работы предупреждение «все сделанные вручную изменения будут потеряны». http://gufw.tuxfamily.org/.
  • Shorewall. Абстракции над iptables. Конфигурируется всё через текстовые файлы. Написано на perl. http://www.shorewall.net/
  • Firewall Builder — IDE для разработки правил файрволла с трансляцией во множество форматов, в том числе iptables, ipfw, железные файрволлы. Наверное, отличный интструмент для огромных инфраструктур с десятками сетевых экранов. http://www.fwbuilder.org/

Послесловие для тех, кому посчастливилось не знать, что такое iptables


Одним из компонентов ядра операционной системы Linux является сетевой экран. Он позволяет выполнять множество видов фильтрации трафика. Кроме этого в ядре имеется возможность трансляции сетевых адресов. Например, на базе Linux строятся сетевые шлюзы для подключения локальных сетей к интернету.

Пользовательским интерфейсом к сетевому экрану Linux является программа Iptables. Это программа командной строки, она взаимодействует с пользователем посредством текстового терминала. При создании правил необходимо помнить наизусть параметры правил, либо постоянно держать открытой страницу руководства. Также iptables не отличается подробными сообщениями об ошибках входных данных. Некоторые ошибки выводятся только средствами журналирования ядра.

Как это часто бывает с подсистемами Linux, для настройки Iptables практически нужен отдельный специалист (Другие примеры сложных в настройке компонентов: PAM, Selinux, Policy kit).

Типичный workflow при работе с Iptables


Например, мы хотим сделать DNAT с 192.168.1.1:80 на 192.168.0.3:8000 при обращении из подсети 10.0.0.0/16:
# iptables -A POSTROUTING -s 10.0.0.0/16 -d 192.168.1.1 --dport 80 -j DNAT --to-destination 192.168.0.3:8000
iptables v1.4.7: unknown option `--dport'
Try `iptables -h' or 'iptables --help' for more information.

Итак, iptables ничего не знает об опции --dport, для её использования нужно указать опцию -p tcp.
И как мы могли забыть?
# iptables -A POSTROUTING -s 10.0.0.0/16 -d 192.168.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.3:8000
iptables: No chain/target/match by that name.

Iptables ничего не знает о цепочке POSTROUTING. Как так? Перечитываем имя по буквам, вроде без ошибок.
А! Нужно же указать таблицу «nat». По умолчанию iptables использует таблицу «filter».
# iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -d 192.168.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.3:8000
iptables: Invalid argument. Run `dmesg' for more information

Теперь нам нужно почитать dmesg чтобы узнать, что не так на этот раз.
# dmesg | tail
[   44.855055] Bluetooth: BNEP filters: protocol multicast
[   44.891259] Bluetooth: SCO (Voice Link) ver 0.6
[   44.891262] Bluetooth: SCO socket layer initialized
[   45.021718] Bluetooth: RFCOMM TTY layer initialized
[   45.021726] Bluetooth: RFCOMM socket layer initialized
[   45.021728] Bluetooth: RFCOMM ver 1.11
[   93.795558] fuse init (API version 7.14)
[   93.823129] SELinux: initialized (dev fusectl, type fusectl), uses genfs_contexts
[   93.862287] SELinux: initialized (dev fuse, type fuse), uses genfs_contexts
[ 1912.405272] x_tables: ip_tables: DNAT target: used from hooks POSTROUTING, but only usable from PREROUTING/OUTPUT

Ещё одна ошибка. DNAT работает в цепочке PREROUTING, а не POSTROUTING. Наконец, выполняем команду:
# iptables -t nat -A PREROUTING -s 10.0.0.0/16 -d 192.168.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.3:8000
#

Ура! Мы сделали это. Правило DNAT добавлено.
Tags:
Hubs:
+31
Comments 49
Comments Comments 49

Articles