Настройка фаервола с помощью iptables за пять минут. Основы iptables на примере Debian глазами младенца

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

Настройка netfilter/iptables для рабочей станции

Давайте начнем с элементарной задачи - реализация сетевого экрана Linux на десктопе . В большинстве случаев на десктопных дистрибутивах линукса нет острой необходимости использовать файервол, т.к. на таких дистрибутивах не запущены какие-либо сервисы, слушающие сетевые порты, но ради профилактики организовать защиту не будет лишним. Ибо ядро тоже не застраховано от дыр. Итак, мы имеем Linux, с eth0, не важно по DHCP или статически...

Для настройки сетевого экрана я стараюсь придерживаться следующей политики: запретить все, а потом то, что нужно разрешить. Так и поступим в данном случае. Если у вас свежеустановленная система и вы не пытались настроить на ней сетевой фильтр, то правила будут иметь примерно следующую картину:

Netfilter:~# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

Это значит, что политика по умолчанию для таблицы filter во всех цепочках - ACCEPT и нет никаких других правил, что-либо запрещающих. Поэтому давайте сначала запретим ВСЁ , и пакеты (не вздумайте это делать удаленно-тут же потеряете доступ):

Netfilter:~# iptables -P INPUT DROP netfilter:~# iptables -P OUTPUT DROP netfilter:~# iptables -P FORWARD DROP

Этими командами мы устанавливаем DROP по умолчанию. Это значит, что любой пакет, для которого явно не задано правило, которое его разрешает, автоматически отбрасывается. Поскольку пока еще у нас не задано ни одно правило - будут отвергнуты все пакеты, которые придут на ваш компьютер, равно как и те, которые вы попытаетесь отправить в сеть. В качестве демонстрации можно попробовать пропинговать свой компьютер через интерфейс обратной петли:

Netfilter:~# ping -c2 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted --- localhost ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 1004ms

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

Netfilter:~# iptables -A INPUT -i lo -j ACCEPT netfilter:~# iptables -A OUTPUT -o lo -j ACCEPT

После этого пинг на локалхост заработает:

Netfilter:~# ping -c1 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1 (127.0.0.1): icmp_seq=1 ttl=64 time=0.116 ms --- 127.0.0.1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 116ms rtt min/avg/max/mdev = 0.116/0.116/0.116/0.116 ms

Если подходить к настройке файервола не шибко фанатично, то можно разрешить работу протокола ICMP:

Netfilter:~# iptables -A INPUT -p icmp -j ACCEPT netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT

Более безопасно будет указать следующую аналогичную команду iptables:

Netfilter:~# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT netfilter:~# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT

Данная команда разрешит типы ICMP пакета эхо-запрос и эхо-ответ, что повысит безопасность.

Зная, что наш комп не заражен (ведь это так?) и он устанавливает только безопасные исходящие соединения. А так же, зная, что безопасные соединения - это соединения из т.н. эфимерного диапазона портов , который задается ядром в файле /proc/sys/net/ipv4/ip_local_port_range, можно разрешить исходящие соединения с этих безопасных портов:

Netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j ACCEPT netfilter:~# iptables -A OUTPUT -p UDP --sport 32768:61000 -j ACCEPT

Если подходить к ограничению исходящих пакетов не параноидально, то можно было ограничиться одной командой iptables, разрешающей все исхолящие соединения оп всем протоколам и портам:

Netfilter:~# iptables -A OUTPUT -j ACCEPT netfilter:~# # или просто задать политику по умолчанию ACCEPT для цепочки OUTPUT netfilter:~# iptables -P OUTPUT ACCEPT

Далее, зная что в netfilter сетевые соединения имеют 4 состояния (NEW, ESTABLISHED, RELATED и INVALID ) и новые исходящие соединения с локального компьютера (с состоянием NEW) у нас разрешены в прошлых двух командах iptables, что уже установленные соединения и дополнительные имеют состояния ESTABLISHED и RELATED, соответственно, а так же зная, что к локальной системе приходят через , можно разрешить попадание на наш компьютер только тех TCP- и UDP-пакетов, которые были запрошены локальными приложениями:

Netfilter:~# iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT netfilter:~# iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT

Это собственно, все! Если на десктопе все же работает какая-то сетевая служба, то необходимо добавить соответствующие правила для входящих соединений и для исходящих. Например, для работы ssh-сервера , который принимает и отправляет запросы на 22 TCP-порту, необходимо добавить следующие iptables-правила :

Netfilter:~# iptables -A INPUT -i eth0 -p TCP --dport 22 -j ACCEPT netfilter:~# iptables -A OUTPUT -o eth0 -p TCP --sport 22 -j ACCEPT

Т.е. для любого сервиса нужно добавить по одному правилу в цепочки INPUT и OUTPUT, разрешающему соответственно прием и отправку пакетов с использованием этого порта для конкретного сетевого интерфейса (если интерфейс не указывать, то будет разрешено принимать/отправлять пакеты по любому интерфейсу).

Настройка netfilter/iptables для подключения нескольких клиентов к одному соединению.

Давайте теперь рассмотрим наш Linux в качестве шлюза для локальной сети во внешнюю сеть Internet . Предположим, что интерфейс eth0 подключен к интернету и имеет IP 198.166.0.200, а интерфейс eth1 подключен к локальной сети и имеет IP 10.0.0.1. По умолчанию, в ядре Linux пересылка пакетов через цепочку FORWARD (пакетов, не предназначенных локальной системе) отключена. Чтобы включить данную функцию, необходимо задать значение 1 в файле :

Netfilter:~# echo 1 > /proc/sys/net/ipv4/ip_forward

Чтобы форвардинг пакетов сохранился после перезагрузки, необходимо в файле /etc/sysctl.conf раскомментировать (или просто добавить) строку net.ipv4.ip_forward=1 .

Итак, у нас есть внешний адрес (198.166.0.200), в локальной сети имеется некоторое количество гипотетических клиентов, которые имеют и посылают запросы во внешнюю сеть. Если эти клиенты будут отправлять во внешнюю сеть запросы через шлюз "как есть", без преобразования, то удаленный сервер не сможет на них ответить, т.к. обратным адресом будет получатель из "локальной сети". Для того, чтобы эта схема корректно работала, необходимо подменять адрес отправителя, на внешний адрес шлюза Linux. Это достигается за счет (маскарадинг) в , в .

Netfilter:~# iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT netfilter:~# iptables -A FORWARD -m conntrack --ctstate NEW -i eth1 -s 10.0.0.1/24 -j ACCEPT netfilter:~# iptables -P FORWARD DROP netfilter:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Итак, по порядку сверху-вниз мы разрешаем уже установленные соединения в цепочке FORWARD , таблице filter , далее мы разрешаем устанавливать новые соединения в цепочке FORWARD , таблице filter , которые пришли с интерфейса eth1 и из сети 10.0.0.1/24. Все остальные пакеты, которые проходят через цепочку FORWARD - отбрасывать. Далее, выполняем маскирование (подмену адреса отправителя пакета в заголовках) всех пакетов, исходящих с интерфейса eth0.

Примечание. Есть некая общая рекомендация: использовать правило -j MASQUERADE для интерфейсов с динамически получаемым IP (например, по DHCP от провайдера). При статическом IP, -j MASQUERADE можно заменить на аналогичное -j SNAT -to-source IP_интерфейса_eth0. Кроме того, SNAT умеет "помнить" об установленных соединениях при кратковременной недоступности интерфейса. Сравнение MASQUERADE и SNAT в таблице:

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

