Настраиваем защищенный iptables

NetfilterБрандмауэр (firewall, фаерволл) неотъемлемая часть любой unix системы. И надо уметь работать с ним. В linux системах брандмауэр входит в стандартное ядро и называется netfilter. Iptables - название команды, с помощью которой задаются правила в системе netfilter.
В этой статье я хочу вам привести пример брандмауэра в котором по умолчанию все запрещено. Для домашних систем в которых работают разные torrent качалки и прочие p2p программы данный пример брандмауэра не подойдет, т.к. любое соединение на определенный порт надо прописывать в конфигурации.

Итак начинаем.. Сначала приведу два вспомогательных скрипта.
Первый, разрешает все и вся к нам и от нас. Запускается с целью протестировать соединения, если думаете, что вам мешает ваш рабочий брандмауэр. Этот скрипт я назвал fwaccept.


#очистка существующих правил
iptables -F
iptables -X

#политика по умолчанию - ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

Следующий скрипт fwdrop. Как видно из названия все соединения запрещает. Запускать только за консолью компьютера или сервера, а иначе удаленное управление точно потеряете. Может пригодиться, если вдруг заметите постороннюю активность и надо срочно перекрыть доступ. Ну мало ли, что в жизни бывает :)


#очистка существующих правил
iptables -F
iptables -X
#политика по умолчанию - DENY
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

А теперь сам скрипт моего firewall в котором по умолчанию все запрещено. Скрипт для одной сетевой карты, т.е для машин роутеров он не совсем подходит, или надо все прописывать на вторую сетевую.
Я надеюсь вам что-то пригодится из этого скрипта, т.к. описано много протоколов и примеров взаимодействия с другими машинами и сетями. Специально не использованы так называемые цепочки правил, чтобы не запутать новичков. Изменяете переменные на свои, убирайте лишнее и можно начинать работать :)
В каждой строке всегда 2 правила на вход и выход. Скрипт большой - показать

В данном скрипте, пришлось переносить строки через синтаксис "\", чтобы нормально влезло на экран. Скрипт доступен для скачки в разных кодировках - fw-windows1251.txt, fw-koi8.txt, fw-utf8.txt.
Единственное, что может скомпрометировать безопасность в данном скрипте, это режим пассивного канала данных. Очень уж много доступа со множества портов разрешается на нашу машину. При открытии FTP сервера на машине, где запущен этот скрипт будет заметное увеличение соединения, это из-за пассивных портов FTP.

После того как скрипт отлажен и не выдает никаких ошибок при запуске, можно выполнить


# iptables-save > /etc/rc.d/fwrules

Команда iptables-save позволяет записать текущий набор правил iptables в файл, а файл можно восстанавливать обратно в память компьютера командой iptables-restore. Для чего все это? Команда iptables-restore при загрузке скрипта отработает почти в 20 раз быстрее чем наш скрипт. Там конечно разница в мс, но я хочу показать, как надо правильно делать.
Замерим скорость загрузки нашего скрипта и через iptables-restore


# time fw
real    0m0.717s
user    0m0.132s
sys     0m0.244s
# time iptables-restore /etc/rc.d/fwrules
real    0m0.039s
user    0m0.004s
sys     0m0.008s

Почувствуйте разницу!

Еще один совет при отлаживании правил firewall. Смотрите вывод команды


# iptables -vL

Ответ команды будет большой, но вывод можно ограничивать командой grep только нужных строчек. Смотрите на счетчик пакетов или байтов в начале строки. Это скажет по какому пути пошло соединение, а если не пошло, значит уперлось в DROP политику.

А теперь занесем загрузку скрипта при старте ОС. В каждом дистрибутиве это по разному, так что почитайте сами. Если лень читать, то вставьте в скрипт rc.local строку c iptables-restore и путем до файла сохраненных настроек.

Защищенной вам работы!

Статья просмотрена 10 888 раз
Запись опубликована в рубрике Firewall, iptables с метками , , , , . Добавьте в закладки постоянную ссылку.

11 комментариев: Настраиваем защищенный iptables

  1. Nikolay говорит:

    Здравствуйте
    Скажите, зачем в скрипте присутствуют правила с целью DROP в начале, если политика DENY ? То есть запрещено всё, что явно не разрешено.

    • mik говорит:

      да вы правы. Если политика DENY то эти правила избыточны. Но я их держу на всякий случай в скрипте :) Может кому и пригодятся, т.к. блокировать данные с этих адресов нужно обязательно.

  2. karavan говорит:

    К слову про iptables-save…
    На машинах Like RedHat (Centos, Fedora etc.) этот скрипт только выводит текущие загруженные правила, при этом ни как не воздействуя на /etc/sysconfig/iptables
    Возможность записи загруженных правил в конфиг только так
    service iptables save
    или
    /etc/init.d/iptables save

    • пятачок говорит:

      ни в коем случае… там порты по фаллигатовской системе нарсипируются

  3. karavan говорит:

    P.S.: Хотя да, автор указывает перенаправление вывода в файл, но в разных машинах он разный. И тут либо направлять в родной файлик, либо через rc.local подгружать создаваемый.

  4. mexx говорит:

    Спасибо за статью, только пытаюсь освоить iptables и разжеванные комментарии в скрипте очень кстати .
    Такой вопрос – у меня интерфейс ppp0, оператор присваивает динамический IP из диапазона “10.x.x.x” – как адаптировать скрипт? Просто убрать переменную А и все с ней связанное? Или еще какая-то специфика должна быть?

    • mik говорит:

      Не совсем понял что за переменная A в скрипте.. Но все равно я думаю скрипт описанный в статье не подходит для динамического адреса. Этот скрипт больше ориентирован для серверов со статическим адресом.
      Для инета с ppp0 модно использовать что-то попроще. У меня был когда-то этот скрипт.
      http://ruunix.ru/wp-content/uploads/iptables/fw_drop_in_pass_out.txt
      Он тоже с комментариями на KOI8-R. Думаю разберетесь. Тут фактически ничего допиливать не надо, просто лишнее выкинуть или добавить свои ip для соседних машин в сети.

  5. mexx говорит:

    Под переменной А я подразумевал CLASS_A=”10.0.0.0/8″
    За второй скрипт спасибо, буду изучать. Но первый сделан “от противного”, “запрещено все, что явно не разрешено”, этот путь мне представляется более правильным.
    P.S.: Не люблю и не хочу быть модным, не моё )

    • mik говорит:

      Первый скрипт конечно более суровый :) Если первый адаптировать, то да CLASS_A надо убирать, плюс разобраться с переменной IPADDR, т.к у вас по сути будет 2 интерфейса, 1 eth0, второй ppp0 с динамическим адресом.

      Переменная EXTERNAL_INTERFACE у вас будет в таком случае ppp0, но в правилах не надо задавать “-s $IPADDR”, т.к. этот адрес будет динамическим.
      В общем на первый взгляд так.

  6. mexx говорит:

    Попробовал все же сделать на основе второго скрипта, вроде почти все понял ) Логика там не хуже первого, ибо “всё, что явно не разрешено, то DROP”. Внес в него несколько изменений из Google, что-то поменял местами. Все же не определился с набором –icmp-type Есть возможность посмотреть краем глаза на предмет явных ошибок? Я понимаю, что “нафик_оно_мне_ надо”, но вдруг… ) В любом случае – спасибо, на конкретных примерах проще понимать.

    • mik говорит:

      про icmp типы в инете посмотреть можно. для чего какой тип отвечает. Лучше что у меня прописано то и оставить. Я это в книжке “Брандмауэры в linux” взял.
      нуа посмотреть почему бы и нет :) выложите куда-нибудь или по почте скиньте. в контактах сайта есть мыло.

Добавить комментарий

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>