Продолжаем настраивать iptables

Сентябрь5

Firewall

Продолжаем настраивать защиту нашего компьютера на 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 [цепь] — удалить все правила в цепи либо очистить все цепочки.

 

Поделиться в соц. сетях

Метки:
Copyright © 2013-2017. All rights reserved.

Опубликованно Сентябрь 5, 2014 by Feanor184 в категории Linux

Об Авторе

Постигаю Linux, учу Python, пытаюсь программировать)

5 комментарий(ев) к записи “Продолжаем настраивать iptables

  1. imatvey

    А как сделать, чтобы iptables пускал в интернет только определенное приложение? Например, только jabber клиент, но не браузер, apt и т.д.

    1. Feanor184 Автор поста

      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 программа

    2. imatvey

      Спасибо, я так примерно и делаю. Думал, есть более элегантный способ, но мне главное, чтобы работало 😉

    3. Feanor184 Автор поста

      imatvey, недавно сталкивался с похожей проблемой, описал в этой статье, как это решал я. Немного иное решение, чем я писал вам до этого. Хотя оба имеют право на жизнь.

  2. Кирилл

    От себя немного добавлю.
    Работаю с 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

Добавить комментарий для Кирилл Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

=

Перед тем, как оставить комментарий, убедитесь, что вы ознакомились с правилами комментирования этого блога.