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

пытаясь закрыть два порта с помощью firewalld, оставив все остальное открытым

Я думаю, что использую неправильную технику, но не уверен в правильной.

Машина: Red Hat, выпуск 7.2

firewalld.noarch: 0.3.9-14.el7

Меня попросили закрыть два порта, но убедиться, что все остальные порты открыты. Решение должно легко включаться и выключаться. С этой целью я сделал:

Выполните проверку: перейдите на другой компьютер, выполните команду telnet machine_name port_number и обратите внимание, что я получаю ответ. (Перезапуск nc после каждого теста.)

Отключить порт:

Проверить:

Возвращает "нет"

На этом этапе nc должен прослушивать port_number, но он должен быть заблокирован firewalld. Я не смогу подключиться к нему.

Однако "telnet machine_name port_number" с другого компьютера все еще подключается.

Я даже не пытаюсь сделать это постоянным на данный момент, просто пытаюсь заставить правило работать. Что я делаю не так?

Приложение: у нас есть собственная серверная служба, работающая в конфигурации главный / подчиненный. Подчиненный всегда активен, чтобы синхронизировать данные с мастером. Только система, обозначенная как "ведущая", может использоваться во внешнем интерфейсе. (Разработчики говорят, что создание настоящего кластера потребует слишком много работы.)

В «облаке» есть балансировщик нагрузки (которым у нас нет прямого контроля), который указывает на обе машины. Цель состоит в том, чтобы заблокировать два ключевых порта на ведомом устройстве, чтобы балансировщик нагрузки всегда переходил к ведущему устройству. Когда мы переходим к отказу, порты на «ведомом» (теперь ведущем) разблокируются, а порты на «ведущем» (теперь ведомом) блокируются, заставляя балансировщик нагрузки перейти к новому ведущему.

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

Любые идеи?

IIRC философия, лежащая в основе firewalld закрывать все и открывать только те порты, которые вам нужны. Итак, вы пытаетесь сделать обратное. Поэтому такие команды, как --add-port добавит указанный порт как открытый.
Например, добавление порта 80 просто добавит еще один ACCEPT правило iptables но поскольку цель для зоны trusted является ACCEPT уже это правило просто не имеет значения.

$ firewall-cmd --zone=trusted --add-port=80/tcp

$ iptables -L -n | grep 80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 ctstate NEW

То же самое, если вы удалите порт с помощью --remove-port, который должен дать подсказку, если соответствующий порт не настроен.

$ firewall-cmd --zone=trusted --remove-port 80/tcp
success
$ firewall-cmd --zone=trusted --remove-port 80/tcp
Warning: NOT_ENABLED: '80:tcp' not in 'trusted'
success

firewalld также предоставляет rich-rules который можно использовать для того, чего вы хотите достичь.

Следующая команда закроет порт 80 / тсп.

firewall-cmd --zone=trusted --add-rich-rule='rule family="ipv4" port port="80" protocol="tcp" reject'

Если вы хотите разрешить подключение одного IP-адреса к этому порту, вы можете добавить source.

firewall-cmd --zone=trusted --add-rich-rule='rule family="ipv4" source NOT address="192.168.122.1" port port="80" protocol="tcp" reject'firewall-cmd --zone=trusted --add-rich-rule='rule family="ipv4" source NOT address="192.168.122.1" port port="80" protocol="tcp" reject'

В source Параметр также принимает подсети в нотации CIDR.

firewall-cmd --zone=trusted --add-rich-rule='rule family="ipv4" source NOT address="192.168.122.1" port port="80" protocol="tcp" reject'firewall-cmd --zone=trusted --add-rich-rule='rule family="ipv4" source NOT address="192.168.122.0/24" port port="80" protocol="tcp" reject'