Я хочу настроить межсетевой экран CentOS 7 таким образом, чтобы все входящие запросы блокировались, за исключением исходящих IP-адресов, которые я занес в белый список. И для IP-адресов из белого списка все порты должны быть доступны.
Я могу найти несколько решений (не уверен, будут ли они работать), iptables
но CentOS 7 использует firewalld
. Я не могу найти ничего похожего, чтобы добиться с помощью firewall-cmd
команды.
Интерфейсы находятся в Public Zone. Я также уже переместил все сервисы в Public zone.
решение1
Я бы добился этого, добавив источники в зону. Сначала проверьте, какие источники есть для вашей зоны:
firewall-cmd --permanent --zone=public --list-sources
Если таковых нет, вы можете начать их добавлять, это ваш «белый список»
firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32
(Это добавляет целый /24
и отдельный IP-адрес, так что у вас есть ссылка как на подсеть, так и на отдельный IP-адрес)
Задайте диапазон портов, которые вы хотите открыть:
firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp
Это касается только портов с 1 по 22. При желании вы можете расширить это число.
Теперь перезагрузите то, что вы сделали.
firewall-cmd --reload
И проверьте свою работу:
firewall-cmd --zone=public --list-all
Примечание / редакционная статья: Это неважно, но мне нравится зона "доверенных" для белого списка IP-адресов в firewalld. Вы можете сделать дальнейшую оценку, прочитавпредложения redhat по выбору зоны.
Смотрите также:
- Статья об использовании брандмауэров в RHEL 7
- Документация Fedora FirewallD(довольно неплохо, Fedora уже некоторое время использует firewalld)
Если вам нужны DROP
пакеты за пределами этого источника, вот пример того, как отбросить те, которые находятся за пределами того, что /24
я использовал в качестве примера ранее,для этого можно использовать расширенные правила, я полагаю. Это концептуально, я не тестировал это (кроме того, что увидел, что centos 7 принимает команду), но, должно быть достаточно просто сделать pcap и посмотреть, ведет ли он себя так, как вы ожидаете
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'
решение2
Даже если ответ был принят и проголосован, я не думаю, что он правильный. Я не могу найти четкого объяснения в документации, но из реализованного поведения это выглядит так:
- Интерфейс и источник используются как селекторы — какую зону(ы) активировать
- оба игнорируются для зоны по умолчанию (всегда активна)
Итак, ответ будет таким:
- заблокируйте зону по умолчанию, например «публичную» — порты не должны быть открыты, а службы недоступны
- в другой зоне скажите «работа» — определите источник и откройте порты
Например, предположим, что зона по умолчанию является публичной и не имеет открытых портов, добавим источник и диапазон портов в «рабочую» зону:
$ sudo firewall-cmd --zone=work --add-source=192.168.0.0/24
$ sudo firewall-cmd --zone=work --add-port=8080-8090/tcp
Теперь проверьте активные зоны (зона по умолчанию всегда активна):
$ sudo firewall-cmd --get-active-zones
ты получишь:
work
sources: 192.168.0.0/24
поэтому правила зоны "work" будут применяться к конкретной подсети. У вас будет диапазон открытых портов для "белого списка" =подсетькак и просили. И конечно же используйте --permanent
option в --add-xxx
утверждениях, чтобы закрепить поведение.
В свою очередь, любые порты или службы, которые находятся в «публичной» (по умолчанию) зоне, будут применяться ко всем интерфейсам и исходным адресам.
$ sudo firewall-cmd --list-all-zones
public (default)
interfaces:
sources:
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
work (active)
interfaces:
sources: 192.168.0.0/24
services: dhcpv6-client ipp-client ssh
ports: 8080-8090/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Та же система работает для интерфейсов. Скажем, добавляя интерфейс "ens3" в зону "work":
$ sudo firewall-cmd --zone=work --add-interface=ens3
вы будете использовать правила зоны «work» для любых запросов из определенного интерфейса — более грубый селектор, чем «source».
решение3
Отказ от ответственности: я на самом деле не пробовал то, что предлагаю, здесь, но это довольно близко к последней настройке firewalld, которую я делал, поэтому я исхожу из этого. Firewalld предоставляет вам несколько предварительно настроенных зон, как раз для этой цели. Одна называется "drop", которая сбрасывает все входящее, и одна называется "trusted", которая позволяетлюбойсоединение (т. е., так что вам даже не нужно открывать отдельные порты, я думаю). Хитрость в том, чтобы заставить нужную зону сработать для того, что вам нужно.
Firewalld применит правила для зоны на основе следующего приоритета:
- Если исходный IP-адрес совпадает с исходным IP-адресом, привязанным к зоне, он использует его.
- Если исходный IP-адрес не соответствует ни одной конкретной зоне, он проверяет, настроена ли для него зона.интерфейспакет пришел на. Если есть один, он использует его.
- Наконец, если ничего не совпадает, используется зона по умолчанию.
Итак, для начала вам необходимо привязать свои доверенные IP-адреса к «доверенной» зоне:
firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4
Затем либо установите зону по умолчанию на «drop», либо привяжите к ней свой интерфейс:
firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0
и затем дайте изменениям вступить в силу (предупреждение: это, вероятно, приведет к разрыву соединения, если вы делаете это по сети и не добавили свой исходный IP-адрес в доверенную зону):
firewall-cmd --reload
Конечно, вы также можете просто временно протестировать их, опустив «--permanent» (и тогда вам не придется использовать --reload).
решение4
Я удивлен, что ответы на доверенные зоны не являются выбранным ответом. Доверенная зона имеет значение по умолчанию "target: ACCEPT", в то время как остальные - "target: default". Хотя это на самом деле не имеет значения, похоже, что это предполагаемый метод из-за его названия и значения цели по умолчанию.
Как быстро заблокировать ящик, чтобы доступ к нему был только у вас:
firewall-cmd --zone=trusted --add-source=1.2.3.4
firewall-cmd --zone=trusted --add-source=5.6.7.8/24
firewall-cmd --zone=drop --change-interface=eth1
firewall-cmd --set-default-zone=drop
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
firewall-cmd --list-all-zones
После перечисления всех зон вы должны увидеть что-то вроде этого:
trusted (active)
target: ACCEPT
icmp-block-inversion: no
sources: 1.2.3.4 5.6.7.8/24
masquerade: no
drop (active)
target: DROP
icmp-block-inversion: no
interfaces: eth1
masquerade: no
Примечание: Я удалил строки с нулевым/отсутствующим значением. Важно то, что trusted и drop оба (активны) и drop имеет ваш публичный интерфейс.
Что это делает с iptables для демонстрации:
Chain INPUT_ZONES_SOURCE (1 references)
target prot opt source destination
IN_trusted all -- 1.2.3.4 0.0.0.0/0
IN_trusted all -- 5.6.7.8/24 0.0.0.0/0
Chain INPUT_ZONES (1 references)
target prot opt source destination
IN_drop all -- 0.0.0.0/0 0.0.0.0/0
IN_drop all -- 0.0.0.0/0 0.0.0.0/0
IN_drop all -- 0.0.0.0/0 0.0.0.0/0