Начальная настройка iptables в Linux
Ставить 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.
О более тонких настройках этого фаервола будет написано в следующей статье.
Прочитал пару книг по безопасности в linux, но до сих пор не понимаю работау с iptables. Все что я смог сделать для безопасности системы Debian это установка туда avast и старание постоянно обновлять систему и программы.=)