Настройка файрвола iptables

Примеры настройки Iptables

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

Список правил

Просмотр правил Iptables осуществляется командой:

$ iptables –L

Также есть возможность указать нужную цепочку, например:

$ iptables -L INPUT

Очистка правил

При любых ошибках в работе Iptables, чтобы исключить нарушение функционирования ядра перед другими действиями, требуется очистить правила, «обнулить» вводные данные. Выполняется эта процедура командой:

$ sudo iptables –F

Если речь идет об определенной цепочке, то она будет выглядеть иначе:

$ sudo iptables -F Input

Перечисленные действия выполняются для таблицы filter, которая подключена изначально.

Правила «по умолчанию»

Задаются правила «по умолчанию» вручную. Пример команд:

$ sudo iptables -p INPUT ACCEPT

$ sudo iptables -p OUTPUT ACCEPT

$ sudo iptables -p FORWARD DROP

Здесь мы разрешаем все цепочки INPUT и OUTPUT, запрещаем FORWARD.

Блокировка пакетов

Заблокировать пакеты можно действием DROP. Оно позволяет включать фильтрацию по разным признакам вроде IP-адреса, маске сети, порту и пр.

Пример:

$ sudo iptables -A INPUT -s 20.20.20.20 -j DROP

Блокируются входящие пакеты на IP 20.20.20.20.

$ sudo iptables -A OUTPUT -s 20.20.20.20 -j DROP

Теперь мы заблокировали пакеты, исходящие на IP 20.20.20.20.

Есть возможность указать маску сети, например, 20.20.20.0/255. Тогда правила будут применяться ко всем IP, входящим в указанный диапазон. Если же требуется заблокировать подключение строго по определенному протоколу, вводится команда:

$ sudo iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP

Она блокирует все входящие соединения по SSH.

Удаление правил

При удалении правил в Iptables вводится команда с опцией -D. Но перед этим может понадобиться просмотреть перечень правил:

$ sudo iptables -L

Пример удаления правила:

$ sudo iptables -A OUTPUT -s 10.10.10.10 -j DROP

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

$ sudo iptables –F

Сохранение правила Iptables

Теперь остается опробовать режим сохранения правил

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

В Ubuntu процесс требует ввода команды:

$ sudo /sbin/iptables-save

Для операционных систем на ядре Red Hat и CentOS она выглядит иначе:

$ sudo /sbin/service iptables save

Ничего сложного в настройке и управлении Iptables нет. Основные функции понятны даже новичкам, поэтому утилита и остается стандартом де-факто для всех систем на базе Linux.

Возможно вам понравится:

Как закрыть порт iptables

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

Например:

Эта команда в таблицу filter в цепочку INPUT запишет правило для протокола TCP, от компьютера из подсети 192.168.3.0/24, на порт назначения 445 (так как цепочка входящая, то порт назначения находится на данном компьютере) для пакетов, поступающих в рамках уже открытого соединения, применять действие DROP (отбросить пакет).

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

Настройка правил iptables

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

# netstat -tulpn

Все правила iptables применяются сразу после выполнения команды по добавлению правила в firewall. Чтобы это проверить, можно сразу запретить доступ к 80 порту, если конечно на нем настроен web-сервер, для относительно безопасного наблюдения за действиями блокировки:

# iptables -A INPUT -p tcp -m tcp —dport 80 -j DROP

Теперь можно убедиться, что сайт, для доступа к которому используется 80 порт, стал недоступен. Флаг -A добавляет правило в самый конец выбранной цепочки. Поскольку в команде не указано имя таблицы правил (-t tablename), используется таблица по умолчанию: filter. Снять блокировку можно, как было описано ранее, путем запуска команды iptables -F, но что делать, если нужно удалить только одно правило, а все остальные оставить без изменений?

Удалить все правила из цепочки INPUT с параметром DROP:
# iptables -D INPUT -j DROP
Удалить только правило, заданное с помощью INPUT -p tcp -m tcp —dport 81 -j DROP
# iptables -D INPUT -p tcp -m tcp —dport 80 -j DROP

Ключ -D обозначает: удалить одно или более правил согласно следующему за ним условию.

Также, удалить правило, можно зная его номер. Просмотреть все правила с номерами строк, можно при помощи ключа —line-numbers, номер правила будет указан в колонке num:

# iptables -L -n -v —line-numbers

Флаги -L, -n и -v:

  • -L: посмотреть список правил.
  • -n: отображать IP адрес и порт числами, без этой опции IP-адреса будут по возможности переведены в имена доменов, что замедлит процесс отображения.
  • -v: просмотр дополнительной информации, такой как: название интерфейса, суффиксы ‘K’, ‘M’ or ‘G’, опции и TOS маски.

Теперь удалить одно правило, зная его номер, можно так:

# iptables -D INPUT 1

Добавить правило на определенное место, например на первую строчку, можно, используя такой синтаксис:

# iptables -I INPUT 1 -s 4.4.4.4 -j ACCEPT

Все правила, записанные ранее, включая то, что было в строке 1, будут сдвинуты на строчку ниже.

Опция -Z сбрасывает в ноль счетчики пакетов и байт.

DROP или REJECT

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

В советуют использовать REJECT, для защиты от сканирования портов, поскольку DROP может оставлять открытые неиспользуемые сокеты на сервере.

Сброс правил: опция -F или -X

Во многих примерах для полной очистки правил используется сразу флаг -F и флаг -X:

# iptables -F
# iptables -X

И это правильно! Так как -F удаляет все пользовательские правила созданные в стандартных и пользовательских цепочках, а вот флаг -X удаляет пользовательские названия цепочек, созданные при помощи флага -N. Менять местами -F и -X не стоит, так как для удаления пользовательской цепочки, необходимо предварительно очистить её от правил, иначе цепочка удалена не будет и отобразиться сообщение об ошибке.

iptables-services в CentOS/RHEL системах

В CentOS существует утилита управления правилами iptables, делающая все вышеописанное, она создает файл для записи, сохраняет изменения, загружает правила при запуске системы. Эта утилита называется iptables-services.

# Устанавливаем
yum -y install iptables-services

# Добавляем в автозагрузку и запускаем
systemctl start iptables.service
systemctl enable iptables.service

После установки в директории /etc/sysconfig появляются файлы iptables и ip6tables, в эти файлы производится запись правил. В файл iptables производится запись правил для протокола IPv4, в файл ip6tables для протокола IPv6.

Конфигурационный файл находится в /etc/sysconfig/iptables-config. Здесь нас интересуют два параметра:

  • IPTABLES_SAVE_ON_STOP=»no» — сохранение текущих правил при остановке демона iptables, по умолчанию отключено.
  • IPTABLES_SAVE_ON_RESTART=»no» — сохранение текущих правил при перезапуске/перезагрузке системы, по умолчанию отключено.

Включим сохранение текущих правил, нужно заменить значения с «no» на «yes». Правила будут сохраняться автоматически в файл /etc/sysconfig/iptables, при перезагрузке системы/службы iptables. Также правила можно сохранять командой restart.

service iptables restart

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

  • IPTABLES_MODULES=»» — здесь указываются дополнительные модули iptables, которые будут загружаться при старте.
  • IPTABLES_MODULES_UNLOAD=»yes» — выгрузка модулей iptables, при перезагрузке или остановке межсетевого экрана.
  • IPTABLES_SAVE_COUNTER=»no» — сохранение счетчиков правил и цепочек, при остановке или перезагрузке.
  • IPTABLES_STATUS_NUMERIC=»yes» — вывод значений ip-адресов и портов в числовом виде.
  • IPTABLES_STATUS_VERBOSE=»no» — расширенный вывод информации.
  • IPTABLES_STATUS_LINENUMBERS=»yes» — вывод информации в пронумерованных строках.
  • #IPTABLES_SYSCTL_LOAD_LIST=».nf_conntrack .bridge-nf» — перезагрузка параметров ядра при старте или перезапуске.

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

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

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 ИМЯ_ЦЕПОЧКИ

Типы цепочек

Существует три типа цепочек iptables — input, forward и output.

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