Netfilter:~# iptables -P INPUT DROP netfilter:~# iptables -P OUTPUT DROP netfilter:~# iptables -A INPUT -i lo -j ACCEPT netfilter:~# iptables -A OUTPUT -o lo -j ACCEPT netfilter:~# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT netfilter:~# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j ACCEPT netfilter:~# iptables -A OUTPUT -p UDP --sport 32768:61000 -j ACCEPT netfilter:~# iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT netfilter:~# iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT

В результате, если один из хостов локальной сети, например 10.0.0.2, попытается связаться с одним из интернет-хостов, например, 93.158.134.3 (ya.ru), при , их исходный адрес будет подменяться на внешний адрес шлюза в цепочке POSTROUTING таблице nat, то есть исходящий IP 10.0.0.2 будет заменен на 198.166.0.200. С точки зрения удаленного хоста (ya.ru), это будет выглядеть, как будто с ним связывается непосредственно сам шлюз. Когда же удаленный хост начнет ответную передачу данных, он будет адресовать их именно шлюзу, то есть 198.166.0.200. Однако, на шлюзе адрес назначения этих пакетов будет подменяться на 10.0.0.2, после чего пакеты будут передаваться настоящему получателю в локальной сети. Для такого обратного преобразования никаких дополнительных правил указывать не нужно - это будет делать все та же операция MASQUERADE , которая помнит какой хост из локальной сети отправил запрос и какому хосту необходимо вернуть пришедший ответ.

Примечание: желательно негласно принято, перед всеми командами iptables очищать цепочки, в которые будут добавляться правила:

Netfilter:~# iptables -F ИМЯ_ЦЕПОЧКИ

Предоставление доступа к сервисам на шлюзе

Предположим, что на нашем шлюзе запущен некий сервис, который должен отвечать на запросы поступающие из сети интернет. Допустим он работает на некотором TCP порту nn. Чтобы предоставить доступ к данной службе, необходимо модифицировать таблицу filter в цепочке INPUT (для возможности получения сетевых пакетов, адресованных локальному сервису) и таблицу filter в цепочке OUTPUT (для разрешения ответов на пришедшие запросы).

Итак, мы имеем , который маскарадит (заменяет адрес отправителя на врешний) пакеты во внешнюю сеть. И разрешает принимать все установленные соединения. Предоставление доступа к сервису будет осуществляться с помощью следующих разрешающих правил:

Netfilter:~# iptables -A INPUT -p TCP --dport nn -j ACCEPT netfilter:~# iptables -A OUTPUT -p TCP --sport nn -j ACCEPT

Данные правила разрешают входящие соединения по протоколу tcp на порт nn и исходящие соединения по протоколу tcp с порта nn. Кроме этого, можно добавить дополнительные ограничивающие параметры, например разрешить входящие соединения только с внешнего интерфейса eth0 (ключ -i eth0 ) и т.п.

Предоставление доступа к сервисам в локальной сети

Предположим, что в нашей локальной сети имеется какой-то хост с IP X.Y.Z.1, который должен отвечать на сетевые запросы из внешней сети на TCP-порту xxx. Для того чтобы при обращении удаленного клиента ко внешнему IP на порт xxx происходил корректный ответ сервиса из локальной сети, необходимо направить запросы, приходящие на внешний IP порт xxx на соответствующий хост в локальной сети. Это достигается модификацией адреса получателя в пакете, приходящем на указанный порт. Это действие называется DNAT и применяется в цепочке PREROUTING в таблице nat. А так же разрешить прохождение данный пакетов в цепочке FORWARD в таблице filter.

Опять же, пойдем по пути . Итак, мы имеем , который маскарадит (заменяет адрес отправителя на врешний) пакеты во внешнюю сеть. И разрешает принимать все установленные соединения. Предоставление доступа к сервису будет осуществляться с помощью следующих разрешающих правил:

Netfilter:~# iptables -t nat -A PREROUTING -p tcp -d 198.166.0.200 --dport xxx -j DNAT --to-destination X.Y.Z.1 netfilter:~# iptables -A FORWARD -i eth0 -p tcp -d X.Y.Z.1 --dport xxx -j ACCEPT

Сохранение введенных правил при перезагрузке

Все введенные в консоли правила - после перезагрузки ОС будут сброшены в первоначальное состояние (читай - удалены). Для того чтобы сохранить все введенные команды iptables , существует несколько путей. Например, один из них - задать все правила брандмауэра в файле инициализации . Но у данного способа есть существенный недостаток: весь промежуток времени с запуска сетевой подсистемы, до запуска последней службы и далее скрипта rc.local из SystemV операционная система будет не защищена. Представьте ситуацию, например, если какая-нибудь служба (например NFS) стартует последней и при ее запуске произойдет какой-либо сбой и до запуска скрипта rc.local. Соответственно, rc.local так и не запуститься, а наша система превращается в одну большую дыру.

Поэтому самой лучшей идеей будет инициализировать правила netfilter/iptables при загрузке . Для этого в Debian есть отличный инструмент - каталог /etc/network/if-up.d/ , в который можно поместить скрипты, которые будут запускаться при старте сети. А так же есть команды iptables-save и iptables-restore , которые сохраняют создают дамп правил netfilter из ядра на и восстанавливают в ядро правила со соответственно.

Итак, алгоритм сохранения iptables примерно следующий :

  • Настраиваем сетевой экран под свои нужны с помощью
  • создаем дамп созданный правил с помощью команды iptables-save > /etc/iptables.rules
  • создаем скрипт импорта созданного дампа при старте сети (в каталоге /etc/network/if-up.d/) и не забываем его сделать исполняемым:
# cat /etc/network/if-up.d/firewall #!/bin/bash /sbin/iptables-restore < /etc/iptables.rules exit 0 # chmod +x /etc/network/if-up.d/firewall

Дамп правил, полученный командой iptables-save имеет текстовый формат, соответственно пригоден для редактирования. Синтаксис вывода команды iptables-save следующий :

# Generated by iptables-save v1.4.5 on Sat Dec 24 22:35:13 2011 *filter:INPUT ACCEPT :FORWARD ACCEPT ....... # комментарий -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT ........... -A FORWARD -j REJECT COMMIT # Completed on Sat Dec 24 22:35:13 2011 # Generated by iptables-save v1.4.5 on Sat Dec 24 22:35:13 2011 *raw ...... COMMIT

Строки, начинающиеся на # - комментарии, строки на * - это название таблиц, между названием таблицы и словом COMMIT содержатся параметры, передаваемые команде iptables. Параметр COMMIT - указывает на завершение параметров для вышеназванной таблицы. Строки, начинающиеся на двоеточие задают цепочки, в которых содержится данная таблица в формате:

:цепочка политика [пакеты:байты]

где цепочка - имя цепочки, политика - политика цепочки по-умолчанию для данной таблицы, а далее счетчики пакетов и байтов на момент выполнения команды.

В RedHat функции хранения команд iptables выполняемых при старте и останове сети выполняет файл /etc/sysconfig/iptables . А управление данным файлом лежит на демоне iptables.

Как еще один вариант сохранения правил, можно рассмотреть использование параметра up в файле /etc/network/interfaces с аргументом в виде файла, хранящего команды iptables, задающие необходимые правила.

Итог

На сегодня будет достаточно. Более сложные реализации межсетевого экрана я обязательно будут публиковаться в следующих статьях.

С Уважением, Mc.Sim!

Небольшой первоначальный скрипт (правила, iptables faq) для десктопа или простого сервера. В данном случае примеры по работе с портами того или иного ПО, запущенного на вашем компьютере. На любом компьютере необходимо соблюдать меры безопасности. Миф о том, что Linux более защищен — не верен, все зависит от корявости рук администратора. Есть и хорошо защищенные Windows-системы, как и открытые практически любому Linux-системы. Поэтому стоит все-таки немного подумать и о сетевой защите компьютера. Ниже добавлены некоторые правила для iptables, которые могут вначале пригодиться.

