Основы Iptables: Общие правила и команды брандмауэра

Введение

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

Как использовать это руководство

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

Помните, что порядок ваших правил имеет значение. Все эти команды iptables используют опцию -A для добавления нового правила в конец цепочки. Если вы хотите поместить его в другое место цепочки, вы можете использовать опцию -I, которая позволяет указать позицию нового правила (или разместить его в начале цепочки, не указывая номер правила).

Примечание: При работе с брандмауэрами обязательно следите за тем, чтобы не заблокировать себя на своем собственном сервере, блокируя трафик SSH (порт 22 по умолчанию). Если вы потеряете доступ из-за настроек брандмауэра, вам может потребоваться подключиться к нему через веб-консоль, чтобы восстановить свой доступ. Если вы используете DigitalOcean, вы можете прочитать документацию по нашему продукту Recovery Console для получения дополнительной информации. После подключения через консоль вы сможете изменить правила брандмауэра для разрешения доступа по SSH (или разрешить весь трафик). Если ваши сохраненные правила брандмауэра разрешают доступ по SSH, другим методом является перезагрузка сервера.

Помните, что вы можете проверить текущий набор правил iptables с помощью sudo iptables -S и sudo iptables -L.

Давайте рассмотрим команды iptables!

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

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

На Ubuntu один из способов сохранения правил iptables – использовать пакет iptables-persistent. Установите его с помощью apt, как показано ниже:

  1. sudo apt install iptables-persistent

Во время установки вас спросят, хотите ли вы сохранить текущие правила брандмауэра.

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

  1. sudo netfilter-persistent save

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

Перечисление и удаление правил

Если вы хотите узнать, как перечислить и удалить правила iptables, ознакомьтесь с этим руководством: Как перечислить и удалить правила брандмауэра iptables.

Общие полезные правила

Этот раздел включает различные команды iptables, которые создадут правила, которые обычно полезны на большинстве серверов.

Разрешение соединений к обратной петле

Интерфейс loopback, также известный как lo, используется компьютером для перенаправления сетевых соединений к самому себе. Например, если вы запустите ping localhost или ping 127.0.0.1, ваш сервер выполнит пинг к самому себе, используя loopback. Интерфейс loopback также используется, если вы настраиваете сервер приложений для подключения к серверу базы данных с адресом localhost. Поэтому вам следует убедиться, что ваш брандмауэр разрешает эти соединения.

Чтобы принять весь трафик на вашем интерфейсе loopback, выполните эти команды:

  1. sudo iptables -A INPUT -i lo -j ACCEPT
  2. sudo iptables -A OUTPUT -o lo -j ACCEPT

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

  1. sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Разрешение исходящих соединений, установленных

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

  1. sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

Разрешение внутренней сети на доступ к внешней

Предполагая, что eth0 – это ваша внешняя сеть, а eth1 – ваша внутренняя сеть, это позволит вашей внутренней сети получить доступ к внешней:

  1. sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Отбрасывание недопустимых пакетов

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

  1. sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

Блокирование IP-адреса

Чтобы заблокировать сетевые соединения, исходящие из определенного IP-адреса, например, 203.0.113.51, выполните эту команду:

  1. sudo iptables -A INPUT -s 203.0.113.51 -j DROP

В этом примере -s 203.0.113.51 указывает исходный IP-адрес “203.0.113.51”. Исходный IP-адрес может быть указан в любом правиле брандмауэра, включая правило разрешения.

Если вы хотите отклонить соединение вместо этого, что приведет к ответу на запрос о соединении с ошибкой “соединение отклонено”, замените “DROP” на “REJECT” следующим образом:

  1. sudo iptables -A INPUT -s 203.0.113.51 -j REJECT

Блокировка соединений с сетевым интерфейсом

Чтобы блокировать соединения с определенного IP-адреса, например, 203.0.113.51, с определенным сетевым интерфейсом, например, eth0, используйте эту команду:

  1. iptables -A INPUT -i eth0 -s 203.0.113.51 -j DROP

Это то же самое, что и предыдущий пример, с добавлением -i eth0. Сетевой интерфейс можно указывать в любом правиле брандмауэра и является отличным способом ограничить правило для конкретной сети.

Сервис: SSH

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

Разрешение всех входящих SSH

Для разрешения всех входящих соединений SSH выполните эти команды:

  1. sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

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

Разрешение входящих SSH из определенного IP-адреса или подсети

Чтобы разрешить входящие соединения SSH из определенного IP-адреса или подсети, укажите источник. Например, если вы хотите разрешить всю подсеть 203.0.113.0/24, выполните эти команды:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

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

Разрешение исходящего SSH

Если ваша политика вывода брандмауэра не установлена на ACCEPT, и вы хотите разрешить исходящие SSH-соединения — ваш сервер инициирует SSH-соединение с другим сервером — вы можете выполнить эти команды:

  1. sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Разрешение входящего Rsync с определенного IP-адреса или подсети

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

