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.