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

iptables: разрешить подключения через порт только к «безопасным» хостам.

У меня есть машина centos, и я хочу разрешить исходящие соединения на порт 587 только с определенными удаленными машинами и отбрасывать пакеты, пытающиеся подключиться ко всем другим хостам.

Я хочу разрешить доступ к порту 587 только в том случае, если они собираются получить доступ к SMTP-серверам Gmail (все IP-адреса за smtp.gmail.com). Есть ли способ реализовать это?

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

iptables -I OUTPUT -p tcp --dport 587 -j DROP
iptables -I OUTPUT -d smtp.gmail.com -p tcp -m tcp --dport 587 -j ACCEPT

должен делать то, что хочешь. Первоначально это вставляет правило DROP all outgoing connections on port 587 в начало цепочки OUTPUT. Затем он вставляет разрешающее правило для порта 587 smtp.gmail.com в начало цепочки OUTPUT. Это позволяет подключаться к smtp.gmail.com:587 и блокировать все остальное на порту 587, например.

iptables -L OUTPUT -n
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            173.194.66.109      tcp dpt:587
ACCEPT     tcp  --  0.0.0.0/0            173.194.66.108      tcp dpt:587
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:587

Обратите внимание, что smtp.gmail.com разрешается в два IP-адреса, поэтому выше есть два правила ПРИНЯТИЯ. Имя разрешается только один раз, когда правило добавляется в ядро, поэтому при изменении адресов соединения с Gmail также будут заблокированы, и вам потребуется перезагрузить правила.

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

Google может использовать любой адрес в своих ASN для серверов Gmail вы захотите разрешить все блоки. Вы можете использовать ipset для обработки задействованных блоков. Вы также можете обнаружить, что их запись SPF предоставляет достойный список сетевых блоков для ваших требований. если ты reject, скорее, чем drop исходящие запросы ваши пользователи могут не заметить несколько пропущенных блоков.

Инструмент вроде Shorewall позволит вам легче реализовать вашу политику. В вашем случае у меня будет исходящая политика REJECT и разрешить только желаемый трафик. В этом случае вам не понадобится конкретное правило для предотвращения доступа к порту отправки. Shorewall также позволяет легко настроить ведение журнала для вашего брандмауэра.

Я бы посоветовал автоматизировать все это, чтобы вам больше не приходилось об этом беспокоиться.

В iptables -I OUTPUT -p tcp --dport 587 -j DROP должен быть включен в вашу базовую конфигурацию системы, которая, вероятно, находится в / etc / sysconfig / iptables на вашем компьютере.

Перетащите этот скрипт в редактор и сохраните его где-нибудь, затем пометьте его как исполняемый с помощью chmod. В качестве примера я поместил его в /opt/sysadminscripts/iptables.smtp.gmail.sh

#!/bin/bash

IPLIST=$(host smtp.gmail.com | grep 'has address' | awk '{print $4}')

for x in $IPLIST
do
        $(iptables -L -nv | grep "$x" >> /dev/null)
        if [[ "$?" -ne '0' ]]; then
                $(iptables -I OUTPUT  -p tcp -m tcp -d "$x" --dport 587 -j ACCEPT)
        fi
done

Затем добавьте запись в системный crontab, подобную этой:

*/10 * * * * root /opt/sysadminscripts/iptables.smtp.gmail.sh

Убедитесь, что эта строка НЕ ​​является последней строкой в ​​вашем / etc / crontab. Если в строке нет завершающего перевода строки, она не запустится. (Я рекомендую оставить комментарий в последней строке / etc / crontab.)

У вас должны быть такие правила, как:

iptables -A FORWARD -p tcp -d smtp.gmail.com --dport 587 -j ACCEPT
iptables -A FORWARD -p tcp --dport 587 -j DROP

Проблема в том, что вам нужно найти возможные IP-адреса для smtp.gmail.com. Не рекомендуется использовать имя в iptables. Это связано с тем, что iptables не распознает изменения сопоставления IP-имен. Возможно, вам придется постоянно проверять изменение IP и соответствующим образом обновлять свои правила.

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