Специально заменил $IPT на /sbin/iptables, если кому-то понадобится только одно правило, чтобы не менять что-либо — просто скопировал и выполнил. Естественно, здесь пока мало правил, нет различных VPN и т.д., если есть желание — добавьте.

Эти строки можно скопировать целиком в какой-либо скрипт и просто его выполнить. Для обычных случаев этого вполне хватит. Если какое-либо приложение не может выйти в сеть, специально добавлено логирование. Просто открывайте tail -f /var/log/syslog (или ваше, если отличное от Ubuntu) и смотрите! Если есть вопросы — добавьте их в обсуждение, будем вместе решать.

PS Кроме этих правил, подумайте о том, что стоит взять из статьи Оптимизация TCP.

Как удалить в Iptables правило

Posted by Алексей Убоженко

Я несколько раз сталкивался с тем, что даже неглупые в общем-то люди делают совершенно непростительные ошибки. Например, открывают всему интернету порт, на котором крутится база данных.

Блог о системном администрировании. Статьи о Linux, Windows, СХД NetApp и виртуализации.

Часто так бывает у начинающих DevOps, которые всю жизнь писали код, а теперь в их обязанности входит еще и настройка серверов. В сети есть хорошие туториалы по базовой настройке фаервола в Linux и других *nix, но часто это простыни на множество экранов. Так что, надеюсь, этот более лаконичный туториал кому-нибудь пригодится.

Важно! Очень легко по ошибке так зафаерволить машину, что вы на нее больше не зайдете. Особенно это касается облачных хостингов. Например, если в AWS вы закроете все порты с 1024 по 65536, у машины после ребута почему-то оказываются закрыты вообще все порты. Если вы хоститесь в облаках, настраивайте лучше фаервол через предоставляемый хостингом веб-интерфейс.

Небольшое замечание по терминологии. Фаервол, встроенный в ядро Linux, называется Netfilter, а iptables — утилита для управления этим фаерволом. Многие ошибочно полагают, что фаервол называется iptables. Это не так. Говоря что-нибудь наподобие «я фильтрую пакеты с помощью iptables», вы показываете окружающим свою безграмотность.

Вообще, какие примерно задачи можно решать с помощью Netfilter:

  • Разрешать/запрещать входящий трафик на определенные порты по определенным протоколам (IPv4/IPv6, TCP/UDP) с указанных адресов (IP, MAC) или подсетей;
  • Все то же самое в отношении исходящего трафика;
  • Можно, например, полностью игнорировать все ICMP пакеты;
  • Настройка NAT, см пост про установку и настройку OpenVPN;
  • Слышал, что настоящие гуру умеют настраивать защиту от DDoS и брутфорса, ограничивать доступ в сеть конкретным приложениям, пользователям или группам, и делать другие чумовые вещи;

Отмечу, что утилита iptables мне лично первое время казалась исключительно неудобной по сравнению с ipfw во FreeBSD. К счастью, поработав с ней какое-то время, все это множество флагов вроде -A, -D, -j и прочих становятся привычны, так что, наберитесь терпения. Рассмотрим основные команды.

Показать все правила:

Вы можете заметить, что в Netfilter есть какие-то «цепочки» (chains) — как минимум INPUT, OUTPUT и FORWARD.

У меня лично на машине есть еще и цепочка DOCKER. На первое время можно думать о первых двух, как обо всем входящем и исходящем трафике соответственно, а об остальных временно забыть. Велика вероятность, что они вообще никогда вам не понадобятся.

Удалить все правила:

Изменить политику (поведение по умолчанию) цепочки:

iptables -P INPUT DROP
iptables -P INPUT ACCEPT

Запретить доступ с хоста/подсети:

iptables -A INPUT -s 123.45.67.89 -j DROP
iptables -A INPUT -s 123.45.0.0/16-j DROP

Также можно использовать доменные имена:

iptables -A INPUT -s example.ru -j DROP

Запрет исходящих соединений:

iptables -A OUTPUT -d 123.45.67.89 -j DROP

В правилах можно использовать отрицания:

iptables -A INPUT !-s 123.45.67.89 -j DROP

Удаление правила по его номеру в цепочке:

iptables -D INPUT 1

Удаление правила на основе того, что оно делает:

iptables -D INPUT -s 123.45.67.89 -j DROP

Опция -p указывает на протокол. Можно использовать all, icmp, tcp, udp или номер протокола из /etc/protocols. Флаг —sport указывает порт, с которого был прислан пакет, а —dport указывает порт назначения:

iptables -A INPUT -p tcp —sport80-j ACCEPT
iptables -A INPUT -p tcp —dport80-j ACCEPT

Вставка (insert) правила в начало цепочки:

iptables -I INPUT …

Или можно указать конкретную позицию:

iptables-save >/etc/iptables.rules

Восстановить правила:

iptables-restore

Теперь рассмотрим несколько практических примеров. Так, например, выглядит эмуляция нетсплита в тесте, проверяющем поведение приложения, в котором используется Akka Cluster:

run(node1, s"iptables -A INPUT -s $node2 -j DROP")
run(node1, s"iptables -A INPUT -s $node3 -j DROP")
run(node1, s"iptables -A OUTPUT -d $node2 -j DROP")
run(node1, s"iptables -A OUTPUT -d $node3 -j DROP")

Восстановление происходит точно так же, только флаг -A заменяется на флаг -D.

Другой пример. Требуется выяснить, какие порты прослушиваются на машине, и закрыть лишние. Заходим на машину и говорим:

Пример вывода:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Prog name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3210/nginx
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 1789/epmd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 797/sshd
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 990/postgres

Nginx и SSHd смотрят в интернет, это нормально. PostgreSQL слушает только локальный интерфейс, поэтому с ним тоже проблем нет. А вот epmd торчит наружу (можно проверить telnet’ом с другой машины), и это никуда не годится. Можно закрыть только порт 4369. Как это сделать, было показано выше. Или можно пойти еще дальше и запретить все соединения извне на порт 81 и старше:

iptables -A INPUT -m multiport \
-p tcp —dports81:65535!-s 127.0.0.0/8-j DROP

Здесь используется расширение multiport, позволяющее указывать диапазоны портов.

Проверяем, что все работает. Если ОК, сохраняем правила:

iptables-save >/etc/iptables.rules

Чтобы правила подхватывались при загрузке системы, создаем новый файл /etc/network/if-pre-up.d/iptables:

iptables-restore exit0

… и говорим:

chmod +x /etc/network/if-pre-up.d/iptables

Проверено, что этот способ работает в Ubuntu 14.04 LTS.

В Debian тоже должно работать. Описание альтернативного способа восстановления правил фаервола при старте системы вы найдете в уже упомянутой заметке про OpenVPN.

Дополнительные материалы для тех, кто хочет знать больше о Netfilter:

А как вы настраиваете фаерволы на своих серверах?

Метки: Linux, Безопасность, Сети.

Утилита командной строки iptables используется для настройки брандмауэра netfilter, встроенного в систему на базе ядра Linux.

Данная инструкция подходит как для чайников, которые хотят разбираться в аспектах защиты сети, так и опытных специалистов в качестве шпаргалки.

Принцип настройки

Общий синтаксис использования iptables:

iptables -t <таблица> <команда> <цепочка> [номер] <условие> <действие>

<таблица>

Правила netfilter распределены по 4-м таблицам, каждая из которых имеет свое назначение (подробнее ниже). Она указывается ключом -t, но если данный параметр не указан, действие будет выполняться для таблицы по умолчанию — filter.

<команда>

Команды указывают, какое именно действие мы совершаем над netfilter, например, создаем или удаляем правило.

<цепочка>