Цепочка — это упорядоченная последовательность правил. Правило содержит в себе критерий (например, IP-адрес источника пакета) и действие, которое нужно применить к пакету с этим критерием (например, «заблокировать»). Если критерий отсутствует, правило применяется ко всем пакетам.

При определении, что нужно сделать с пакетом, iptables просматривает соответствующую цепочку с начала списка, перебирая правила, пока не найдет совпадение. Если совпадение не найдено (соединение не попадает ни под одно созданное правило), применяется правило по умолчанию. 

При настройке правил iptables помните, что для многих портов при передаче данных требуется не только отправить запрос, но и получить на него ответ. Также будьте внимательны, чтобы случайно не запретить доступ для себя — удаленное подключение к серверу по SSH тоже является входящим соединением.

Удалить существующее правило брандмауэра

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

Важно отметить, что Можно удалить несколько правил одновременно. Пример такого типа функциональности приведен ниже

Приведенное ниже правило удалит все отключенные правила, содержащиеся в политике в домен.

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

Примеры настройки Iptables

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

Список правил

Просмотр правил Iptables осуществляется командой:

$ iptables –L

Также есть возможность указать нужную цепочку, например:

$ iptables -L INPUT

Очистка правил

При любых ошибках в работе Iptables, чтобы исключить нарушение функционирования ядра перед другими действиями, требуется очистить правила, «обнулить» вводные данные. Выполняется эта процедура командой:

$ sudo iptables –F

Если речь идет об определенной цепочке, то она будет выглядеть иначе:

$ sudo iptables -F Input

Перечисленные действия выполняются для таблицы filter, которая подключена изначально.

Правила «по умолчанию»

Задаются правила «по умолчанию» вручную. Пример команд:

$ sudo iptables -p INPUT ACCEPT

$ sudo iptables -p OUTPUT ACCEPT

$ sudo iptables -p FORWARD DROP

Здесь мы разрешаем все цепочки INPUT и OUTPUT, запрещаем FORWARD.

Блокировка пакетов

Заблокировать пакеты можно действием DROP. Оно позволяет включать фильтрацию по разным признакам вроде IP-адреса, маске сети, порту и пр.

Пример:

$ sudo iptables -A INPUT -s 20.20.20.20 -j DROP

Блокируются входящие пакеты на IP 20.20.20.20.

$ sudo iptables -A OUTPUT -s 20.20.20.20 -j DROP

Теперь мы заблокировали пакеты, исходящие на IP 20.20.20.20.

Есть возможность указать маску сети, например, 20.20.20.0/255. Тогда правила будут применяться ко всем IP, входящим в указанный диапазон. Если же требуется заблокировать подключение строго по определенному протоколу, вводится команда:

$ sudo iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP

Она блокирует все входящие соединения по SSH.

Удаление правил

При удалении правил в Iptables вводится команда с опцией -D. Но перед этим может понадобиться просмотреть перечень правил:

$ sudo iptables -L

Пример удаления правила:

$ sudo iptables -A OUTPUT -s 10.10.10.10 -j DROP

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

$ sudo iptables –F

Сохранение правила Iptables

Теперь остается опробовать режим сохранения правил

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

В Ubuntu процесс требует ввода команды:

$ sudo /sbin/iptables-save

Для операционных систем на ядре Red Hat и CentOS она выглядит иначе:

$ sudo /sbin/service iptables save

Ничего сложного в настройке и управлении Iptables нет. Основные функции понятны даже новичкам, поэтому утилита и остается стандартом де-факто для всех систем на базе Linux.

Отобразить список правил с номерами строк.

