Настройка iptables

Штатный, довольно популярный фаервол в Ubuntu - iptables. Все примеры статьи протестированы под Ubutnu 14.04. Iptables — это по сути пользовательский интерфейс управления системой netfilter, которая управляет сетевым стеком Linux. Iptables сравнивает каждый поступающий пакет с набором установленных правил и принимает решение, что с ним делать.

Все команды iptables необходимо выполнять только с root-привилегиями, для этого нужно:

  • использовать sudo (рекомендуемый способ в Ubuntu);
  • использовать su или sudo -i, чтобы более безопасно работать под root;
  • войти в систему как пользователь root.

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

Следует учесть, что для сети IPv4 используется iptables, а для IPv6 - ip6tables, и если IPv6 не используется - можно сразу запретить весь трафик в ip6tables:

# ip6tables -P INPUT DROP
# ip6tables -P OUTPUT DROP
# ip6tables -P FORWARD DROP

Но, если после отключения всех соединений по IPv6 перестанет работать обновление системы (aptitude update), нужно будет модифицировать настройки.

Чтобы в ходе экспериментов не потерять доступ к удаленному серверу по IPv4, нужно прописать сброс всех правил iptables раз в 20 минут по cron:

# crontab -e
Добавить строку:
*/20 * * * * /sbin/iptables -F

Теперь, даже если случайно будет заблокирован весь трафик, то каждые 20 минут будет происходить сброс правил из таблицы фаервола filter table, что позволит не потерять доступ к серверу. Для этого варианта следует учитывать политики iptables по умолчанию. Если фаервол еще никем не настраивался, то запустив команду iptables -S можно увидеть следующее:

# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

Данные настройки указывают, что после сброса всех правил при помощи iptables -F весь трафик будет разрешен. Если заменить настройки по умолчанию на DROP, как это сделано в начале статьи для протокола IPv6, то они все равно будут действовать даже после сброса настроек с помощью флага -F. То есть команда iptables -F удаляет ВСЕ настройки firewall из таблицы filter tables, КРОМЕ НАСТРОЕК ПО УМОЛЧАНИЮ.

Все настройки iptables будут сброшены после перезагрузки сервера, включая цепочки INPUT, FORWARD, OUTPUT, которые после запуска сервера перейдут в статус ACCEPT. Это же касается и настроек по умолчанию. Как не потерять настройки iptables и ip6tables при перезагрузке, будет написано ниже.

Таблицы правил

Штатный фаервол Ubuntu - iptables, состоит из пяти таблиц: filter, nat, mangle, raw и security. Чтобы посмотреть настройки из определенной таблицы, например из nat table, нужно запустить команду: iptables -L -t nat. Таблица filter table используется по умолчанию, и для того, чтобы посмотреть, какие правила уже внесены в неё, достаточно набрать: iptables -L (без указания имени таблицы). По умолчанию, iptables настроен так, что разрешено все.

Filter table - таблица для фильтрования входящего, исходящего и проходящего (перенаправляемого) трафика. Для каждого вида трафика в filter table используется своя цепочка: INPUT, OUTPUT и FORWARD соответственно.

Nat table - применяется для изменения IP адреса источника и имеет три своих цепочки правил: PREROUTING - меняет IP адрес перед переадресацией, POSTROUTING - изменяет IP адрес после перенаправления и OUTPUT - используется для фильтрации исходящих пакетов. nat table нужна, например, для настройки VPN и др.

Mangle - используется для модификации пакетов.

Еще существует две таблицы: raw и security, для чего они предназначены, можно ознакомиться набрав man 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 и 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.

Опубликовано: 2016/03/29
HTML-код ссылки на эту страницу:
<a href="https://petrenco.com/linux.php?txt=553" target="_blank">Настройка iptables</a>
9506
Добавить комментарий
Ваш e-mail: (не виден посетителям сайта)
Ваше имя:
Комментарий:
Символы с картинки:
Только выделенные поля формы добавления комментариев обязательны к заполнению.