В каждой таблице есть цепочки, для каждой из которых создаются сами правила. Например, для вышеупомянутой таблицы filter есть три предопределенные цепочки — INPUT (входящие пакеты), OUTPUT (исходящие) и FORWARD (транзитные).

[номер]

Некоторые команды требуют указания номера правила, например, на удаление или редактирование.

<условие>

Условие описывает критерии отработки того или иного правила.

<действие>

Ну и, собственно, что делаем с пакетом, если он подходит под критерии условия.

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

Ключи iptables и примеры их использования

Для работы с таблицами (iptables -t)

Напоминаю, все правила в netfilter распределены по таблицам. Чтобы работать с конкретной таблицей, необходимо использовать ключ -t.

Команды

Нижеперечисленные ключи определяют действия, которые выполняет утилита iptables.

Ключ Описание и примеры
-A Добавление правила в конец списка:
iptables -A INPUT -s 192.168.0.15 -j DROP
запретить входящие с 192.168.0.15.
-D Удаление правила:
iptables -D INPUT 10
удалить правило в цепочке INPUT с номером 10.
-I Вставка правила в определенную часть списка:
iptables -I INPUT 5 -s 192.168.0.15 -j DROP
вставить правило 5-м по списку.
-R Замена правила.
iptables -R OUTPUT 5 -s 192.168.0.15 -j ACCEPT
заменить наше 5-е правило с запрещающего на разрешающее.
-F Сброс правил в цепочке.
iptables -F INPUT
-Z Обнуление статистики.
iptables -Z INPUT
-N Создание цепочки.
iptables -N CHAINNEW
-X Удаление цепочки.
iptables -X CHAINNEW
-P Определение правила по умолчанию.
iptables -P INPUT DROP
-E Переименовывание цепочки.
iptables -E CHAINNEW CHAINOLD

Условия

Данные ключи определяют условия правила.

Ключ Описание и примеры
-p Сетевой протокол. Допустимые варианты — TCP, UDP, ICMP или ALL.
iptables -A INPUT -p tcp -j ACCEPT
разрешить все входящие tcp-соединения.
-s Адрес источника — имя хоста, IP-адрес или подсеть в нотации CIDR.
iptables -A INPUT -s 192.168.0.50 -j DROP
запретить входящие с узла 192.168.0.50
-d Адрес назначения. Принцип использования аналогичен предыдущему ключу -s.
iptables -A OUTPUT -d 192.168.0.50 -j DROP
запретить исходящие на узел 192.168.0.50
-i Сетевой адаптер, через который приходят пакеты (INPUT).
iptables -A INPUT -i eth2 -j DROP
запретить входящие для Ethernet-интерфейса eth2.
-o Сетевой адаптер, с которого уходят пакеты (OUTPUT).
iptables -A OUTPUT -o eth3 -j ACCEPT
разрешить исходящие с Ethernet-интерфейса eth3.
—dport Порт назначения.
iptables -A INPUT -p tcp —dport 80 -j ACCEPT
разрешить входящие на порт 80.
—sport Порт источника.
iptables -A INPUT -p tcp —sport 1023 -j DROP
запретить входящие с порта 1023.

Перечисленные ключи также поддерживают конструкцию с использованием знака ! .

Настройка netfilter с помощью iptables

Он инвертирует условие, например,
iptables -A INPUT -s ! 192.168.0.50 -j DROP
запретит соединение всем хостам, кроме 192.168.0.50.

Действия

Действия, которые будут выполняться над пакетом, подходящим под критерии условия. Для каждой таблицы есть свой набор допустимых действий. Указываются с использованием ключа -j .

Таблица Действие Описание
filter ACCEPT Разрешает пакет.
DROP Запрещает пакет.
REJECT Запрещает с отправкой сообщения источнику.
nat MASQUERADE Для исходящих пакетов заменяет IP-адрес источника на адрес интерфейса, с которого уходит пакет.
SNAT Аналогично MASQUERADE, но с указанием конкретного сетевого интерфейса, чей адрес будет использоваться для подмены.
DNAT Подмена адреса для входящих пакетов.
REDIRECT Перенаправляет запрос на другой порт той же самой системы.
mangle TOS Видоизменение поля TOS (приоритезация трафика).
DSCP Изменение DSCP (тоже приоритезация трафика).
TTL Изменение TTL (время жизни пакета).
HL Аналогично TTL, но для IPv6.
MARK Маркировка пакета. Используется для последующей фильтрации или шейпинга.
CONNMARK Маркировка соединения.
TCPMSS Изменение значения MTU.

Примеры часто используемых команд iptables

Общие команды

Просмотр правил с их номерами:

iptables -L —line-numbers

Для каждой таблицы смотреть правила нужно отдельно:

iptables -t nat -L —line-numbers

Удалить все правила:

Установить правила по умолчанию:

iptables -P INPUT DROP

iptables -P OUTPUT DROP

* в данных примерах по умолчанию для всех входящих (INPUT) и исходящих (OUTPUT) пакетов будет работать запрещающее правило (DROP).

Разрешить все

Способ 1. С помощью добавления правила:

iptables -I INPUT 1 -j ACCEPT

iptables -I OUTPUT 1 -j ACCEPT

iptables -I FORWARD 1 -j ACCEPT

* данные три команды создадут правила, которые разрешают все входящие, исходящие и транзитные пакеты.

Способ 2. Чисткой правил:

* здесь мы сначала удаляем все правила (-F), затем устанавливаем политику по умолчанию — разрешать входящие, исходящие и транзитные (-S).

Способ 3. Отключение сервиса (удобно для диагностики проблем на время отключить firewall):

Работа с правилами

Добавить правило в конец списка:

iptables -A INPUT -p tcp —dport 25 -j ACCEPT

iptables -A INPUT -p tcp -s ! 192.168.0.25 —dport 993 -i eth0 -j ACCEPT

Добавить диапазон портов:

iptables -A INPUT -p tcp —dport 3000:4000 -j ACCEPT

* в данном случае, от 3000 до 4000.

Вставить правило:

iptables -I FORWARD 15 -p udp -d 8.8.8.8 —dport 53 -i eth1 -j ACCEPT

Проброс портов (port forwarding)

Существует два способа настройки.

1. Правила PREROUTING + POSTROUTING:

iptables -t nat -A PREROUTING -p tcp -m tcp -d 19.8.232.80 —dport 22 -j DNAT —to-destination 192.168.1.15:2222

iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.15 —sport 2222 -j SNAT —to-source 19.8.232.80:22

* где 19.8.232.80 — адрес, на котором слушаем запросы на подключение; 22 — порт для проброса; 192.168.1.15 2222 — внутренний порт.

2. Правила PREROUTING + FORWARD:

iptables -t nat -A PREROUTING -p tcp -i eth1 —dport 22 -j DNAT —to-destination 192.168.1.15:2222

iptables -A FORWARD -p tcp -d 192.168.1.15 —dport 22 -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT

* где eth1 — сетевой интерфейс, на котором слушаем запросы; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы; 2222 — внутренний порт.

Стартовая настройка

Разрешаем SSH:

iptables -A INPUT -p tcp —dport 22 -j ACCEPT

Ставим политику запрета на входящие и разрешаем все исходящие:

iptables -P OUTPUT ACCEPT

Создаем правило для нормальной работы apt-get:

iptables -A INPUT -p tcp —sport 80 -m state —state ESTABLISHED -j ACCEPT

Разрешаем ICMP (для выполнения команды ping):

iptables -A INPUT -p icmp -j ACCEPT

Сохранение правил (permanent)

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

Способ 1. iptables-save

Сохраняем правила в файл:

iptables-save > /etc/iptables.rules

Открываем настройки сети:

vi /etc/network/interfaces

и добавляем строку:

