Я думаю, что использую неправильную технику, но не уверен в правильной.
Машина: Red Hat, выпуск 7.2
firewalld.noarch: 0.3.9-14.el7
Меня попросили закрыть два порта, но убедиться, что все остальные порты открыты. Решение должно легко включаться и выключаться. С этой целью я сделал:
поднять firewalld
установить "доверенный" как зону по умолчанию # Доверенный открывает все порты
firewall-cmd --zone = trusted --add-interface = eno16780032 # только интерфейс Ethernet на этом сервере.
В целях тестирования выполните команду nc -l номер_порта, чтобы получить ответ на этот порт.
Выполните проверку: перейдите на другой компьютер, выполните команду 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'