Начальная настройка iptables в Linux

Сентябрь2

Firewall

Ставить Linux на рабочие сервера компаний — давно уже стало повсеместной практикой и правилами хорошего тона. Но, нередко, Linux ставят и на домашних машинках! Люди, установившие себе Linux в качестве рабочей станции, нередко придерживаются мнения, что хакеры тянутся только к крупным серверам, поэтому фаервол им ни к чему. Это не совсем верно. Дело в том, что в большинстве случаев взломщикам просто по-барабану, что ломать и куда вторгаться. Потому о своей защите рекомендуется позаботиться своевременно, чтобы потом не пришлось кусать локти и сожалеть о собственной беспечности. О чем, собственно и пойдет речь в сегодняшней статье.

История iptables

Для начала вспомним, что такое фаервол. По сути, это стандартный фильтр пакетов, параметры которого задает пользователь. Юниксистам, в отличие от windows-пользователей, с «огненной стеной» повезло. Фаервол является обязательным атрибутом всех unix-like систем. В настоящее время, пожалуй, один из самых популярных фаерволов: iptables, который имеет множество различных функций и модулей.

Запускаем iptables

Чаще всего для активации iptables достаточно выполнить команду service iptables start. После этого будут загружены модули iptable_nat, iptable_owner, iptable_state и iptable_filter. Каждый модуль отвечает за определенные функции. После запуска фаервола можно посмотреть наличие всех цепочек. Сделать это можно командой iptables -L. Будет видно, что у брандмауэра есть три главных цепи: INPUT, OUTPUT и FORWARD. В них как раз и записываются правила, определяющие политику работы фаервола. Политик может быть две — ACCEPT, которая принимает все пакеты без исключения (по умолчанию), и DROP, фильтрующая все соединения, если нет исключающих правил. Кроме того, пользователь может создать свои личные цепи и соединить их с главными. такой подход позволяет создать супер гибкую систему правил и настроить ее под свои изощренные вкусы или сильно развитую паранойю :)

Ветка INPUT

Ветка INPUT содержит в себе правила, проверяющие любые входящие в систему пакеты. После такой проверки ядро «решает» — пропустить пакет или блокировать. Фильтровать пакет можно двумя способами — DROP, делая вид, что сервер недоступен, и REJECT — эмуляция отсутствия сервиса (при этом запрете на порт, фаервол ответит на запрос — connection refused, как будто порт вообще не светится).

Ветка OUTPUT

В этой ветке находятся правила, обрабатывающие исходящие пакеты. Принцип работы такой же, как у ветки INPUT. При наличии запрещающих правил пакет фильтруется и не выпускается из системы наружу.

Ветка FORWARD

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

iptables настройка

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

Для начала создадим собственную цепь. Назовем ее, к примеру, ports. Сюда мы запишем правила, разрешающие соединения на определенные порты твоей машины.

# /sbin/iptables -N ports

После этой команды появится пользовательская цепь ports. Ее можно просмотреть с помощью параметра -L. Теперь добавим первое правило в нашу новую цепь. Оно будет давать разрешение на соединение с 22 портом с доверенного адреса 192.168.0.1.

# /sbin/iptables -A ports -s 192.168.0.1 -p tcp --destination-port 22 -j ACCEPT

Коротко о параметрах и их аргументах:

-A (append). Добавляет правило в конец заданной цепи (в нашем случае в ports).

-s (source_addr) — адрес, с которого пришел пакет. В нашем случае это доверенный 192.168.0.1.

-p (protocol) — явное указание протокола для текущего правила. Может быть tcp, udp и icmp и all.

—destination-port — актуален только для протокола tcp, поэтому пишется всегда после него. Хранит в себе порт назначения.

-j — политика правила. Может быть ACCEPT, DROP, REJECT, а также линком на другие цепи.

Цепь всегда можно заполнить позже другими правилами.

Теперь займемся главной цепочкой INPUT. Первым делом разрешим принимать пакеты по локальному петлевому интерфейсу. Интерфейс можно задать параметром -i (входящий) и -o (исходящий). Наше правило будет выглядеть следующим образом:

# /sbin/iptables -A INPUT -i lo -j ACCEPT

Ужесточим политику

А теперь следует сделать то, к чему мы так стремились. Нам необходимо запретить все соединения кроме тех, которые были указаны в цепочке ports. Но перед этим следует выполнить, по крайней мере, две команды. Во-первых, надо соединить две цепочки: пользовательскую ports и главную INPUT. Делается это следующим образом:

# /sbin/iptables -A INPUT -j ports

Как видите, аргумент -j является именем пользовательской цепи (линковать базовые цепочки лучше не надо). Теперь, казалось бы, все должно работать и подчиняться правилам. Но стоит нам поменять политику, как наша filezilla перестанет качать файлы с хостинга, а любимый скайп свалится в оффлайн. Все потому, что мы забыли оговорить состояния пакетов.

Каждый пакет может иметь несколько состояний. Вот основные виды:

NEW — данные, начинающие новое соединение.

ESTABLISHED — пакет, приходящий от уже установленного соединения.

RELATED — новый пакет данных, но порожденный старым установленным соединением (например, FTP-передача данных, icmp-ответ и т.д.).

INVALID — состояние, которое не попадает ни под один из вышеперечисленных видов.

Чтобы пакеты корректно пропускались ядром, необходимо разрешить состояния RELATED и ESTABLISHED. Это выполняется командой:

# /sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Значение параметра -m указывает на внешний модуль, который будет использоваться фаерволом. В нашем случае это iptables_state.so. После того, как модуль активизируется, мы указываем его опцию -state со значением состояний пакетов.

Кажется, всё! Осталось только сменить политику цепи INPUT:

# /sbin/iptables -P INPUT DROP

Если все было сделано верно, то после смены политики соединения не пропадут, а наша машина будет в относительной безопасности ;).

Кстати, существует возможность производить сравнение не только по ip, но и по MAC-адресу, что положительно повлияет на защиту твоего сервера. Например, правило

# /sbin/iptables -A INPUT -s 192.168.0.1 -m mac --mac-source 00:C0:DF:10:19:FB -j ACCEPT

пропустит пакеты лишь с MAC-адресом 00:C0:DF:10:19:FB.

О более тонких настройках этого фаервола будет написано в следующей статье.

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

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

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

Об Авторе

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

1 комментарий(ев) к записи “Начальная настройка iptables в Linux

  1. manas_anarov

    Прочитал пару книг по безопасности в linux, но до сих пор не понимаю работау с iptables. Все что я смог сделать для безопасности системы Debian это установка туда avast и старание постоянно обновлять систему и программы.=)

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

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

*

=

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