Примерный вывод:

Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  0.0.0.0/0            0.0.0.0/0           state INVALID
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
Chain FORWARD (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    DROP       all  --  0.0.0.0/0            0.0.0.0/0           state INVALID
3    TCPMSS     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x06/0x02 TCPMSS clamp to PMTU
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
5    wanin      all  --  0.0.0.0/0            0.0.0.0/0
6    wanout     all  --  0.0.0.0/0            0.0.0.0/0
7    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
Chain wanin (1 references)
num  target     prot opt source               destination
Chain wanout (1 references)
num  target     prot opt source               destination

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

Запись настроек

После настройки iptables и ip6tables и тестирования работоспособности сети, настройки стоит сохранить в директории /etc в файлы с именами: iptables.conf и ip6tables.conf (на самом деле путь и названия файлов можно выбрать по своему усмотрению):

# iptables-save > /etc/iptables.conf
# ip6tables-save > /etc/ip6tables.conf

Далее в директории /etc/network/if-pre-up.d следует создать файл iptables (# touch /etc/network/if-pre-up.d/iptables), сделать его запускаемым (# chmod +x /etc/network/if-pre-up.d/iptables) и заполнить его таким содержимым:

#!/bin/sh
iptables-restore < /etc/iptables.conf
ip6tables-restore < /etc/ip6tables.conf

Теперь, при каждой загрузке сервера, перед включением сети, в iptables и ip6tables будут загружаться правила из файлов /etc/iptables.conf и /etc/ip6tables.conf. Если загружать правила нужно уже после включения сети, файл iptables можно создать в директории /etc/network/if-up.d.

Альтернативный путь — использовать утилиту iptables-persistent.

Если не восстанавливать настройки iptables после загрузки сервера, фаервол будет запущен с настройками по умолчанию, включая настройки по умолчанию (ACCEPT) для цепочек таблицы filter: INPUT, OUTPUT и FORWARD.

Также, не забудьте отключить сброс настроек iptables по cron, если таковой был предварительно настроен.

Безопасная проба настроек — iptables-apply

Существует утилита iptables-apply, для безопасного тестирования настроек iptables на удаленном сервере. Суть её работы сводится к следующему: она применяет новые настройки из указанного файла на некоторый период времени (по умолчанию 10 сек.) и если пользователь в консоли не подтвердил новые настройки нажатием клавиши Y, в iptables возвращаются настройки, которые были доп применения новых.

iptables-apply -t 15 new_iptable_conf

В примере выше, iptables-apply сразу после запуска применит настройки фаервола из файла new_iptable_conf и будет ждать подтверждения от пользователя на протяжении 15 секунд. И если пользователь не подтвердит новую конфигурацию, будет возвращена старая. Формат файла iptables-apply такой же, как и при сохранении настроек с помощью iptables-save.

Т.е. для безопасного тестирования настроек iptables необходимо: записать текущую конфигурацию в файл new_iptable_conf: iptables-save > new_iptable_conf, далее отредактировать этот файл и уже после этого безопасно испытать новые параметры при помощи iptables-apply: iptables-apply -t 15 new_iptable_conf.

Скрипты для настройки и полной очистки iptables

Опубликовано: 2016/03/29

HTML-код ссылки на эту страницу:
<a href=»https://petrenco.com/linux.php?txt=553″ target=»_blank»>Настройка iptables</a>

8296

Запуск утилиты Iptables

Перед активацией приложение требуется установить из стандартного репозитория Linux. Так, для инсталляции в Ubuntu подойдет команда:

$ sudo apt install iptables

В дистрибутиве, базируемом на ядре Fedora, она выглядит несколько иначе:

$ sudo yum install iptables

Общий синтаксис запуска программы выглядит следующим образом:

$ iptables -t таблица действие цепочка дополнительные_параметры

Перечень основных действий, для выполнения которых используется Iptables:

  1. -A – добавить правило в цепочку;
  2. -C – проверить применяемые правила;
  3. -D – удалить текущее правило;
  4. -I – вставить правило с указанным номером;
  5. -L – вывести правила текущей цепочки;
  6. -S – вывести все активные правила;
  7. -F – очистить все правила;
  8. -N – создать цепочку;
  9. -X – удалить цепочку;
  10. -P – установить действие «по умолчанию».

В качестве дополнительных параметров используются опции:

  1. -p – вручную установить протокол (TCP, UDP, UDPLITE, ICMP, ICMPv6, ESP, AH, SCTP, MH);
  2. -s – указать статичный IP-адрес оборудования, откуда отправляется пакет данных;
  3. -d – установить IP получателя;
  4. -i – настроить входной сетевой интерфейс;
  5. -o – то же самое в отношении исходящего интерфейса;
  6. -j – выбрать действие при подтверждении правила.

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

Все введенные в консоли правила — после перезагрузки ОС будут сброшены в первоначальное состояние (читай — удалены). Для того чтобы сохранить все введенные команды 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, задающие необходимые правила.

Итог

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

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

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

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

Ключ Описание
-t filter Таблица по умолчанию. С ней работаем, если упускаем ключ -t. Встроены три цепочки — INPUT (входящие), OUTPUT (исходящие) и FORWARD (проходящие пакеты)
-t nat Для пакетов, устанавливающий новое соединение. По умолчанию, встроены три цепочки — PREROUTING (изменение входящих), OUTPUT (изменение локальных пакетов перед отправкой) и POSTROUTING (изменение всех исходящих).
-t mangle Для изменения пакетов. Цепочки — INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING.
-t raw Для создания исключений в слежении за соединениями. Цепочки: PREROUTING, OUTPUT.

Команды

Нижеперечисленные ключи определяют действия, которые выполняет утилита 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.

Перечисленные ключи также поддерживают конструкцию с использованием знака !. Он инвертирует условие, например,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 и Netfilter уже достаточно давно встроена в ядро Linux. Все сетевые пакеты, которые проходят через компьютер, отправляются компьютером или предназначены компьютеру, ядро направляет через фильтр iptables. Там эти пакеты поддаются проверкам и затем для каждой проверки, если она пройдена выполняется указанное в ней действие. Например, пакет передается дальше ядру для отправки целевой программе, или отбрасывается.

Виды пакетов

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

Соответственно в фильтре iptables все пакеты делятся на три аналогичные цепочки:

  • Input — обрабатывает входящие пакеты и подключения. Например, если какой-либо внешний пользователь пытается подключиться к вашему компьютеру по ssh или любой веб-сайт отправит вам свой контент по запросу браузера. Все эти пакеты попадут в эту цепочку;
  • forward — эта цепочка применяется для проходящих соединений. Сюда попадают пакеты, которые отправлены на ваш компьютер, но не предназначены ему, они просто пересылаются по сети к своей цели. Как я уже говорил, такое наблюдается на маршрутизаторах или, например, если ваш компьютер раздает wifi;
  • output — эта цепочка используется для исходящих пакетов и соединений. Сюда попадают пакеты, которые были созданы при попытке выполнить ping losst.ru или когда вы запускаете браузер и пытаетесь открыть любой сайт.

Но если вы думаете что можно просто полностью закрыть цепочку Input для увеличения безопасности, то вы очень сильно ошибаетесь. При работе сети используются обе цепочки input и output. Например, вы пытаетесь выполнить ping, данные отправляются через output, но ответ приходит через input. То же самое происходит при просмотре сайтов и других действиях. А вот цепочка forward может вообще не использоваться если ваш компьютер не является маршрутизатором. Так что настройка iptables должна выполняться очень аккуратно.

Правила и действия

Перед тем как перейти к созданию списка правил iptables нужно рассмотреть как они работают и какие бывают. Для каждого типа пакетов можно установить набор правил, которые по очереди будут проверяться на соответствие с пакетом и если пакет соответствует, то применять к нему указанное в правиле действие. Правила образуют цепочку, поэтому input, output и forward называют цепочками, цепочками правил. Действий может быть несколько:

  • ACCEPT — разрешить прохождение пакета дальше по цепочке правил;
  • DROP — удалить пакет;
  • REJECT — отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен;
  • LOG — сделать запись о пакете в лог файл;
  • QUEUE — отправить пакет пользовательскому приложению.

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

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

  • prerouting — в эту цепочку пакет попадает перед обработкой iptables, система еще не знает куда он будет отправлен, в input, output или forward;
  • postrouting — сюда попадают все проходящие пакеты, которые уже прошли цепочку forward.

Но это еще не все. У нас еще есть таблицы iptables, с которыми тоже желательно разобраться.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: