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'

Дуже дякую за відповіді. Неможливо проголосувати через дефіцит репутації. Але як я можу скинути всі інші IP-адреси, крім того, який я додав за допомогою джерел?
— Крішнанду Саркар

Дякую @KrishnanduSarkar - ти правий, за замовчуванням це має бути відхилення ICMP. Але, я думаю, ви можете додати багате правило, щоб скинути пакети. Я додав приклад до своєї відповіді, що, думаю, спрацює. Дякуємо, що стосується оновленої заяви, я розумію, якщо відповідь спрацює, подумайте про прийняття відповіді.
— dougBTV

Чудова відповідь, я до цього часу використовував iptables.
— Тенсіг

(!) Ця відповідь не буде працювати, як очікувалося, для поточної конфігурації FirewallD за замовчуванням (інтерфейси призначені публічній зоні за замовчуванням).
— дес

25

Навіть якщо відповідь була прийнята і підкреслена, я не думаю, що вона є правильною. Я не можу знайти чітке пояснення в документації, але з реалізованої поведінки це виглядає так:

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

Тож відповідь буде:

  1. заблокуйте зону за замовчуванням, скажіть, "загальнодоступна" - жодних портів немає та послуг немає
  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висловлюваннях, щоб зробити поведінку дотримуватися.

У свою чергу, будь-які порти чи послуги, які ви перебуваєте у зоні "public" (за замовчуванням), застосовуватимуться до всіх інтерфейсів та адрес джерела.

$ 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

ви будете використовувати правила "робочої" зони для будь-яких запитів певного інтерфейсу - більш грубий селектор, ніж "джерело".


4
Це найкраща відповідь. Найважливішою частиною є пояснення того, що встановлення інтерфейсу розширює доступ (у разі встановлення джерел). У мене виникла проблема з тим, що порти були доступні, хоча я мав sourcesбілий список. Причиною було те, що для зони було призначено інтерфейс.
— pinkeen

1
Для точної корекції ця відповідь потребує видалення всіх служб за замовчуванням із publicзони, якщо такі є (ці сервіси будуть доступні для всіх адрес, оскільки інтерфейси призначені для publicзони за замовчуванням). Або змінити зону за замовчуванням на іншу: blockабо drop(це звичайна практика). Або змінити publicцільову зону на %%REJECT%%або DROP.
— дес

6

Відмова: Я насправді тут не пробував те, що я пропоную, але це досить близько до останньої установки, яку я здійснив, тому я відключаюсь від цього. Firewalld надає вам кілька попередньо налаштованих зон саме для цієї мети. Є одна під назвою "drop", яка викидає все, що надходить, і одна з назвою "trusted", яка дозволяє будь-яке з'єднання (тобто, я думаю, вам навіть не потрібно відкривати окремі порти, я думаю). Хитрість полягає в тому, щоб отримати правильну зону, щоб запустити те, що ви хочете.

Firewalld застосовуватиме правила для зони, виходячи з наступного пріоритету:

  • Якщо IP-код джерела відповідає IP-адресу джерела, прив'язаному до зони, він використовує це.
  • Якщо вихідний IP-код не відповідає будь-якій конкретній зоні, він перевіряє, чи є зона, налаштована для інтерфейсу, на який входив пакет. Якщо він є, він використовує це.
  • Нарешті, якщо нічого іншого не відповідає, він використовує зону за замовчуванням.

Отже, по-перше, ви хочете прив’язати довірених IP-адрес до зони довіри:

firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4

Потім або встановіть для своєї зони за замовчуванням «падіння» або прив’яжіть до неї свій інтерфейс:

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

а потім внесіть зміни в силу (попередження: це, ймовірно, перерве ваше з'єднання, якщо ви робите це через мережу, і ви не додали вихідний IP-адресу до надійної зони):

firewall-cmd --reload

Звичайно, ви можете також просто перевірити їх тимчасово, опустивши "- постійний" (і тоді вам також не доведеться - завантажувати).


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

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-zona, щоб побачити, які зони зараз використовуються).

Щоб дозволити доступ з цього IP лише до певного порту, я б зробив:

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

Найкраща практика - запускати ці команди без - постійної (або - короткої - короткої), що впливає на поточний брандмауер. Після тестування того, що ваше правило працює, запустіть його ще раз із доданим --perm, щоб воно запам'яталося при наступних перезавантаженнях firewalld.


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".


Для поточної конфігурації FirewallD за замовчуванням може бути недостатньо. Дивіться мій коментар до відповіді Нормундса для деталей.
— дес

для використання декількох IP-адрес створіть ipsetподібне firewall-cmd --permanent --new-ipset=blacklist --type=hash:ipдодавання ips до ipset, firewall-cmd --ipset=blacklist --add-entry=192.168.1.4тоді ви можете використовуватиfirewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
— fyrye

0

Я здивований, що відповіді довіреної зони - це не обрана відповідь. Довірена зона має за замовчуванням "ціль: 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

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