pre-up iptables-restore < /etc/iptables.rules

Способ 2. iptables-persistent

Ставим пакет iptables-persistent:

apt install iptables-persistent

Для сохранения правил вводим команду:

service iptables-persistent save

Способ 3. service iptables

Работает в старых версиях Linux:

Способ 4. iptables.init

Работает в CentOS:

/usr/libexec/iptables/iptables.init save

Ubuntu и CentOS

В современных операционных системах Ubuntu и CentOS по умолчанию нет iptables.

Необходимо его установить или пользоваться более новыми утилитами.

В CentOS

В качестве штатной программы управления брандмауэром используется firewall-cmd. Подробнее читайте инструкцию Как настроить firewalld в CentOS.

Если необходимо пользоваться iptables, устанавливаем пакет с утилитой:

yum install iptables-services

Отключаем firewalld:

systemctl stop firewalld

systemctl disable firewalld

Разрешаем и запускаем iptables:

systemctl enable iptables

В Ubuntu

Для управления брандмауэром теперь используется ufw.

Для работы с iptables, устанавливаем следующий пакет:

apt-get install iptables-persistent

Отключаем ufw:

# Сети# Безопасность# UNIX# Ubuntu# Linux

Была ли полезна вам эта инструкция?

ЗА «ОГНЕННОЙ СТЕНОЙ»:
ФАЙРВОЛЛ (БРАНДМАУЭР) И ШЛЮЗ В ИНТЕРНЕТ
В DEBIAN GNU/LINUX 4.0 ETCH

Практическое руководство по организации безопасного доступа в интернет
с отдельного компьютера и из локальной сети в Debian GNU/Linux 4.0 Etch
Немного теории

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

Ситуация усугубляется оттого, что в некоторых (пока еще) широко распространненных операционных системах по умолчанию остаются открытыми многие порты, что позволяет подключаться злоумышленнику из интернета к пользователю незаметно для последнего.

Для предотвращения несанкционированного подключения извне и для фильтрации входящего / исходящего трафика в операционной системе должна быть использована специальная программа — файрволл (англ. firewall), известная также под названиями брандмауэр и межсетевой экран . Ниже описана простая настройка файрволла в свободной операционной системе Debian GNU/Linux 4.0 .

Особенно актуальным становится использование файрволла в случае, если у вас имеется не один компьютер, а домашняя или офисная сеть , компьютеры которой выходят в интернет.

Даже небольшая локальная сеть должна быть правильно организована. Допустим, у вас имеется точка доступа высокоскоростного подключения к интернету (например, ADSL модем) с Ethernet (т.е. сетевым) интерфейсом.

Возникает соблазн (подогреваемый безграмотными рекомендациями, как, например, в инструкции к моему ADSL-модему) подключить модем к напрямую коммутатору, а затем к коммутатору подключать все компьютеры локальной сети. В таком случае модем через коммутатор динамически выдает локальные IP-адреса, но получается, что каждый компьютер остается один на один с интернетом! Ни модем, ни коммутатор не могут стать преградой недоброжелателя. Злоумышленник может просканировать все компьютеры организованной таким образом локальной сети.

Логичным и безопасным решением является создание барьера между модемом и локальной сетью — в виде отдельного компьютера с настроенной на нем «огненной стеной» (файрволлом). У этого компьютера два интерфейса — одним он «смотрит» в интернет (т.е. физически подключен к модему), другим обращен в локальную сеть (и физически подключен к коммутатору, к которому также подключены остальные компьютеры). Поскольку наш компьютер с файрволлом является теперь узловой точкой для выхода других компьютеров в интернет, он именуется еще и шлюзом (англ. gateway).

При такой организации локальной сети вероятность взлома значительно снижается — злоумышленник «видит» из интернета только шлюз, а на шлюзе установлен файрволл, и взломать его нелегко.

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

Компьютеры локальной сети могут работать в интернете и оставаться в относительной безопасности.

Настройка файрволла с помощью конфигуратора arno-iptables-firewall

Для организации файрволла в GNU/Linux используется программа iptables , которая, как правило, сразу инсталлируется при установке большинства дистрибутивов. В Debian GNU/Linux проверить это можно, запустив с правами администратора aptitude . При необходимости — устанавливаем iptables .

Однако ручное конфигурирование iptables является нетривиальной задачей и под силу только специалистам в области системного администрирования. Поэтому для настройки правил, по которым будет действовать файрволл, лучше воспользоваться специальным конфигуратором . В Debian GNU/Linux это — программа arno-iptables-firewall . Будучи запущенной, она задает ряд вопросов, на основании которых генерирует правила для функционирования файрволла iptables .

Набираем в консоли с правами суперпользователя:

#aptitude install arno-iptables-firewall

В начале инсталляции программа спросит, действительно ли мы желаем с ее помощью настроить файрволл iptables :

Вначале надо указать внешний интерфейс — «смотрящий» в интернет, т.е. подключенный к модему. Настройки интерфейсов определяются в конфигурационном файле /etc/network/interfaces . Он может иметь, например, такой вид:

# Это интерфейс lo — указывает на саму нашу машину. auto lo iface lo inet loopback address 127.0.0.1 netmask 255.0.0.0 # Это интерфейс eth0, который подключен к интернету (ADSL-модему) # Его особенностью является то, что IP-адрес ему назначается провайдером динамически, # поэтому выставлена опция dhcp auto eth0 iface eth0 inet dhcp # Это интерфейс, который обращен в локальную сеть # Адрес локальной сети будет 192.168.2.0/24 # В целях безопасности в локальной сети шлюз имеет статический IP-адрес — 192.168.2.1, # поэтому выставлена опция static # Маска сети — 255.255.255.0 # Широковещательный адрес сети в таком случае будет 192.168.2.255 auto eth1 iface eth1 inet static address 192.168.2.1 netmask 255.255.255.0 broadcast 192.168.2.255

Итак, заглянув в настройки /etc/network/interfaces , указываем конфигуратору файрволла, что у нас внешним является интерфейс eth0 :

На вопрос, выдается ли нам от провайдера IP-адрес динамически (с помощью протокола DHCP), отвечаем утвердительно:

Cледует вопрос, какие службы будут предоставлены с нашего компьютера внешним пользователям интернета. У нас — никакие! Мы не занимаемся профессиональным веб-хостингом и не предполагаем раздачу информации вовне. Оставляем строку пустой.

Затем идет вопрос, будем ли мы предоставлять какие-либо службы по протоколу UDP. Тоже нет — и тоже оставляем стрку пустой!

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

На этом настройка для отдельного компьютера, не являющегося шлюзом локальной сети, будет закончена. Если же мы предполагаем использовать компьютер как шлюз, нужно ответить еще на несколько вопросов. Указываем интерфейс, которым шлюз обращен в локальную сеть — в нашем случае это eth1 , как явствует из /etc/network/interfaces (в противном случае, для «одинокого» компьютера, оставляем это поле незаполненным):

На вопрос позволить ли NAT-трансляцию, т.е. переадресацию траффика из интернета через шлюз в локальную сеть и обратно, отвечаем «да» — это является одной из основных наших задач в данном случае:

Тогда встает вопрос: а какой сегмент локальной сети может быть допущен через переадресацию к внешним сетям? У нас право доступа в интернет имеют все компьютеры локальной сети; опять указываем значение 192.168.2.0/24

Наконец, подтверждаем свое желание запустить iptables без дополнительной проверки с нашей стороны автоматически сформированных конфигуратором правил для файрволла:

После этого, если все прошло успешно, выдается сообщение, подобное приведенному ниже. Оно будет появляться теперь при каждой загрузке компьютера-шлюза и информировать об успешном запуске файрволла:

Arno’s Iptables Firewall Script v1.8.8c ——————————————————————————- Sanity checks passed…OK Detected IPTABLES module…

Loading additional IPTABLES modules: All IPTABLES modules loaded! Configuring /proc/…. settings: Enabling anti-spoof with rp_filter Enabling SYN-flood protection via SYN-cookies Disabling the logging of martians Disabling the acception of ICMP-redirect messages Setting the max. amount of simultaneous connections to 16384 Enabling protection against source routed packets Setting default conntrack timeouts Enabling reduction of the DoS’ing ability Setting Default TTL=64 Disabling ECN (Explicit Congestion Notification) Enabling support for dynamic IP’s Flushing route table /proc/ setup done… Flushing rules in the filter table Setting default (secure) policies Using loglevel «info» for syslogd Setting up firewall rules: ——————————————————————————- Accepting packets from the local loopback device Enabling setting the maximum packet size via MSS Enabling mangling TOS Logging of stealth scans (nmap probes etc.) enabled Logging of packets with bad TCP-flags enabled Logging of INVALID packets disabled Logging of fragmented packets enabled Logging of access from reserved addresses enabled Setting up anti-spoof rules Reading custom IPTABLES rules from /etc/arno-iptables-firewall/custom-rules Loading (user) plugins Setting up INPUT policy for the external net (INET): Enabling support for a DHCP assigned IP on external interface(s): eth0 Logging of explicitly blocked hosts enabled Logging of denied local output connections enabled Packets will NOT be checked for private source addresses Allowing the whole world to send ICMP-requests(ping) Logging of dropped ICMP-request(ping) packets enabled Logging of dropped other ICMP packets enabled Logging of possible stealth scans enabled Logging of (other) connection attempts to PRIVILEGED TCP ports enabled Logging of (other) connection attempts to PRIVILEGED UDP ports enabled Logging of (other) connection attempts to UNPRIVILEGED TCP ports enabled Logging of (other) connection attempts to UNPRIVILEGED UDP ports enabled Logging of other IP protocols (non TCP/UDP/ICMP) connection attempts enabled Logging of ICMP flooding enabled Applying INET policy to external (INET) interface: eth0 (without an external subnet specified) Setting up INPUT policy for internal (LAN) interface(s): eth1 Allowing ICMP-requests(ping) Allowing all (other) protocols Setting up FORWARD policy for internal (LAN) interface(s): eth1 Logging of denied LAN->INET FORWARD connections enabled Setting up LAN->INET policy: Allowing ICMP-requests(ping) Allowing all (other) protocols Enabling masquerading(NAT) via external interface(s): eth0 Adding (internal) host(s): 192.168.2.0/24 Security is ENFORCED for external interface(s) in the FORWARD chain Jan 16 23:53:12 All firewall rules applied.

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

# dpkg-reconfigure arno-iptables-firewall

Это позволит устранить случайную ошибку, которая могла возникнуть при ответах на вопросы конфигуратора при первом опыте общения с ним. В случае, если и это не помогло, можно попробовать вручную подправить конфигурационный файл программы arno-iptables-firewall , а именно: /etc/arno-iptables-firewall/firewall.conf . Полезным может оказаться посещение домашнего сайта создателя этой программы по адресу: http://rocky.eld.leidenuniv.nl/ . Там содержится весьма содержательное руководство по работе с программой, интересный FAQ и, кроме того, имеется информация о новых версиях программы.

Примечание 2. Не нужно забывать, что ни один файрволл не может дать 100% гарантии безопасности работы компьютера в интернете. Однако пренебрегать защитой файрволла нельзя. Надо сделать, все, от нас зависящее, чтобы затем уповать на милость Божию. «Если Господь не сохранит город, напрасно бодрствует страж» (Пс. 126:1).

Источник статьи

Я написал сообщение в блоге об основных правилах Iptables для рабочего пользователя давно, и вам, вероятно, следует прочитать его и связанную с ним статью о брандмауэре Stateful .

Но pre kernel 2.6.39 (который включает в себя и вы можете использовать его для whitelisting IP, если у вас больше, чем 10 для белого списка (где 10 произвольно)).

Настройка iptables для чайников

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

Если вы просто хотите разрешить только IP, без состояния

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

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

Приступим. Начнем с простого, и потом будем усложнять конфигурацию. Здесь на сайте уже есть статья про автозагрузку правил iptables, поэтому мы не будем сейчас рассматривать загрузку правил, а сосредоточимся на самих правилах. Настраивается фаервол всегда под учетной записью root.

Сценарии сетевых подключений

Перед настройкой фаервола обязательно нужно иметь точное представление о том, какие сетевые соединения и как должны устанавливаться при работе системы, чтобы все сервисы могли нормально работать. Чем точнее у нас картина работы сетевых сервисов, как работающих на нашем сервере, так и на других серверах, тем более тонко можно настроить систему. Поэтому желательно всегда сначала описывать сценарии того, как всё должно работать, и только потом начинать настраивать фаервол. Сценарий можно написать в любом текстовом редакторе. Сначала описываем все внешние сервисы, с которыми работает сервер, а затем все сервисы, которые работают на сервере. Зачем это надо? Чтобы точно представлять сам процесс работы, без углубления в техническую часть. После написания максимально точного сценария можно приступать к настройке фаервола. Описание в сценарии должно выглядеть примерно так:

1) Все пользователи могут просматривать сайт. По умолчанию сайт на русском языке.
2) Если пользователи пришли с адресов <список-адресов-или-маска-подсети>, то им должен быть показан сайт на украинском. В нашем примере это будет, допустим, интернет-магазин с одним доменным именем, отображаемый на русском или украинском языке, и имеющий в продаже свой набор для России и Украины. У нас будет просто два сайта, один на русском, второй на украинском, и по адресу, с которого пришел клиент, будет определяться, на какой сайт он попадет. Пример взят из головы, на практике, конечно, такие вопросы решаются по другому. Можно также не разрешать просмотр сайта с китайских адресов из-за постоянного спама в комментариях на китайском.
3) Из офиса должна быть доступна почта, из других мест она не должна быть доступна.
4) Извне должна быть обеспечена возможность подключения к ВПН
5) Мы можем использовать только несколько DNS-серверов, которым мы доверяем. Все остальные сервера DNS должны быть недоступны
6) …..

И так далее. Думаю, достаточно для простого примера. Смысл в том, чтобы максимально точно определить картину сетевого взаимодествия. Любой сценарий имеет только одну цель — формализовать взаимодействие с пользователями и сервисами до составления описаний соединений, включающих порт, протокол, адрес источника, адрес назначения для каждого соединения.

Настройка iptables: Самая простая конфигурация

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

В первую очередь, необходимо очистить загруженные правила:

Iptables -F INPUT iptables -F OUTPUT iptables -F FORWARD

INPUT, OUTPUT, FORWARD — это три основные цепочки, по которым будут идти пакеты, входящие, исходящие и проходящие с интерфейса на интерфейс.

После этого необходимо задать политику по умолчанию. Их всего две — ACCEPT и DROP, принимать пакеты или не принимать. Для боевого сервера всегда необходимо выбирать DROP, а затем открывать всё, что необходимо и не более того.

Для задания таких политик необходимо предварительно разрешить соединения по SSH, будем считать, что мы не меняли стандартный порт (что обычно следует на боевых серверах делать сразу после установки SSH-сервера).

Iptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

И после этого уже можно приступать к изменению политик по умолчанию:

Iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP

Для цепочки OUTPUT пока можно оставить политику по умолчанию ACCEPT, разрешающую исходящие соединения, к ней можно переходить после настройки цепочки INPUT, когда мы запретим входящие соединения. На многих серверах достаточно бывает правильно настроить цепочку INPUT, но мы рассмотрим позже также и настройку OUTPUT для более жесткой конфигурации.