Чтобы разрешить входящие соединения rsync с определенного IP-адреса или подсети, укажите исходный IP-адрес и порт назначения. Например, если вы хотите разрешить всей подсети 203.0.113.0/24 использовать rsync для передачи файлов на ваш сервер, выполните эти команды:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая разрешает исходящий трафик установленных соединений rsync, необходима только в том случае, если политика OUTPUT не установлена на ACCEPT.

Сервис: Веб-сервер

Веб-серверы, такие как Apache и Nginx, обычно прослушивают запросы на портах 80 и 443 для HTTP и HTTPS соединений соответственно. Если ваша политика по умолчанию для входящего трафика установлена на отбрасывание или отклонение, вам следует создать правила, которые позволят вашему серверу отвечать на эти запросы.

Разрешение всех входящих HTTP

Для разрешения всех входящих соединений HTTP (порт 80) выполните эти команды:

  1. sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая разрешает исходящий трафик установленных соединений HTTP, необходима только в том случае, если политика OUTPUT не установлена в ACCEPT.

Разрешение всех входящих HTTPS

Чтобы разрешить все входящие соединения HTTPS (порт 443), выполните эти команды:

  1. sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая разрешает исходящий трафик установленных соединений HTTP, необходима только в том случае, если политика OUTPUT не установлена в ACCEPT.

Разрешение всех входящих HTTP и HTTPS

Если вы хотите разрешить как трафик HTTP, так и HTTPS, вы можете использовать модуль multiport, чтобы создать правило, разрешающее оба порта. Чтобы разрешить все входящие соединения HTTP и HTTPS (порт 443), выполните эти команды:

  1. sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая позволяет исходящему трафику установленных HTTP и HTTPS соединений, необходима только в том случае, если политика OUTPUT не установлена на ACCEPT.

Служба: MySQL

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

Разрешение доступа к MySQL из определенного IP-адреса или подсети

Чтобы разрешить входящие подключения MySQL из определенного IP-адреса или подсети, укажите источник. Например, если вы хотите разрешить весь поддиапазон 203.0.113.0/24, выполните эти команды:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая позволяет исходящему трафику установленных соединений MySQL, необходима только в том случае, если политика OUTPUT не установлена на ACCEPT.

Разрешение доступа к MySQL через определенный сетевой интерфейс

Для разрешения подключений MySQL к определенному сетевому интерфейсу — скажем, у вас есть частный сетевой интерфейс eth1, например — используйте эти команды:

  1. sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая разрешает исходящий трафик установленных соединений MySQL, необходима только в том случае, если политика OUTPUT не установлена на ACCEPT.

Служба: PostgreSQL

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

PostgreSQL из конкретного IP-адреса или подсети

Чтобы разрешить входящие подключения PostgreSQL из определенного IP-адреса или подсети, укажите источник. Например, если вы хотите разрешить всю подсеть 203.0.113.0/24, выполните эти команды:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая разрешает исходящий трафик установленных соединений PostgreSQL, необходима только в том случае, если политика OUTPUT не установлена на ACCEPT.

Разрешение подключения PostgreSQL к определенному сетевому интерфейсу

Чтобы разрешить подключения PostgreSQL к определенному сетевому интерфейсу – скажем, у вас есть частный сетевой интерфейс eth1, например, используйте эти команды:

  1. sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая разрешает исходящий трафик установленных соединений PostgreSQL, необходима только в том случае, если политика OUTPUT не установлена на ACCEPT.

Сервис: Почта

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

Блокировка исходящей почты SMTP

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

  1. sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT

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

Разрешение входящего трафика SMTP

Чтобы разрешить вашему серверу отвечать на соединения SMTP на порту 25, выполните эти команды:

  1. sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая разрешает исходящий трафик установленных SMTP-соединений, необходима только в том случае, если политика OUTPUT не установлена в ACCEPT.

Разрешение входящего трафика IMAP

Чтобы разрешить вашему серверу отвечать на соединения IMAP, порт 143, выполните эти команды:

  1. sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая разрешает исходящий трафик установленных IMAP-соединений, необходима только в том случае, если политика OUTPUT не установлена в ACCEPT.

Разрешение входящего трафика IMAPS

Чтобы разрешить вашему серверу отвечать на IMAPS-подключения, порт 993, выполните эти команды:

  1. sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая разрешает исходящий трафик установленных IMAPS-соединений, необходима только в том случае, если политика OUTPUT не установлена на ACCEPT.

Разрешение всех входящих POP3

Чтобы разрешить вашему серверу отвечать на подключения POP3, порт 110, выполните эти команды:

  1. sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая разрешает исходящий трафик установленных POP3-соединений, необходима только в том случае, если политика OUTPUT не установлена на ACCEPT.

Разрешение всех входящих POP3S

Чтобы разрешить вашему серверу отвечать на подключения POP3S, порт 995, выполните эти команды:

  1. sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Вторая команда, которая разрешает исходящий трафик установленных POP3S-соединений, необходима только в том случае, если политика OUTPUT не установлена на ACCEPT.

Заключение

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

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

Source:
https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands