Белые IP-адреса источника в CentOS 7

23

Я хочу настроить брандмауэр CentOS 7 таким образом, чтобы все входящие запросы были заблокированы, кроме исходящих IP-адресов, которые я включил в белый список. А для белых адресов IP все порты должны быть доступны.

Я могу найти несколько решений (не уверен, будут ли они работать), iptablesно CentOS 7 использует firewalld. Я не могу найти что-то подобное, чтобы достичь с помощью firewall-cmdкоманды.

Интерфейсы находятся в публичной зоне. Я также переместил все службы в Публичную зону.

Кришнанду Саркар
источник

Ответы:

44

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

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 по выбору зоны .

Смотрите также:


Если вы хотите, чтобы 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'
dougBTV
источник
Большое спасибо за ответ. Не могу проголосовать из-за недостатка репутации. Но как мне удалить все другие IP-адреса, кроме того, который я добавил, используя источники?
Кришнанду Саркар
Спасибо @KrishnanduSarkar - вы правы, по умолчанию это должно быть отклонение ICMP. Но я думаю, что вы можете добавить богатое правило для отбрасывания пакетов. Я добавил пример к своему ответу, который, я думаю, сработает. Спасибо за ответ, я понимаю, что если ответ работает, подумайте о принятии ответа.
dougBTV
Отличный ответ, я использовал iptables до сих пор.
Тенси
(!) Этот ответ не будет работать должным образом для текущей конфигурации FirewallD по умолчанию (интерфейсы по умолчанию назначены для публичной зоны).
Десс
25

Даже если ответ был принят и одобрен, я не считаю его правильным. Я не могу найти четкого объяснения в документации, но из реализованного поведения это выглядит так:

  1. интерфейс и источник используются как селекторы - какую зону (ы) активировать
  2. оба игнорируются для зоны по умолчанию (всегда активны)

Таким образом, ответ будет:

  1. заблокировать зону по умолчанию, скажем, "public" - порты не открыты или службы недоступны
  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

поэтому правила «рабочей» зоны будут применяться к конкретной подсети. У вас будет диапазон открытых портов для «белого списка» = подсети в соответствии с запросом. И, конечно, используйте --permanentопцию в --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» в «рабочую» зону:

$ sudo firewall-cmd --zone=work --add-interface=ens3

Вы будете использовать правила зоны «работа» для любых запросов от конкретного интерфейса - более грубый селектор, чем «источник».

Нормунд Калнберзиньш
источник
4
Это лучший ответ. Наиболее важной частью является объяснение того, что настройка интерфейса расширяет доступ (в случае, если установлены источники). У меня была проблема, что порты были доступны, хотя у меня был sourcesбелый список. Причина была в том, что для зоны был назначен интерфейс.
Pinkeen
1
Чтобы быть точным, этот ответ требует удаления всех сервисов по умолчанию из publicзоны, если таковые имеются (эти сервисы будут доступны для всех адресов, поскольку интерфейсы назначены publicзоне по умолчанию). Или измените зону по умолчанию на другую: blockили drop(это обычная практика). Или измените publicцель зоны на %%REJECT%%или DROP.
дес
6

Отказ от ответственности: я на самом деле не пробовал то, что я предлагаю, здесь, но это довольно близко к последней настройке firewalld, которую я сделал, поэтому я ухожу от этого. Firewalld предоставляет вам несколько предварительно сконфигурированных зон, как раз для этой цели. Есть один, называемый «отбрасывать», который отбрасывает все входящее, и один, называемый «доверенным», который разрешает любое соединение (т. Е. Вам даже не нужно открывать отдельные порты, я думаю). Хитрость заключается в том, чтобы получить правильную зону для запуска того, что вы хотите.

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, либо).

Jemenake
источник
blockтакже может быть использован (вместо drop), если вы хотите сказать другим хостам, что вы не разговариваете с ними ....
Герт ван ден Берг
5

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

# firewall-cmd --list-all

Вы увидите, что ваша зона по умолчанию является общедоступной, и включены службы dhcpv6-client и ssh. Мы не хотим никаких общественных услуг, верно? Только белые IP-адреса разрешены. Итак, давайте удалим две государственные службы.

# firewall-cmd --zone=public --remove-service=ssh --permanent
# firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent

Теперь давайте внесем в белый список конкретный IP-адрес, который предоставляет доступ к любому порту.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" accept'

Теперь давайте внесем в белый список другой IP-адрес, который нам нужен только для доступа по SSH, http и https. Других портов нет.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="ssh" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="http" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx service name="https" accept'

Если вы подключаетесь через SSH, обязательно авторизуйте свой IP, прежде чем применять новый набор правил. Когда будете готовы применить новые правила.

#firewall-cmd --reload
Сагапонак FX
источник
2

Вы можете легко управлять с помощью Rich Rule.

Первый шаг

firewall-cmd --permanent --set-default-zone=home
firewall-cmd --permanent --zone=drop --change-interface=eth0

Второй шаг - добавьте богатое правило

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" source address="192.168.78.76/32" accept'

Весь порт доступен для 192.168.2.2, как только вы добавите расширенное правило и заблокируете каждый порт из другого источника.

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

firewall-cmd --zone=public --add-service=ssh
firewall-cmd --zone=public --add-port=8080

Если вы хотите открыть конкретный порт для конкретного Ip, чем приведенная ниже команда

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" port="8080/tcp" source address="192.168.78.76/32" accept'
Ранджит Ранджан
источник
2

Главный ответ от dougBTV неправильный. Я не могу ответить на его ответ, потому что у меня еще нет необходимых точек повторения, поэтому я объясню здесь:

Он использует зону по умолчанию "public". Он связывает сети с этой зоной, а затем открывает порты в этой зоне. Но в конфигурации по умолчанию весь трафик проходит через зону по умолчанию, а не только в исходные сети, к которым вы привязаны. Так что его команды --add-source не имеют значения, и его команды --add-port теперь позволили всему миру получить доступ к этим портам.

Второй ответ Нормунда Калнберзиньша правильный. Вы хотите создать отдельную зону, привязать свою сеть / IP-адреса к этой зоне и открыть порты в этой зоне.

Кроме того, вы можете оставить все в зоне по умолчанию и использовать богатые правила firewalld, чтобы разрешить доступ с определенных IP:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'

Это разрешает весь трафик с 192.168.2.2 на все порты, и поскольку я не указал зону, она будет применена к зоне по умолчанию "public" (используйте --get-default-zone, чтобы проверить, какая у вас зона по умолчанию, и - get-active-zone, чтобы увидеть, какие зоны используются в данный момент).

Чтобы разрешить доступ с этого IP только к определенному порту, я бы сделал:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" port port="1234" protocol="tcp" accept'

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

devhen
источник
1

Просто чтобы добавить к Нормунду ответ:

$ sudo firewall-cmd --permanent --zone=work --add-source=172.16.0.0/12
$ sudo firewall-cmd --permanent --zone=work --add-port=8080-8090/tcp

Чтобы заблокировать весь другой трафик:

$ sudo firewall-cmd --set-default-zone=drop

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

Чтобы перезагрузить брандмауэр:

$ sudo firewall-cmd --reload

Я не мог понять, как добавить два разных IP-адреса с помощью --add-rich-rule.

SongLiAtDuke
источник
Для текущей конфигурации FirewallD по умолчанию этого может быть недостаточно. Смотрите мой комментарий к ответу Нормунда для деталей.
дес
для использования нескольких IP-адресов создайте ipset, ipsetподобный firewall-cmd --permanent --new-ipset=blacklist --type=hash:ipadd, с помощью которого firewall-cmd --ipset=blacklist --add-entry=192.168.1.4вы сможете использоватьfirewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
fyrye
0

Я удивлен, что ответы в доверенной зоне не являются выбранным ответом. В доверенной зоне по умолчанию "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

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

Что это делает с 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
Kirin
источник