заблокувати всі, крім кількох 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 поки що.


EDIT: Я щойно створив це:

# 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:

Джерело джерела [not] 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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.