Назад | Перейти на главную страницу

Как настроить исходящие правила с помощью iptables (в Ubuntu)?

Как настроить правила выхода с помощью iptables в Ubuntu?

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

Правила выхода являются ключом к любой политике безопасности и необходимы для соответствия многим стандартам безопасности (например, PCI DSS).

ПРИМЕЧАНИЕ. Команды здесь предполагают дистрибутив на основе Debian (например, сервер Ubuntu). Команды iptables должны быть одинаковыми для разных дистрибутивов, но проверьте справочное руководство вашего собственного дистрибутива, чтобы узнать, как сохранять и загружать iptables, поскольку эти шаги различаются. Если кто-то хочет викифицировать это и добавить RH или другие различия, сделайте это.

В приведенном ниже примере мы настроим довольно общие правила для сервера, которому действительно нужно только получать обновления пакетов. Помните, что это команды с учетом регистра, а также порядок, в котором вы их вводите, соответствует порядку их оценки (то есть, если вы подключаетесь через SSH, не выполняйте сначала -A OUTPUT -j REJECT).

Пример набора правил

sudo iptables -A OUTPUT -o lo -p all -j ACCEPT 
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 80 -d security.ubuntu.com -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 80 -d us.archive.ubuntu.com -j ACCEPT
sudo iptables -A OUTPUT -j REJECT

ВАЖНО: не добавляйте правила security.ubuntu.com или us.archive.ubuntu.com, если вы не /etc/hosts запись для них (но см. «Другие правила выхода» при открытии DNS-запросов). Имейте в виду, что iptables оценит IP для этих адресов ВО ВРЕМЯ ПРИМЕНЕНИЯ ПРАВИЛА. Поэтому, если ubuntu изменяет эти адреса, вам необходимо воссоздать эти правила или перезагрузить компьютер (правила применяются при запуске).

Давайте посмотрим на каждое из этих правил:

Правило локального интерфейса

sudo iptables -A OUTPUT -o lo -p all -j ACCEPT 

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

Правило секретного соуса (установленные / связанные сеансы)

sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

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

Разрешение обновления Ubuntu apt-get

sudo iptables -A OUTPUT -p tcp --dport 80 -d security.ubuntu.com -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 80 -d us.archive.ubuntu.com -j ACCEPT

Эти правила просто говорят iptables разрешить трафик, идущий на порт 80 для серверов обновлений ubuntu. Они могут отличаться в зависимости от вашего региона, а их может быть больше, поэтому вам придется apt-get update после того, как вы это сделаете, чтобы убедиться, что это работает для вас. ВАЖНО: как я уже упоминал ранее, НЕ включайте это правило, не добавив сначала запись, сопоставляющую соответствующие IP-адреса в /etc/hosts. Также, если Ubuntu изменяет эти IP-адреса, вам нужно будет обновить запись хостов и перезапустить или воссоздать эти правила, поскольку iptables оценивает адреса при применении правила.

Правило "убийцы"

sudo iptables -A OUTPUT -j REJECT

Это правило убивает весь остальной трафик. Это определенно должно быть последним правилом в вашей цепочке, иначе другие правила не сработают.

Не забывайте делать:

sudo sh -c “iptables-save >/etc/iptables.rules”

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

pre-up iptables-restore < /etc/iptables.rules 

под интерфейсом (eth0 или что-то еще) в /etc/network/interfaces.

Другие правила выхода

Чтобы разрешить «пинг» работать (с сервера):

sudo iptables -A OUTPUT -p icmp --icmp echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp echo-reply -j ACCEPT

Разрешить DNS работать (с сервера). Обратите внимание, что добавление этого означает, что вам не нужно использовать /etc/hosts в приведенном выше примере, но, возможно, менее безопасен.

sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

Чтобы разрешить клиенту синхронизации времени NTP:

sudo iptables -A OUTPUT -p udp -m owner --uid-owner systemd-timesync -j ACCEPT

(не стесняйтесь добавлять)