блокировать все, кроме нескольких ips с помощью firewalld

17

На сетевой машине с Linux я хотел бы ограничить набор адресов в «публичной» зоне (концепция firewalld), которым разрешено достигать ее. Таким образом, конечным результатом будет то, что никакая другая машина не сможет получить доступ к любому порту или протоколу, кроме явно разрешенных, что-то вроде

  --add-rich-rule='rule family="ipv4" source not  address="192.168.56.120" drop'

  --add-rich-rule='rule family="ipv4" source not  address="192.168.56.105" drop'

Проблема выше заключается в том, что это не настоящий список, он будет блокировать все, поскольку, если один его адрес заблокирован, поскольку он не совпадает с другим, генерируя случайный эффект «отбросить все», как бы я «разблокировал» определенный не непрерывный набор? источник принимает список адресов? я пока не вижу ничего в моем взгляде на документы или результаты Google.


РЕДАКТИРОВАТЬ: Я только что создал это:

# firewall-cmd  --zone=encrypt --list-all
encrypt (active)
  interfaces: eth1
  sources: 192.168.56.120
  services: ssh
  ports: 6000/tcp
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 

Но я все еще могу достигнуть порта 6000 .123 , потому что мое намерение состояло в том, что, если источник не указан, он не должен иметь доступ к какой-либо службе или порту.

Майк
источник

Ответы:

24

Богатые правила не нужны вообще.

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

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

Вместо этого попробуйте использовать другую зону, например «внутреннюю», для в основном доверенных IP-адресов для доступа к потенциально уязвимым службам, таким как sshd. (Вы также можете создавать свои собственные зоны.)

Предупреждение: не путайте специальную «доверенную» зону с нормальной «внутренней» зоной. Любые источники, добавленные в «доверенную» зону, будут пропущены через все порты; добавление сервисов в «доверенную» зону разрешено, но в этом нет никакого смысла.

firewall-cmd --zone=internal --add-service=ssh
firewall-cmd --zone=internal --add-source=192.168.56.105/32
firewall-cmd --zone=internal --add-source=192.168.56.120/32
firewall-cmd --zone=public --remove-service=ssh

Результатом этого будет «внутренняя» зона, которая разрешает доступ к ssh, но только с двух указанных IP-адресов. Чтобы сделать его постоянным, повторите каждую команду с --permanentдобавленной.

Майкл Хэмптон
источник
пожалуйста, уточните, что вы имеете в виду под «определением интерфейса, которое может присутствовать», я попробовал ваше предложение, см. мое редактирование.
май
@mike Как я уже сказал, вам нужно удалить eth1из зоны. firewall-cmd --zone=encrypt --remove-interface=eth1
Майкл Хэмптон
Ну, зона шифрования - это новая зона, до того как eth1 стала публичной, я переместил ее из общедоступной в зашифрованную, поэтому у шифрования есть источник .120, я думал, что только 120 должны быть в состоянии достичь порта, что я пропускаю?
май
1
Если вы поместите интерфейс в зону, то все , что поступает через интерфейс, может получить доступ к любым портам и службам, добавляемым в зону, независимо от IP-адреса. Так что это, вероятно, принадлежит общественности, где он был изначально.
Майкл Хэмптон
ах, значит, принятые источники будут по-прежнему разрешены, даже если интерфейс общедоступен, а источники приема размещены в другом доверенном источнике?
май
1

Согласно firewalld.richlanguage:

Источник источника [не] address = "address [/ mask]"

   With the source address the origin of a connection attempt can be limited to the source address. An address is either a single IP address, or a network IP address. The address has to match the rule family (IPv4/IPv6). Subnet mask is expressed in either
   dot-decimal (/x.x.x.x) or prefix (/x) notations for IPv4, and in prefix notation (/x) for IPv6 network addresses. It is possible to invert the sense of an address by adding not before address. All but the specified address will match then.

Укажите сетевую маску для адреса, чтобы разрешить смежные блоки.

Кроме этого, вы можете попробовать создать ipsetнесмежный список разрешенных IP-адресов.

Например, в /etc/firewalld/direct.xml:

<?xml version="1.0" encoding="utf-8"?>
<direct>
   <rule ipv="ipv4" table="filter" chain="INPUT" priority="0">-m set --match-set whitelist src -j ACCEPT</rule>
</direct>

Фактическое ipsetдолжно быть создано отдельно.

Дауд
источник
это отвергнет, что мне нужно, это обратное, принять, если в наборе,
Майк
0

Вы можете легко управлять с помощью 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'
Ранджит Ранджан
источник