Продолжаем настраивать iptables
Продолжаем настраивать защиту нашего компьютера на Linux c помощью фаервола iptables. Основные начальные настройки были приведены в предыдущей статье. Пока мы рассматривали только способы фильтрации только tcp-пакетов. Теперь можно рассмотреть icmp-протокол. Правила обработки таких пакетов в iptables должны содержать в себе параметр -p со значением icmp. Можно указывать тип пакета с помощью опции —icmp-type. Типы могут быть различными: echo-request, echo-reply и т.д. (полный список всех типов можно узнать с помощью команды /sbin/iptables -p icmp -h). Отдельное внимание стоит уделить типу ответа на фильтрованные запросы. К примеру, мы можем сделать так, чтобы iptables отвечал любому компьютеру, который пытается вас пропинговать, что наш узел недоступен, либо permission denied. Сделать это можно с помощью опции —reject-with, значением которой будет, тип ответа на запрос. В итоге получаем правило:
# /sbin/iptables -A input -s ! 192.168.0.1 -p icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-prohibited
Восклицательный знак, разделенный пробелом со значением параметра, означает, что правило распространяется на все пакеты, кроме тех, которые удовлетворяют данному параметру. В нашем случае, проброс icmp-пакетов с доверенного ip адреса 192.168.0.1 будет разрешен.
Немного паранойи
Наверное коллеги админы или стажеры, у вас не раз выпрашивали шелл. Конечно, давать доступ к своей машине – не самая приятная вещь. Мало ли чего они там понаделают. Но нет нерешаемых задач! Снова используем iptables. Он имеет встроенный модуль iptables_owner.so, который может закрывать соединения по uid, gid, pid, cmd и прочим атрибутам пользователя. Как вы понимаете, модуль обрабатывает OUTPUT-цепочку. Посмотрим, как это реально выглядит на практике. Заводим в системе тестового пользователя tables с уидом 4000:
# /usr/sbin/useradd tables -s /bin/bash -u 4000
Наша задача: сделать так, чтобы пользователь не мог пользоваться Интернетом через наш шелл( мы же параноики :))). Правило будет выглядеть следующим образом:
# /sbin/iptables -A OUTPUT -m owner --uid-owner 4000 -j REJECT
Теперь заходим под пользователем tables и пробуем соединиться по телнету куда-нибудь. Проверяем, что правило работает как мы и задумали.
Маскарад в iptables
Iptables, как и ipchains, умеет организовывать маскарадинг (т.е. заменять локальный IP-адрес на глобальный). С помощью NAT можно пропустить в Интернет через свой сервер все машины из локальной сети. Собственно, за NAT отвечает модуль iptables_nat.so. В нем содержатся три цепи: PREROUTING, OUTPUT и POSTROUTING. В POSTROUTING записываются адреса, которым разрешено маскарадиться. Это происходит следующим образом:
# /sbin/iptables -t nat -A POSTROUTING -s 192.168.0.1 -j MASQUERADE
Вообще, для доступа к цепям NAT достаточно добавить к правилу параметр -t со значением nat. Чтобы осуществить редирект с одного порта на другой (например, насильно перенаправить пользователя с 80 на 3128 порт текущей машины), следует добавить в цепь PREROUTING следующую запись:
# /sbin/iptables -t nat -A PREROUTING -s 192.168.0.1 -p tcp --destination-port 80 -j REDIRECT --to-port 3128
После такой команды порт назначения 80 будет меняться на 3128, т.е. пользователи будут пользоваться WWW только через прокси-сервер (естественно, предварительно установленный на машине).
А что с трафиком?
Весь трафик, прошедший через машину, фаервол записывает в контейнеры правил. Их можно просмотреть с помощью опции -v (verbose). Iptables покажет количество пакетов и суммарный трафик, обработанный каждым правилом.
Иногда возникает необходимость периодического обнуления контейнеров. Это реализуется командой:
# /sbin/iptables -Z 'цепь'
Где «цепь» — имя цепочки, которую надо обнулить.
Сохраняем настройки
Для того, чтобы корректно сохранить настройки фаервола, необходимо выполнить команду service iptables save. Все правила запишутся в файл /etc/sysconfig/iptables и подгрузятся при следующем запуске компьютера. Если мы что-то сделали неправильно, то команда service iptables reload загрузит старые правила из этого же файла.
Следует убедиться, что iptables находится в автозапуске. Для этого выполни команду chkconfig —list | grep iptables. Если iptables отобразится, значит, все ок.
Подведем итоги
Первоначальная цель достигнута — мы получили достаточно информации, чтобы грамотно настроить фаервол iptables и чувствовать себя достаточно защищенными от вторжений ‘извне’. Для более подробного изучения этого брандмауэра, можно ввести команду man iptables. Руководство на несколько страниц на английском языке опишет вам все модули, правила и параметры фаервола.
Краткий список параметров iptables
Вот небольшой список базовых опций фаервола, который поможет выполнить то или иное действие:
-P политика цепь — сменить политику указанной цепи.
-N цепь — создать новую пользовательскую цепочку.
-D цепь [правило] — удалить всю цепь или определенное правило в ней.
—line-numbers — посмотреть номера правил в цепи.
-n — не преобразовывать IP-адреса в хосты.
-L [цепь] — просмотреть правила в указанной цепи.
-F [цепь] — удалить все правила в цепи либо очистить все цепочки.
А как сделать, чтобы iptables пускал в интернет только определенное приложение? Например, только jabber клиент, но не браузер, apt и т.д.
imatvey, универсального метода нет. Как вариант, можно сделать отдельного пользователя ( например User_no_internet ) и запускать от его имени все приложения, которым в интернет не будет доступа. Все остальные приложения на вашем пользователе( напр. User 1 ), при этом — буду нормально ходить в инет.
Правило: sudo iptables -A OUTPUT -p tcp -m owner —uid-owner user_no_internet -j DROP.
Запуск самой программы: sudo -u user_no_internet программа
Спасибо, я так примерно и делаю. Думал, есть более элегантный способ, но мне главное, чтобы работало 😉
imatvey, недавно сталкивался с похожей проблемой, описал в этой статье, как это решал я. Немного иное решение, чем я писал вам до этого. Хотя оба имеют право на жизнь.
От себя немного добавлю.
Работаю с ip телефонией. Защита от sip сканеров
DROP udp — anywhere anywhere udp dpt:sip STRING match «sipvicious» ALGO name bm TO 65535
DROP udp — anywhere anywhere udp dpt:sip STRING match «sipsak» ALGO name bm TO 65535
DROP udp — anywhere anywhere udp dpt:sip STRING match «iWar» ALGO name bm TO 65535
DROP udp — anywhere anywhere udp dpt:sip STRING match «sundayddr» ALGO name bm TO 65535
DROP udp — anywhere anywhere udp dpt:sip STRING match «sip-scan» ALGO name bm TO 65535
DROP udp — anywhere anywhere udp dpt:sip STRING match «friendly-scanner» ALGO name bm TO 65535