Iptables – это брандмауэр, который включен в большинство дистрибутивов Linux по умолчанию. Данное руководство представляет собой шпаргалку по Iptables. Здесь вы найдёте основные правила брандмауэра, которые используются в большинстве сценариев: открытие и блокирование сервисов и портов, сетевых интерфейсов и IP-адресов.
Как пользоваться этим руководством
Для начала нужно установить iptables на свой сервер.
Большинство описанных в руководстве правил сбрасывают входящий трафик согласно политике по умолчанию (DROP). Вы можете выборочно разблокировать входящий трафик самостоятельно.
Вам необязательно выполнять всё руководство по порядку. Найдите раздел, который содержит необходимые вам инструкции, и используйте предложенные в нём правила. В основном, разделы руководства никак не связаны друг с другом.
При необходимости вы можете просто скопировать и вставить предложенные здесь примеры правил, предварительно откорректировав их.
Запомните: порядок правил в файле имеет огромное значение! Каждая команда iptables использует флаг –A, чтобы вставить правило в конец цепочки. Если вы хотите выбрать место, которое будет занимать правило в цепочке, используйте флаг –I. Чтобы поместить правило в начало цепочки, просто не указывайте в команде его номер.
Примечание: При работе с брандмауэром можно случайно заблокировать себе доступ к собственному серверу – запретить SSH-трафик, порт 22. Если это произошло, попробуйте подключиться к серверу с помощью консоли и исправьте настройки брандмауэра, разрешите трафик на порт 22. Если же вы не сохранили новый набор правил, который блокирует SSH, а старые правила открывают порт 22, просто перезапустите сервер. Несохраненные правила будут сброшены, и вы снова сможете подключиться к серверу.
Чтобы проверить текущий набор правил iptables, используйте команды:
sudo iptables -S
sudo iptables -L
Сохранение правил
Правила Iptables сбрасываются после перезагрузки сервера. Чтобы они использовались на постоянной основе, их нужно сохранить вручную.
Сохранение правил в Ubuntu
В Ubuntu правила сохраняются с помощью пакета iptables-persistent. Установите этот пакет:
sudo apt-get install iptables-persistent
Во время установки будет предложено сохранить текущий набор правил.
Если вы обновили правила и хотите сохранить их, введите команду: э
sudo invoke-rc.d iptables-persistent save
Сохранение правил в CentOS 6 и более старых версиях
Примечание: CentOS 7 по умолчанию использует FirewallD.
В CentOS 6 и более старых версиях можно использовать скрипт инициализации iptables, чтобы сохранить файл:
sudo service iptables save
Текущий набор правил iptables будет сохранён в /etc/sysconfig/iptables.
Просмотр и удаление правил
Эта тема подробно рассмотрена в руководстве Вывод и удаление правил IPTables.
Общие правила IPTables
В данном разделе вы найдёте самые распространённые правила и команды IPTables.
Поддержка интерфейса обратной петли
Интерфейс обратной петли (также называется lo)- это интерфейс, который компьютер использует для сетевых подключений к самому себе.
Интерфейс обратной петли также используется для настройки взаимодействия сервера приложений с сервером баз данных на локальном адресе. Чтобы установить такое соединение, нужно настроить брандмауэр для его поддержки.
Чтобы разрешить трафик на интерфейс обратной петли, выполните следующие команды:
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 15.15.15.51 -j DROP
В данной команде -s 15.15.15.51 указывает источник соединений, который нужно заблокировать.
Примечание: Указать IP источника можно в любом правиле брандмауэра, включая allow.
Чтобы отклонить соединения, поступающие от этого адреса (при этом он получит ошибку Connection refused), замените DROP на REJECT:
sudo iptables -A INPUT -s 15.15.15.51 -j REJECT
Ограничение соединений по интерфейсу
Брандмауэр может заблокировать соединения, поступающие от IP (к примеру, 15.15.15.51) на определённый интерфейс (например, eth0).
iptables -A INPUT -i eth0 -s 15.15.15.51 -j DROP
Эта команда отличается от предыдущей только опцией -i eth0. Вы можете указать сетевой интерфейс в любом правиле брандмауэра.
Сервис SSH
Чтобы работать с облачным сервером, нужно разрешить входящие соединения SSH (порт 22).
Разрешение всего входящего трафика
Для этого используйте команды:
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.
Белый список IP-адресов
Вы можете разрешить входящие соединения SSH от заведомо безопасных адресов или подсети. К примеру, чтобы разрешить соединение от подсети 15.15.15.0/24, выполните следующие команды:
sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --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.
Разрешение исходящего трафика
Если политика OUTPUT – не ACCEPT, но вам нужно разрешить исходящие 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
Rsync использует порт 873 и позволяет передавать файлы с одного компьютера на другой.
Чтобы разрешить входящие соединения rsync, поступающие от определённых IP-адресов или подсети, укажите исходный IP и целевой порт. К примеру, чтобы разрешить соединения от подсети 15.15.15.0/24, нужно использовать:
sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --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) обычно прослушивают HTTP и HTTPS соединения на портах 80 и 443 соответственно. Если политика брандмауэра по умолчанию блокирует или отклоняет соединения, вам нужно создать правила-исключения из этой политики, чтобы веб-серверы могли обслуживать запросы.
Разрешение входящего трафика 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
Вторая команда, которая разрешает исходящий трафик существующих HTTPS-соединений, нужна только в том случае, если политика OUTPUT – не ACCEPT.
Разрешение входящего трафика HTTP и HTTPS
Чтобы разрешить трафик HTTP и HTTPS, используйте модуль multiport. Создайте правило, которое открывает оба порта для входящего трафика:
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 используется клиентом на удаленном сервере, вы должны обязательно разрешить этот трафик.
Белый список IP-адресов для MySQL
Чтобы разрешить доступ к MySQL для определённых IP-адресов или подсетей, используйте такие команды:
sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --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 eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Вторая команда, которая разрешает исходящий трафик существующих соединений MySQL, нужна только в том случае, если политика OUTPUT – не ACCEPT.
Система управления базами данных PostgreSQL
PostgreSQL прослушивает клиентские соединения на порте 5432. Если сервер PostgreSQL используется клиентом на удаленном сервере, вы должны обязательно разрешить этот трафик.
Белый список IP-адресов для PostgreSQL
Чтобы разрешить доступ к PostgreSQL для определённых IP-адресов или подсетей, используйте такие команды:
sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
где 15.15.15.0/24 – подсеть, которая сможет получить доступ к PostgreSQL.
Вторая команда, которая разрешает исходящий трафик существующих соединений PostgreSQL, нужна только в том случае, если политика OUTPUT – не ACCEPT.
Сетевые интерфейсы PostgreSQL
Чтобы разрешить доступ к PostgreSQL с помощью определённого сетевого интерфейса (например, eth1), используйте следующие команды:
sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
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. Чтобы заблокировать исходящий трафик, выполните следующую команду:
sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT
Теперь iptables будет отклонять весь исходящий трафик на порт 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.
Примечание: Обычно SMTP-серверы используют порт 587 для исходящей почты.
Разрешение входящего трафика 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 очень гибкий инструмент; чтобы подобрать наиболее оптимальные правила, поэкспериментируйте с настройками брандмауэра самостоятельно.
Читайте также: