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

Вступление

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

Как использовать это руководство
  • Если вы только начинаете настраивать брандмауэр iptables, ознакомьтесь с нашими https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14 -04 [введение в iptables]

  • Большинство описанных здесь правил предполагают, что ваш iptables установлен на * DROP * входящий трафик через политику ввода по умолчанию, и вы хотите выборочно разрешать трафик в

  • Используйте те разделы, которые применимы к тому, чего вы пытаетесь достичь. Большинство разделов не основаны на других, поэтому вы можете использовать примеры ниже независимо

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

  • Скопируйте и вставьте приведенные примеры командной строки, заменив значения красным на собственные.

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

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

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

Правила сохранения

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

Ubuntu

В Ubuntu самый простой способ сохранить правила iptables, чтобы они пережили перезагрузку, - это использовать пакет + iptables-persistent +. Установите его с помощью apt-get следующим образом:

sudo apt-get install iptables-persistent

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

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

sudo netfilter-persistent save

В версиях Ubuntu до 16.04 выполните эту команду:

sudo invoke-rc.d iptables-persistent save

CentOS 6 и старше

В CentOS 6 и более ранних версиях CentOS 7 по умолчанию использует FirewallD - вы можете использовать сценарий + iptables + init для сохранения ваших правил iptables:

sudo service iptables save

Это сохранит ваши текущие правила iptables в файл + / etc / sysconfig / iptables +.

Правила листинга и удаления

Если вы хотите узнать, как составлять список и удалять правила iptables, ознакомьтесь с этим руководством: https://www.digitalocean.com/community/tutorials/how-to-list-and-delete-iptables-firewall-rules[How To Список и удаление правил брандмауэра Iptables.

Общепринятые правила

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

Разрешить петлевые соединения

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

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

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

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

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

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

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

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

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

Внутренний на внешний

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

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

Отбросить недействительные пакеты

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

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

Заблокировать IP-адрес

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

sudo iptables -A INPUT -s  -j DROP

В этом примере + -s 15.15.15.51 + указывает IP-адрес * source *, равный «15.15.15.51». Исходный IP-адрес может быть указан в любом правиле брандмауэра, включая правило * allow *.

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

sudo iptables -A INPUT -s  -j REJECT

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

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

iptables -A INPUT -i  -s  -j DROP

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

Сервис: SSH

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

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

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

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

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

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

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

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

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

Разрешить исходящий SSH

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

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

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

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

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

sudo iptables -A INPUT -p tcp -s  --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
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), выполните следующие команды:

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

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

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

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

sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
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), выполните следующие команды:

sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
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-адреса или подсети, укажите источник. Например, если вы хотите разрешить всю подсеть + 15.15.15.0 / 24 +, выполните следующие команды:

sudo iptables -A INPUT -p tcp -s  --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

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

Разрешить MySQL для конкретного сетевого интерфейса

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

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

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

Сервис: PostgreSQL

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

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

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

sudo iptables -A INPUT -p tcp -s  --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

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

Разрешить PostgreSQL для конкретного сетевого интерфейса

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

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

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

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

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

Блокировать исходящую почту SMTP

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

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

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

Разрешить все входящие SMTP

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

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

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

Разрешить все входящие IMAP

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

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

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

Разрешить все входящие IMAPS

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Если вам нужна помощь в определении того, как должен быть настроен ваш брандмауэр, ознакомьтесь с этим руководством: https://www.digitalocean.com/community/tutorials/how-to-choose-an-effective-firewall-policy-to -secure-your-servers [Как выбрать эффективную политику брандмауэра для защиты ваших серверов].

Удачи!

Related