Итак. В данный момент у нас открыт только порт SSH-сервера для входящих соединений, на все остальные порты соединения проходить не будут. Теперь надо добавить прием соединений на порты остальных сервисов, если они на вашем сервере запущены.

Iptables -t filter -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT

DNS (обычно достаточно разрешить UDP, но можно также добавить и TCP):

Iptables -t filter -A INPUT -p udp -m udp --dport 53 -j ACCEPT

Iptables -t filter -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Iptables -t filter -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT

Iptables -t filter -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Но это еще не всё. Порты открыты, сервисы доступны извне, но почта не работает и доменные имена не резолвятся. Дело в том, что при запросе DNS-серверов запрос отправляется с произвольного свободного порта из числа непривелегированных, точно так же, как и соединение с другим почтовым сервером. И ответ эти сервисы отправляют на тот же самый порт. А этот порт, как вы понимаете, у нас закрыт. Мы могли бы открыть этот порт, но мы не знаем, с какого порта будет исходящее соединение. Поэтому мы можем сделать самое простое, что может быть,- разрешить соединения с определенных портов удаленного компьютера:

Iptables -t filter -A INPUT -p tcp -m tcp --sport 25 -j ACCEPT

Iptables -t filter -A INPUT -p udp -m udp --sport 53 -j ACCEPT

Эти два правила разрешают входящие соединения с портов 25/tcp и 53/udp, поэтому, когда с этих портов приходят пакеты по соответствующему протоколу, они будут приняты. Если вы планируете обновлять систему, программное обеспечение или устанавливать пакеты, необходимые для работы, то вам придется разрешить соединения с 80 порта удаленных машин.

Вот теперь самая простая конфигурация iptables у нас готова.

После внесения правил в таблицы, необходимо их сохранить. Для этого можно воспользоваться, например, скриптом.

Обработка источника соединения

Идем дальше. соединение по определенным портам нам необходимо не со всем Интернетом, а с определенными машинами, с определенными IP-адресами. Поэтому мы можем немного усложнить правила, добавив в них адрес источника пакетов.

Iptables -t filter -A INPUT -s 123.123.123.123 -p tcp -m tcp --dport 22 -j ACCEPT

Данное правило позволяет принимать пакеты на 22 порт по протоколу TCP только из источника с адресом 123.123.123.123, на это указывает параметр «-s» (source, источник). Таким образом вы можете ограничить соединения с сервером по SSH одним определенным IP-адресом, либо определенной подсетью, если укажете маску подсети, из которой разрешены соединения вместо отдельного IP-адреса.

Если у вас всегда используется один и тот же почтовый шлюз, через который ваш сервер отправляет почту, то вы можете, например, ограничить соединения с порта 25/tcp, указав этот шлюз в качестве источника.

Правила для конкретного сетевого интерфейса или IP-адреса

На сервере может быть несколько сетевых интерфейсов. Обычно их как минимум два — внешний сетевой и так называемый loopback-интерфейс 127.0.0.1, доступ к которому извне невозможен, если отсутствует соответствующее перенаправление пакетов. У вас также может как минимум еще один IP-адрес, используемый совместно с алиасом сетевого интерфейса, или еще один физический сетевой интерфейс. И на каждом IP-адресе или сетевом интерфейсе могут работать определенные сервисы. Например, на одном веб-сервер Apache, а на втором сервер службы доменных имен bind9. И когда вы разрешаете соединения на определенный порт без указания этого сетевого интерфейса, вы открываете доступ к этому порту на всех интерфейсах. Поэтому есть два способа сузить область действия разрешения.

Первый способ — указать IP-адрес, для которого будет разрешен доступ.

Iptables -t filter -A INPUT -d 234.234.234.234 -p tcp -m tcp --dport 22 -j ACCEPT

Этот пример показывает, как можно использовать адрес назначения в правиле iptables. При этом также можно использовать адрес источника:

Iptables -t filter -A INPUT -s 123.123.123.123 -d 234.234.234.234 -p tcp -m tcp --dport 22 -j ACCEPT

В данном пример мы уже ограничиваем доступ двумя адресами, что позволяет получить доступ по SSH к серверу по адресу 234.234.234.234 с адреса 123.123.123.123, с остальных адресов доступ вы получить не сможете.

Второй способ — указать имя сетевого интерфейса. Этот способ также применим, когда внешний адрес может измениться. В случае, если изменится адрес на сетевом интерфейсе, с предыдущим вариантом вы потеряете доступ к серверу. Указание имени интерфейса осуществляется следующим образом:

Iptables -t filter -A INPUT -i eth0 -s 123.123.123.123 -p tcp -m tcp --dport 22 -j ACCEPT

Такой вариант разрешает доступ по SSH на сетевом интерфейсе eth0, на остальных сетевых интерфейсах доступ по SSH будет отсутствовать.

Всё, что мы только что рассмотрели — это только самое начало, в следующей части будет продолжение…

В этой статье мы рассмотрим порядок прохождения таблиц и цепочек в каждой таблице iptables. Информация будет полезна при составлении правил и даст понимание порядка прохождения пакета по всем таблицам и цепочкам iptables, особенно, когда в наборы правил будут включаться такие действия как DNAT, SNAT и TOS.

Пакет, приходящий на firewall сперва попадает на сетевое устройство, перехватывается драйвером и передается в ядро системы. Далее пакет проходит ряд таблиц и в зависимости от правил, находящихся в этих таблица, решается дальнейшая судьба.

Таблица 1. Порядок прохождения FORWARD пакетов

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. Интернет)
2
3 Mangle PREROUTING Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр..
4 Nat PREROUTING Эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях
5 Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет — локальному приложению или на другой узел сети.
6 Filter FORWARD В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации.
7 Mangle FORWARD Далее пакет попадает в цепочку FORWARD> таблицы mangle, которая должна использоваться только в исключительных случаях, когда необходимо внести некоторые изменения в заголовок пакета между двумя точками принятия решения о маршрутизации.
8 Принятие решения о дальнейшей маршрутизации, т.е. в этой точке, к примеру, решается на какой интерфейс пойдет пакет.
9 Nat POSTROUTING Эта цепочка предназначена в первую очередь для Source Network Address Translation. Не используйте ее для фильтрации без особой на то необходимости. Здесь же выполняется и маскировка (Masquerading).
10 Mangle POSTROUTING Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации.
11 Выходной сетевой интерфейс (например, eth1).
12 Кабель (пусть будет LAN).

Как вы можете видеть, пакет проходит несколько этапов, прежде чем он будет передан далее. На каждом из них пакет может быть остановлен, будь то цепочка iptables или что либо еще, но нас главным образом интересует iptables. Заметьте, что нет каких либо цепочек, специфичных для отдельных интерфейсов или чего либо подобного. Цепочку FORWARD проходят ВСЕ пакеты, которые движутся через наш firewall/роутер. Не используйте цепочку INPUT для фильтрации транзитных пакетов, они туда просто не попадают! Через эту цепочку движутся только те пакеты, которые предназначены данному хосту.

Таблица 2. Порядок движения INPUT пакетов

Шаг Таблица Цепочка Примечаниеt
1 Кабель (т.е. Интернет)
2 Входной сетевой интерфейс (например, eth0)
3 Mangle PREROUTING Обычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр.
4 Nat PREROUTING Преобразование адресов (Destination Network Address Translation). Фильтрация пакетов здесь допускается только в исключительных случаях.
5 Принятие решения о маршрутизации.
6 Mangle INPUT Пакет попадает в цепочку INPUT таблицы mangle. Здесь внесятся изменения в заголовок пакета перед тем как он будет передан локальному приложению.
7 Filter INPUT Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.
8 Локальный процесс/приложение

Пакеты OUTPUT имеют обратный порядок прохождения через таблицы. Порядок прохождения представлен в таблице 3.

Таблица 3. Порядок прохождения OUTPUT пакетов

Шаг Таблица Цепочка Примечание
1 Локальный процесс
2 Mangle OUTPUT Здесь производится внесение изменений в заголовок пакета. Фильтрация, выполняемая в этой цепочке, может иметь негативные последствия.
3 Nat OUTPUT Эта цепочка используется для трансляции сетевых адресов (NAT) в пакетах, исходящих от локальных процессов брандмауэра.
4 Filter OUTPUT Здесь фильтруется исходящий траффик.
5 Принятие решения о маршрутизации. Здесь решается — куда пойдет пакет дальше.
6 Nat POSTROUTING Здесь выполняется Source Network Address Translation (SNAT). Не следует в этой цепочке производить фильтрацию пакетов во избежание нежелательных побочных эффектов. Однако и здесь можно останавливать пакеты, применяя политику по-умолчанию DROP .
7 Mangle POSTROUTING Цепочка POSTROUTING таблицы mangle в основном используется для правил, которые должны вносить изменения в заголовок пакета перед тем, как он покинет брандмауэр, но уже после принятия решения о маршрутизации. В эту цепочку попадают все пакеты, как транзитные, так и созданные локальными процессами брандмауэра.
8 Сетевой интерфейс (например, eth0)
9 Кабель (т.е., Internet)

И визуальное представление прохождения пакетов:

Этот рисунок дает довольно ясное представление о порядке прохождения пакетов через различные цепочки. В первой точке принятия решения о маршрутизации (routing decision) все пакеты, предназначенные данному хосту направляются в цепочку INPUT, остальные — в цепочку FORWARD.

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

IPTables — утилита, с помощью которой происходит управление межсетевым экраном в Linux. Это мощный и удобный инструмент для и нежелательных соединений. Весь процесс заключён в правилах iptables, которые можно редактировать и просматривать. Более подробная информация представлена в статье.

История создания

До IPTables в системе Linux использовался файрвол IPFW, позаимствованный из BSD. Затем, с версии ядра 2.4 Linux, она стала поставляться с межсетевым экраном Netfilter и утилитой IPTables для управления им. В методике её работы были сохранены все аспекты и немного расширены функционально.

Строение и устройство IPTables

Поступая в межсетевой экран, пакет проходит несколько проверок. Это может быть контрольная сумма или любой другой анализ на уровне ядра. Затем наступает черёд пройти через цепочку PREROUTING. Далее проверяется в соответствии с которой происходит переадресация на следующую цепочку. Если адрес у пакета отсутствует, как, например, в TCP, то происходит направление в цепочку FORWARD. В тех случаях, когда имеется конкретный адрес, следует цепочка INPUT, а затем уже тем демонам или сервисам, для которых он предназначен. Ответ от них также должен пройти несколько цепочек, например OUTPUT. Последним звеном в этом процессе является цепочка POSTROUTING.

Теперь немного о цепочках. Каждая из них содержит в себе несколько таблиц. Их имена могут повторяться, но это никак не влияет на работу, так как они не взаимосвязаны между собой.

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

Таким образом, проходя все этапы сети, пакет последовательно посещает все цепочки и в каждой проверяется на соответствие условию определённого правила. Если таблица не сформирована пользователем, то выполняется действие по умолчанию, в основном, это ACCEPT, позволяющий продолжить движение дальше или же DROP, останавливающий пакет.

Предустановленные цепочки бывают следующих категорий:

  • PREROUTING . Первоначальная обработка всех приходящих пакетов.
  • INPUT . Сюда попадают те пакеты, которые направлены непосредственно в локальный компьютер.
  • FORWARD . Применяется для «транзитных пакетов», которые следуют таблице маршрутизации.
  • OUTPUT . Используется для исходящих пакетов.
  • POSTROUTING . Последний этап в прохождении исходящим пакетом всех цепочек.

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

Просмотр правил IPTables и управление ими

Как уже было сказано ранее, все цепочки содержат определённые условия для пакетов. Для просмотра правил IPTables и управления ими и используется утилита IPTables. Каждое отдельное правило представляет собой строку с набором условий для пакетов, а также действия над ними, в зависимости от исхода.

Формат команды выглядит таким образом: iptables [-t название обрабатываемой таблицы] вызываемая команда [критерии] [выполняемое действие].

Все, что заключено в может быть опущено. Если это параметр с указанием таблицы, то будет использоваться filter. Для применения какого-то определённого имени нужно добавить ключ -t. Вызываемая команда позволяет вызвать необходимое действие, например, добавить правило IPTables или удалить его. В «критериях» указываются параметры, по которым будет происходить отбор. И в «действии» применяется действие, которое нужно выполнить, если условие соблюдено.

Команды для создания и просмотра правил IPTables

  • Append (-A). При использовании команды указывается цепочка и таблица, в которые нужно добавить необходимое правило. Ценность команды в том, что делает она это в конце всего списка.
  • Delete (-D). Как можно понять из названия, производит удаление правила. В качестве параметров можно указать как полное наименование, так и присвоенные им номера.
  • Rename-chain (-E). Меняет название цепочки. В команде указывается старое, затем новое имя.
  • Flush (-F). Очистка абсолютно всех правил определённой таблицы.
  • Insert (-I). Данная команда вставляет в указанное номером место, нужное правило.
  • List (- L). Просмотр правил Iptables. Если не указана таблица, то будет использована filter по умолчанию.
  • Policy (-P). Используется политика по умолчанию для указанной цепочки.
  • Replace (-R). Меняет правило под указанным номером, на необходимое.
  • Delete-chain (-X). Эта команда производит удаление всех созданных цепочек. Останутся только предустановленные.
  • Zero (-Z). Сбросит счётчики переданных данных в указанной цепочке.

Немного о параметрах отбора пакетов

Их можно условно разделить на три разновидности:

  • Общие критерии . Их можно указывать для любых правил. Они не требуют подключения особых расширений и модулей, а также не зависят от того, какой протокол будет задействован.
  • Не общие критерии. Они становятся доступны при использовании общих критериев.
  • Явные. Для того, чтобы воспользоваться данным типом, нужно подключать специальные плагины для netfilter. К тому же в команде необходимо применить ключ -m.

Стоит немного рассказать о часто встречающихся параметрах, применяемых при анализе пакетов:

  • Protocol (-p). Указывает на протокол.
  • Source (-s). Данный параметр определяет IP адрес источника, с которого пришёл пакет. Его можно указать несколькими способами. Конкретный хост, адрес или же целую подсеть.
  • Destination (-d). Адрес назначения пакета. Также, как и предыдущий, может быть описан несколькими способами.
  • In-interface (-i). Указывает входящий интерфейс пакета. В основном используется для NAT или на системах с несколькими интерфейсами.
  • Out-interface (-o). Исходящий интерфейс.

Несколько примеров

Для того, чтобы выполнить просмотр правил IPTables nat? нужно воспользоваться командой - «iptables -L -t nat». Узнать общий статус файрвола - «iptables -L -n -v». К тому же данная команда позволяет посмотреть правила IPTables, имеющиеся во всей системе. Вставить правило в определённое место таблицы, например, между первой и второй строкой - «iptables -I INPUT 2 -s 202.54.1.2 -j DROP». Затем просмотреть, добавилось ли оно - «iptables -L INPUT -n --line-numbers».

Чтобы заблокировать определённый адрес, например, 12.12.12.12 - «iptables -A INPUT -s 12.12.12.12 -j DROP».

Справка по iptables - «man iptables». Если нужна информация по конкретной команде - «iptables -j DROP -h».

В заключение

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