Поиск по сайту:

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


Введение

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 также используется, если вы настраиваете сервер приложений для подключения к серверу базы данных с адресом localhost. Таким образом, вы должны быть уверены, что ваш брандмауэр разрешает эти подключения.

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

  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

Если для политики OUTPUT брандмауэра не установлено значение 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 могла синхронизироваться с вашим сервером, выполните следующие команды:

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

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