Centos 7 відкрити порт. Брандмауерні правила за промовчанням. Зміна зони інтерфейсу на постійній основі

На захист сервера від зовнішніх загрознасамперед постає між мережевий екран, який фільтрує вхідний та вихідний трафік. Налаштуванням iptables - окремого випадку фаєрвола на CentOS я хочу зайнятися в цій статті, а також розповісти про його встановлення та відключення. Моє керівництво не буде вичерпним, я розгляну лише ті аспекти, які вважаю найбільш важливими і використовую у своїй роботі.

Iptables в даний час є стандартом де-факто серед сучасних linux дистрибутивів. Я навіть відразу не можу пригадати, що ще застосовують як фаєрвол. Так що будь-якому адміністратору лінукс доводиться стикатися у своїй роботі з налаштуванням цього міжмережевого екрану.

До цього фаєрволу існують різні обв'язки, які використовуються для зручнішої настройки. У ubuntu є ufw, в centos firewalldз іншими не знайомий. Особисто я не бачу жодної зручності у використанні цих інструментів. Я звик налаштовувати лінуксовий фаєрвол по-старому, як навчився на самому початку роботи. Мені здається це найпростішим і найзручнішим способом, яким я з вами і поділюся. Суть його зводиться до того, що створюється скрипт із правилами фаєрволу. Цей скрипт можна легко редагувати під свої потреби та переносити з сервера на сервер.

Вимкнення firewalld

Питання відключення firewalld я вже стосувався теми . Насамперед відключимо firewalld, який присутній в centos 7 за замовчуванням відразу після встановлення:

# systemctl stop firewalld

Тепер видалимо його з автозавантаження, щоб він не ввімкнувся знову після рестарту:

# systemctl disable firewalld

Після цього на сервері налаштування мережного екрана стають повністю відкритими. Подивитися правила iptables можна командою:

Встановлення iptables

Насправді фаєрвол у нас на сервері вже стоїть і працює, просто немає жодних правил, все відкрито. Встановити нам потрібно буде додаткові утилітикерування, без яких конфігурувати iptables неможливо. Наприклад, не можна буде перезапустити фаєрвол:

# systemctl restart iptables.service Використовується для використання методу call: Unit iptables.service Завантажено: Не такий файл або directory.

Або додати в автозапуск не вийде:

# systemctl enable iptables.service Зазначений метод call: No such file or directory

Щоб подібних помилок не було, встановимо необхідний пакетз утилітами:

# yum -y install iptables-services

Тепер можна додати iptables в автозавантаження та запустити:

# systemctl enable iptables.service # systemctl start iptables.service

Налаштування фаєрволу

Для керування правилами фаєрволу я використовую скрипт. Створимо його:

# mcedit /etc/iptables.sh

Далі наповнюватимемо його необхідними правилами. Я розбиратиму всі значущі частини скрипту, а повністю його наведу у вигляді текстового файлунаприкінці статті. Правила зроблені у вигляді картинок, щоб заборонити копіювання та вставку. Це може призвести до помилок у роботі правил, із чим я сам зіткнувся під час підготовки статті.

Ми розглянемо ситуацію, коли сервер є шлюзом в інтернет для локальної мережі.

Насамперед поставимо всі змінні, які будемо використовувати в скрипті. Це не обов'язково робити, але рекомендується, тому що зручно переносити налаштування з сервера на сервер. Достатньо просто перепризначити змінні.

Перед застосуванням нових правил очищаємо всі ланцюжки:

Блокуємо весь трафік, який не відповідає жодному з правил:

Дозволяємо весь трафік локалхосту та локалки:

Дозволяємо робити ping:

Якщо вам це не потрібно, то не додавайте дозвільні правила для icmp.

Відкриваємо доступ до Інтернету самому серверу:

Якщо ви хочете відкрити всі вхідні з'єднання сервера, то додавайте далі правило:

Тепер додамо захист від найпоширеніших мережевих атак. Спочатку відкинемо всі пакети, які не мають жодного статусу:

Блокуємо нульові пакети:

Закриваємось від syn-flood атак:

Якщо ви не ставите обмежень на доступ з локальної мережі, дозволяємо всім вихід в інтернет:

Потім забороняємо доступ з Інтернету в локальну мережу:

Щоб наша локальна мережа користувалася інтернетом, вмикаємо nat:

Щоб не втратити доступ до сервера, після застосування правил дозволяємо підключення по ssh:

І насамкінець записуємо правила, щоб вони застосовувалися після перезавантаження:

Ми склали найпростіший конфіг, який блокує всі вхідні з'єднання, окрім ssh та дозволяє доступ з локальної мережі в інтернет. Принагідно захистилися від деяких мережевих атак.

Зберігаємо скрипт, робимо виконуваним та запускаємо:

# chmod 0740 /etc/iptables.sh # /etc/iptables.sh

Виконаємо перегляд правил та перевіримо, чи всі правила на місці:

# iptables -L -v -n

Звертаю вашу увагу - застосовувати правила потрібно лише в тому випадку, якщо у вас є доступ до консолі сервера. При помилці в налаштуваннях можна втратити доступ. Переконайтеся, що у нештатній ситуації ви зможете вимкнути фаєрвол та скоригувати налаштування.

Відкриття портів

Тепер трохи розширимо нашу конфігурацію та відкриємо у iptables портидля деяких послуг. Припустимо, у нас працює веб-сервер і необхідно відкрити доступ до нього з інтернету. Додаємо правила для веб-трафіку:

Було додано дозвіл на вхідні з'єднання по 80-му та 443-му портам, які використовує web серверу своїй роботі.

Якщо у вас встановлено поштовий сервер, то потрібно дозволити на нього вхідні з'єднання по всіх портах, що використовуються:

Для коректної роботи DNS сервера потрібно відкрити UDP порт 53

Прокидання (forward) порту

Розглянемо ситуацію, коли необхідно виконати прокидання портів із зовнішнього інтерфейсу на якийсь комп'ютер у локальній мережі. Допустимо, вам необхідно отримати rdp доступдо комп'ютера 10.1.3.50 з Інтернету. Робимо прокидання TCP порту 3389:

Якщо ви не хочете світити зовні відомим портом, то можна зробити перенаправлення з нестандартного порту на порт rdpкінцевого комп'ютера:

Якщо ви прокидаєте порт зовні всередину локальної мережі, обов'язково закоментуйте правило, яке блокує доступ із зовнішньої мережі у внутрішню. У моєму прикладі це правило: $IPT -A FORWARD -i $WAN -o $LAN1 -j REJECT

Або перед цим правилом створіть дозвільне правило для доступу зовні до внутрішнього сервісу, наприклад:

$IPT -A FORWARD -i $WAN -d 10.1.3.50 -p tcp -m tcp --dport 3389 -j ACCEPT

Увімкнення логів

Під час налаштування корисно увімкнути логи, щоб моніторити заблоковані пакети та з'ясовувати, чому відсутній доступ до необхідним сервісам, які ми начебто вже відкрили. Я відправляю всі заблоковані пакети в окремі ланцюжки (block_in, block_out, block_fw), що відповідають напряму трафіку та маркірують у логах кожен напрямок. Так зручніше робити розбір польотів. Додаємо наступні правилав кінець скрипта, перед збереженням налаштувань:

Усі заблоковані пакети можна відстежити у файлі /var/log/messages.

Після завершення налаштування закоментуйте ці рядки, відключивши логування. Обов'язково варто це зробити, оскільки логи дуже швидко розростаються. Практичного сенсу у зберіганні такої інформації особисто я не бачу.

Як вимкнути iptables

Якщо ви раптом вирішите, що firewall вам більше не потрібний, то відключити його можна так:

# systemctl stop iptables.service

Ця команда зупиняє фаєрвол. А наступна видаляє з автозавантаження:

# systemctl disable iptables.service

Відключивши мережевий екран, ми дозволили всі з'єднання.

Висновок

Як і обіцяв, викладаю готовий скрипт із основним набором правил, які ми розглянули

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

А уявляєте, якби це був би віддалений сервер? До мене так звернувся один знайомий, який попросив налаштувати Firewall на веб-сервері. Попередній адмін змусив його 2 рази приїжджати до розміщення машини та скидати налаштування неправильно налаштованого екрану, що зрештою і призвело до припинення співпраці. Це було давно, але нагода мені запам'яталася. Зараз практично всі хостинги пропонують платно чи безкоштовно віддалений KVM доступ. Краще подбати про це заздалегідь.

Відео

Онлайн курс "Адміністратор Linux"

Якщо у вас є бажання навчитися будувати та підтримувати високодоступні та надійні системи, рекомендую познайомитись з онлайн-курсом «Адміністратор Linux»в OTUS. Курс не для новачків, для вступу потрібні базові знанняпо мережах та встановлення Linuxна віртуалку. Навчання триває 5 місяців, після чого успішні випускники курсу зможуть пройти співбесіду у партнерів. Перевірте себе на вступному тесті і дивіться програму детальніше.

У цій статті буде описано, як налаштувати свіжу систему для безпечної роботи. Особливо актуально для тих, хто збирається хостити щось на своїй машині, або відкривати доступ до комп'ютера ззовні. Тож почнемо.

SELinux

SELinux- це реалізація системи примусового контролю доступу, яка може працювати паралельно із класичною виборчою системою контролю доступу. Дуже корисний інструмент для гнучкої та точного налаштуваннябезпеки. Багато хто вважає, що його потрібно одразу відключати і не використовувати взагалі. У цій статті ми не розглядатимемо його конфігурування. Тимчасово відключимо SELinux, матеріалу про його налаштування достатньо окремої статті.

Файл конфігурації знаходиться у /etc/sysconfig/selinux. Відкриваємо його текстовим редактором і правимо рядок:

#nano /etc/sysconfig/selinux SELINUX = Enforcing Disabled

Тим самим ви переведете режим роботи SELinux у «вимкнути». Для застосування налаштування необхідно перезавантажитись командою:

#systemctl reboot

Firewalld

Firewalldнадає функціональність динамічно керованого брандмауера за допомогою мережевих зон, покликаних визначити рівень довіри для мережного з'єднання або інтерфейсу. Він має підтримку налаштування міжмережевого екрану IPv4, IPv6 та мережевих мостів, а також розділяє середовище виконання та параметри конфігурації. Firewalld також має інтерфейс для додавання правил брандмауера безпосередньо зі служб та додатків.

За замовчуванням Firewalld увімкнено, а всі порти вважаються закритими. Якщо вам необхідно відкрити якийсь порт, скористайтесь командою:

#firewall-cmd --permanent --zone=public --add-port=80/tcp

У даному випадку 80 – номер порту, який необхідно відкрити (підставте потрібний). Порти будуть відкритими доти, доки ви їх самі не закриєте, або поки не відключіть Firewalld. Firewalld відключається командами:

#systemctl stop firewalld #systemctl disable firewalld

#firewall-cmd --permanent --zone=public --add-port=12345/tcp

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

#firewall-cmd --permanent --zone=public --remove-port=12345/tcp

Fail2ban

Fail2ban— це система захисту сервера від брутфорс-атак (атаки з перебором пароля). Принцип роботи полягає в тому, що якщо протягом певного часу було n невдалих спроб авторизації, то ip-адреса, з якої були спроби авторизації заноситься в бан-лист. Ця системапросто потрібна, т.к. без нього до вашого сервера можуть отримати доступ. Fail2ban слідкує за вказаними портами, наприклад SSH - 22 (стандартний, бажано змінити на свій). Fail2ban налаштовується через файл конфігурації. Нижче наведено інструкцію про встановлення та налаштування Fail2ban.

Спочатку необхідно підключити репозиторій EPEL, пакет Fail2ban знаходиться там. Робимо це командою:

#rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

#yum install fail2ban

Після встановлення виконуємо налаштування Fail2ban. Конфігураційний файл знаходиться тут. /etc/fail2ban/jail.conf, але, як сказано в коментарях на його початку, даний файлрекомендується не змінювати, натомість потрібно створити локальну копію /etc/fail2ban/jail.local. І надалі редагувати конфігурацію саме в ньому.

#cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local #nano /etc/fail2ban/jail.local

Конфігураційний файл містить безліч секцій, спочатку звернемо увагу на . У цій секції вказані параметри за замовчуванням, якщо Fail2ban налаштований для роботи різних сервісіві там не прописані правила для них, то параметри братимуться звідси. Наведу приклад налаштувань:

Ignoreip = 127.0.0.1/8 192.168.1.10/24 bantime = 900 findtime = 600 maxretry = 6

ignoreip- означає, які IP-адреси будуть ігноруватися при відстеженні. Вказуємо тут localhost, а також через прогалини ви можете вказати додаткові ip-адреси, наприклад адресу іншого комп'ютера в локальній мережі, за яким ви постійно працюєте. Можна також вказувати зовнішні IP-адреси, але, у такому разі, безпека знижується.

bantime- час, на який зазначена ip-адреса потрапить у бан-лист. Час вказується за секунди. Для постійного бана достатньо вказати будь-яке негативне число.

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

maxretry - максимальна кількістьневірних спроб авторизації за час findtime. При досягненні цього порогового значення ip-адреса буде занесена в бан-лист.

Далі спускаємося нижче та знаходимо розділ JAILS, у ньому описується, які послуги і порти необхідно моніторити, і що з ними робити у разі спрацьовування захисту. Також у кожній секції можна визначити свої параметри bantime, findtime, maxretry, а якщо вони не вказані, параметри беруться з секції . Шукаємо секції, що нас цікавлять, і редагуємо їх, ми налаштуємо стеження за сервісом SSH. Для цього переходимо до секції , дописуємо до неї рядок "enabled = true", і міняємо порт на призначений нами раніше:

Enabled = true port = 12345 action = iptables-multiport logpath = %(sshd_log)s

Запускаємо сервіс fail2ban і додаємо його в автозавантаження:

#systemctl start fail2ban #systemctl enable fail2ban

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

Серпень 15, 2014 12:57 пп 12 380 views | коментарів немає

Вперше заходячи на новий віртуальний виділений сервер, необхідно виконати кілька дій, які підвищать його безпеку. У цьому посібнику йдеться про те, як створити нового користувача, передати йому відповідні привілеї та налаштувати SSH.

1: Увійдіть як root-користувач

Отримавши свою IP-адресу та root-пароль, увійдіть на сервер як головний користувач (root). Для цього використовуйте команду (замініть виділену IP своєю IP-адресою):

ssh [email protected]

Термінал поверне щось на кшталт:

The authenticity of host "111.22.33.444 (111.22.33.444)" can't be established.
ECDSA key fingerprint is 79:95:46:1a:ab:37:11:8e:86:54:36:38:bb:3c:fa:c0.
Чи ви хочете, щоб виконати connecting (yes/no)?

Виберіть yes та введіть свій root-пароль.

Примітка: використовувати обліковий запис root на регулярній основі не рекомендується; цей посібник допоможе створити іншого користувача для постійної роботи.

2: Змініть пароль

на Наразівикористовується root-пароль, встановлений за умовчанням та отриманий після реєстрації сервера. Перше, що потрібно зробити, замінити його власним паролем.

Що стосується паролів, що встановлюються, система CentOS дуже обережна. Тому після введення нового пароля може з'явитись повідомлення BAD PASSWORD. Можна встановити більш складний пароль, або проігнорувати повідомлення: насправді, CentOS прийме навіть занадто простий або короткий пароль, хоч і запропонує використовувати складнішу комбінацію.

3: Створіть нового користувача

Увійшовши на сервер та змінивши root-пароль, потрібно знову увійти на VPS як root. Цей розділ продемонструє, як створити нового користувача та встановити пароль для нього.

Отже, створіть нового користувача; для цього використовуйте наступну команду (замініть demo своїм ім'ям користувача):

adduser demo

Тепер створіть пароль для цього користувача (знову ж таки, замініть demo ім'ям щойно створеного користувача):

passwd demo

4: Root-привілеї

На даний момент усі права адміністратора належать root-користувачу. Щоб мати можливість постійно використовувати новий обліковий запис, потрібно передати новому користувачеві всі root-привілеї.

Для виконання завдань з привілеями root потрібно розпочинати команду з sudo. Ця фраза корисна з двох причин: 1) вона захищає систему від помилок, що руйнують, допущених користувачем; 2) вона зберігає всі запущені з sudo командиу файлі /var/log/secure, який пізніше можна переглянути.

Тепер потрібно змінити налаштування sudo; для цього використовуйте текстовий редактор CentOS за замовчуванням називається vi:

Знайдіть розділ User privilege specification, який виглядає так:

# User privilege specification
root ALL = (ALL) ALL

Після рядка з привілеями root внесіть наступний рядок, яка передасть усі привілеї новому користувачеві (щоб розпочати введення тексту у vi, натисніть i):

demo ALL = (ALL) ALL

Щоб завершити введення тексту, натисніть Esc; потім введіть: wq, Enter, щоб зберегти і закрити файл.

5: Налаштуйте SSH (додатково)

Тепер потрібно убезпечити сервер. Цей додатковий розділРозкаже, як захистити сервер шляхом ускладнення процедури авторизації.

Відкрийте конфігураційний файл:

sudo vi /etc/ssh/sshd_config

Знайдіть наступні розділи та внесіть до них відповідні зміни:

Port 25000
PermitRootLogin no

Port: хоча за замовчуванням використовується порт 22, його номер можна замінити будь-яким іншим у діапазоні від 1025 до 65536. У цьому посібнику використовується SSHD-порт 25000. Зверніть увагу: новий номерпорту потрібно обов'язково запам'ятати/записати, оскільки він знадобиться для входу на сервер через SSH.

PermitRootLogin:змініть значення yes на no, щоб вимкнути вхід до системи як root. Тепер увійти на сервер можна лише за допомогою нового користувача.

Щоб SSH міг використовувати лише конкретний користувач, додайте цей рядок у нижній частині документа (замініть demo своїм ім'ям користувача):

AllowUsers demo

Потім збережіть зміни та закрийте файл.

ПерезапускSSH

Щоб активувати внесені зміни, перезапустіть SSHD:

sudo systemctl reload sshd.service

Щоб протестувати нові налаштування (поки не виходите з облікового запису root), відкрийте термінал і увійдіть на сервер як новий користувач (не забудьте вказати правильну IP-адресу та порт):

ssh -p 25000 demo @111.22.33.444

Повинне з'явитися повідомлення:

Ми покажемо вам покрокове налаштуваннябрандмауера Firewalld у CentOS 7

Що таке Firewalld? Це повноцінний брандмауер, який за умовчанням доступний у CentOS 7. Ми покажемо вам, як налаштувати його на сервері, а також розповімо про інструмент firewall-cmd.

1. Які базові поняття у брандмауера?

Зони

Firewalld здатний керувати групами правил у вигляді зон. Це набір інструкцій для керування трафіком на основі довіри до мереж. Зону можна присвоїти мережному інтерфейсу для керування поведінки брандмауера. Це буває необхідно, адже ноутбуки можуть часто підключатися до різним мережам. Комп'ютери можуть застосовувати зони для зміни набору правил, залежно від оточення. Наприклад, якщо підключатися до Wi-Fi у кафе, можна застосовувати суворіші інструкції. А вдома правила можуть бути лояльнішими.

У Firewalld виділяють такі зони:

Drop має найнижчий рівень довіри мережі. У такому випадку підтримуються виключно вихідні з'єднання, а вхідний трафікскидається без відповіді;

Block відрізняється від drop тим, що з скидання вхідного запиту видається повідомлення icmp-host-prohibited чи icmp6-adm-prohibited;

Зона public є публічною мережею, яка підтримує в індивідуальному порядку вхідні запити. Однак довіряти їй не можна;

External – це зона зовнішніх мереж, що підтримує маскування NAT для закритості внутрішньої мережі. Однак до неї можна отримати доступ;

Зворотною стороною external є internal. Комп'ютерам у цій зоні можна довіряти, тому доступними будуть додаткові послуги;

Зона dmz потрібна для ізольованих комп'ютерів, які не мають доступу до іншої частини мережі. У такому разі вдасться налаштувати обрані вхідні з'єднання;

Зона робочої мережі– це work. У ній можна довіряти оточенню, але вхідні з'єднання підтримуються в повному обсязі, лише визначених користувачем;

У зоні trusted можна довіряти всім комп'ютерам мережі.

Збереження правил

У Firewalld вони бувають тимчасовими та постійними. Буває так, що в наборі змінюється або з'являється правило, що впливає на поведінку брандмауера. Зміни будуть втрачені після перезавантаження, тому їх потрібно зберігати. Команди firewall-cmd використовують прапор -permanent для збереження правил. Після цього ними вийде користуватися на постійній основі.

2. Як увімкнути брандмауер Firewalld?

Почати варто із запуску в фоновому режиміпрограми-демона. Unit-файл systemd називається firewalld.service. для включення програми-демона потрібно в командному рядку набрати:

Sudo systemctl start firewalld.service

Нам потрібно переконатися, що сервіс запустився. Для цього знадобиться:

Firewall-cmd --state running

Брандмауер запустився та функціонує інструкції, заданої за умовчанням. Майте на увазі, що сервіс увімкнено, але автоматично запускатися разом із сервером не буде. Для цього потрібно налаштувати автозапуск. Крім того, зробіть набір правил, щоб не вдалося заблокувати себе на своєму ж сервері.

3. Брандмауерні правила за умовчанням

Як їх переглянути?

Для перегляду зони, яка використовується за замовчуванням, потрібно набрати:

Firewall-cmd --get-default-zone public

Ми бачимо, що Firewalld інструкцій щодо інших зон не отримував. Public використовується за умовчанням і єдиною активної зоною, т.к. жоден інтерфейс не прив'язувався до інших. Якщо хочете побачити список усіх доступних доменних зон, то вкажіть у консолі:

Firewall-cmd --get-active-zones public interfaces: eth0 eth1

Ми бачимо два прив'язані мережеві інтерфейси до зони public. Вони працюють за правилами, зазначеними для цієї зони. Побачити правила за умовчанням вийде шляхом:

Firewall-cmd --list-all public (default, active) interfaces: eth0 eth1 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:

Підсумуємо:

Зоною за замовчуванням та єдиною активною є public;

До цієї зони прив'язуються два інтерфейси: eth0 і eth1;

Public підтримує віддалене адміністрування SSH, а також надання IP-адрес DHSP.

Інші зони брандмауера

Подивимося, які є інші зони у брандмауера. Щоб побачити список усіх доступних, наберіть у консолі:

Можна також отримати параметри для кожної зони за допомогою додавання прапора -zone=:

Firewall-cmd --zone=home --list-all home interfaces: sources: services: dhcpv6-client ipp-client mdns samba-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:

Якщо потрібно вивести визначення всіх доступних зон, скористайтеся опцією -list-all-zones. Передаємо виведення в пейджер, щоб висновок було зручніше переглядати:

Firewall-cmd --list-all-zones | less

4. Як настроїти інтерфейсні зони?

До стандартної зони спочатку і прив'язуються всі мережеві інтерфейси.

Зміна зони інтерфейсу лише на одну сесію

Для цього нам знадобляться дві опції: —change-interface= і —zone=. Для переведення в зону home eth0 наберіть:

Sudo firewall-cmd --zone=home --change-interface=eth0 success

Майте на увазі, що це може вплинути на функціонування певних сервісів. Наприклад, SSH підтримується у зоні home, тобто. з'єднання скидатися не будуть. Однак це може статися в інших зонах, що призведе до блокування доступу до свого сервера. Нам потрібно переконатись, що інтерфейс прив'язався до нової зони. Наберіть у командному рядку:

Коли брандмауер буде перезавантажено, інтерфейс знову прив'яжеться до стандартної зони.

Sudo systemctl restart firewalld.service firewall-cmd --get-active-zones public interfaces: eth0 eth1

Зміна зони інтерфейсу на постійній основі

Після перезапуску брандмауера інтерфейс за новою прив'яжеться до зони за замовчуванням, якщо жодна інша зона не вставлена ​​в інтерфейсних налаштуваннях. Конфігурації CentOS знаходяться у файлах формату ifcfg-interface директорії /etc/sysconfig/network-scripts. Для визначення зони інтерфейсу необхідно відкрити файл конфігурації:

Sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0

Додамо змінну ZONE= у кінець файлу. Задамо іншу зону як значення:

DNS1=2001:4860:4860::8844 DNS2=2001:4860:4860::8888 DNS3=8.8.8.8 ZONE=home

Тепер збережемо зміни, після чого файл можна буде закрити. Для оновлення налаштувань потрібно буде перезапустити мережевий сервіс, а також брандмауер:

Sudo systemctl restart network.service sudo systemctl restart firewalld.service

Після цього до зони home буде прив'язаний інтерфейс eth0.

Firewall-cmd --get-active-zones home interfaces: eth0 public interfaces: eth1

Налаштування стандартних зон

Іншу зону за замовчуванням можна також задати. У цьому нам допоможе опція set-default-zone =, що прив'язує до іншої зони всі мережні інтерфейси.

Sudo firewall-cmd --set-default-zone=home home interfaces: eth0 eth1

5. Як зробити правила додатків?

Додавання до зони сервісу

Це найпростіше зробити в порт, який використовується брандмауером. Щоб побачити всі доступні сервіси, наберіть у командному рядку:

Firewall-cmd --get-services RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd wbt mysql nfs ntp openvpn pmcd pmproxi pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server

Пам'ятайте, що у файлах.xml директорії /usr/lib/firewalld/services зберігається вся інформація про кожний сервіс. Відомості про SSH можна знайти в /usr/lib/firewalld/services/ssh.xml. Виглядають вони так:

Для включення підтримки сервісів у зонах потрібен прапорець -add-service=, а ось опція -zone стане в нагоді для завдання цільової зони. Пам'ятайте, що такі зміни дійсні лише на одну сесію. Якщо потрібно зберегти зміни для подальшого використання, скористайтеся прапором -permanent. Подивимося, як це працює. Запустимо веб-сервер, щоб він міг обслуговувати HTTP-трафік. Включимо підтримку на одну сесію у зоні public. Наберіть у консолі:

Sudo firewall-cmd --zone=public --add-service=http

Не використовуйте опцію -zone=, якщо сервіс додаєте до зони за промовчанням. Перевіримо, чи все вийшло:

Firewall-cmd --zone=public --list-services dhcpv6-client http ssh

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

Sudo firewall-cmd --zone=public --permanent --add-service=http

Якщо потрібно побачити весь список правил, що діють на постійній основі, то:

Sudo firewall-cmd --zone=public --permanent --list-services dhcpv6-client http ssh

У результаті зони public з'явиться підтримка порту 80 і HTTP. У випадку, коли ваш сервер здатний обслуговувати SSL/TLS-трафік, вдасться додати HTTPS сервіс:

Sudo firewall-cmd --zone=public --add-service=https sudo firewall-cmd --zone=public --permanent --add-service=https

6. А якщо сервіс недоступний?

За замовчуванням брандмауер Firewalld включає багато популярних сервісів. Але буває так, що програмам потрібні інші послуги, яких немає в брандмауері. Цю проблемуможна вирішити парою способів.

Спосіб №1: Визначення сервісу

Додати порт у зону досить легко. Однак, якщо додатків досить багато, буде складно зрозуміти який порт використовує. В такій ситуації гарним виходомбуде визначення сервісів замість портів. Насправді сервіс - це група портів, яким дали назву та опис. З їхньою допомогою вийде простіше керувати налаштуваннями. Але сервіс дещо складніший за порт.

Почнемо з копіювання вже наявного сценарію з папки /usr/lib/firewalld/services, з якої брандмаузер бере нестандартні налаштування /etc/firewalld/services. Скопіюємо сервісне визначення SSH для застосування як визначення умовного сервісу example. Не забудьте, що ім'я сценарію має співпадати з назвою сервісу, а також мати розширення .xml. Наберіть у консолі:

Sudo cp /usr/lib/firewalld/services/service.xml /etc/firewalld/services/example.xml

Тепер потрібно внести редагування в скомпільований файл:

Sudo nano /etc/firewalld/services/example.xml

Усередині розташовується визначення SSH:

SSH Secure Shell (SSH) є протоколом для функціонування в режимі та виконання повідомлень на remote machines. Це забезпечує безпечні введені комунікації. Якщо ви плануєте за допомогою вашої машини remotely через SSH over firewalled interface, enable this option. Вам потрібний пакетний серверний пакет, налаштований для цього параметра для використання.

Тепер збережемо зміни та закриємо файл. Після цього буде потрібно перезапустити брандмауер за допомогою:

Sudo firewall-cmd --reload

У списку доступних сервісів з'явиться:

Firewall-cmd --get-services RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns example ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd -wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server

Спосіб №2: Створення порту

Відкриємо порт програми в потрібній брандмауерній зоні і вкажемо його, а також протокол. Уявімо ситуацію, що потрібно додати в зону public програму, що використовує протокол ТСР і порт 5000. Для активації на одну сесію підтримки програми буде потрібно опція -add-port=. Крім того, необхідно вказати протокол tcpабо udp:

Sudo firewall-cmd --zone=public --add-port=5000/tcp

Переконаємося, що все вийшло:

Firewall-cmd --list-ports 5000/tcp

Крім того, є можливість вказати діапазон портів за допомогою тире. Наприклад, якщо програма користується портами 4990-4999, то додати в public-зону вийде з допомогою:

Sudo firewall-cmd --zone=public --add-port=4990-4999/udp

Якщо все працює нормально, додайте інструкції до налаштувань брандмауера:

sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp sudo firewall-cmd -- zone=public --permanent --list-ports success success 4990-4999/udp 5000/tcp

7. Як створити зону?

Брандмауер здатний надати різні зумовлені зони, яких зазвичай для роботи вистачає, проте іноді потрібно зробити свою зону користувача. Наприклад, серверу DNSпотрібна зона privateDNS, а для веб-сервера - publicweb. Після створення зон її потрібно додати до налаштувань брандмауера. Створимо зони publicweb і privateDNS набравши в консолі:

Sudo firewall-cmd --permanent --new-zone=publicweb sudo firewall-cmd --permanent --new-zone=privateDNS

Перевіримо, чи все вийшло:

Sudo firewall-cmd --permanent --get-zones block dmz drop external home internal privateDNS public publicweb

Firewall-cmd --get-zones block dmz drop

Однак нові зони у поточній сесії будуть недоступні:

Firewall-cmd --get-zones block dmz drop

Перезапустимо брандмауер для отримання доступу до нових зон:

Sudo firewall-cmd --reload firewall-cmd --get-zones block dmz drop

Тепер вдасться новим зонам визначити порти та сервіси. Допустимо, є необхідність додати SSH, HTTP і HTTPS в зону publicweb:

sudo firewall-cmd --zone=publicweb --add-service=ssh sudo firewall-cmd --zone=publicweb --add-service=http sudo firewall-cmd --zone=publicweb --add-service=https firewall- cmd --zone=publicweb --list-all publicweb interfaces: sources: services: http https ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:

Крім того, вдасться додати DNS в зону privateDNS за допомогою:

Sudo firewall-cmd --zone=privateDNS --add-service=dns firewall-cmd --zone=privateDNS --list-all privateDNS interfaces: sources: services: dns ports: masquerade: no forward-ports: icmp-blocks: rich rules:

Після цього можна сміливо прив'язувати до нових зон мережеві інтерфейси:

sudo firewall-cmd --zone=publicweb --change-interface=eth0 sudo firewall-cmd --zone=privateDNS --change-interface=eth1

Перевірте налаштування. Якщо все гаразд, додайте їх у постійні правила:

sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh sudo firewall-cmd --zone=publicweb --permanent --add-service=http sudo firewall-cmd --zone=publicweb --permanent --add-service=https sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns

Тепер перейдемо до налаштування мережевих інтерфейсів. Це необхідно для того, щоб здійснювати автоматичне підключеннядо потрібній зоні. Припустимо, що потрібно прив'язати до publicweb eth0, то:

Sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0 . . . IPV6_AUTOCONF=no DNS1=2001:4860:4860::8844 DNS2=2001:4860:4860::8888 DNS3=8.8.8.8 ZONE=publicweb

Прив'яжемо також eht1 до privateDNS за допомогою:

Sudo nano /etc/sysconfig/network-scripts/ifcfg-eth1 . . . NETMASK=255.255.0.0 DEFROUTE="no" NM_CONTROLLED="yes" ZONE=privateDNS

Щоб зміни застосовувалися, потрібно перезапуск брандмауера та мережевих сервісів:

Sudo systemctl restart network sudo systemctl restart firewalld

Потрібно перевірити зони, щоб переконатися, що послуги прописалися:

Firewall-cmd --get-active-zones privateDNS interfaces: eth1 publicweb interfaces: eth0

Тепер потрібно перевірити, чи вони працюють:

Firewall-cmd --zone=publicweb --list-services http htpps ssh firewall-cmd --zone=privateDNS --list-services dns

Як ми можемо побачити, зони користувача повністю готові для роботи. Будь-яку з них можна призначити за умовчанням. Наприклад:

Sudo firewall-cmd --set-default-zone=publicweb

8. Як зробити автоматичний запуск брандмауера?

Після перевірки роботи правил та всіх налаштувань, налаштуємо автозапуск за допомогою:

Sudo systemctl enable firewalld

Це дозволить включати брандмауер відразу після запуску сервера.

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

Centos 7, на відміну від CentOS 6, базується з новим брандмауером - firewalld. Його можна відключити і замінити на старий добрий iptables, але якщо до цього немає прямих передумов, краще звикати до чогось нового, а не впиратися в старе. Це не означає, що Windows 10 краще Windows 7, а Windows XP краще Windows 7;) Гарний прикладна цю тему – selinux. Якщо спочатку майже всі (і я теж) його відключали і навіть трохи лаяли, то тепер майже ніхто це не радить тільки якщо є впевненість, що так треба. Навпаки, багато хто вже звикли (або звикають) користуватися semanage. Не будемо і ми відразу відключати firewalld, а спробуємо, як він смакує.

Firewalld - це не принципово інший брандмауер. Це інша надбудова над netfilter, тому якщо ви володієте досвідом роботи з iptables, то помучившись трохи, ви спокійно почнете користуватися новим інструментом.

Запуск та зупинка firewalld

Перевіримо, чи запущено firewalld:

# systemctl status firewalld

Тут буде розширена інформація. Щоб коротко, так (працює) чи ні можна так:

# firewall-cmd --state
running

Ок, працює.

Зупинка firewalld:

# systemctl stop firewalld

Заборона автостарту:

# systemctl disable firewalld

Запуск firewalld:

# systemctl start firewalld

Включення автостарту:

# systemctl enable firewalld

Зони firewalld

У firewalld широко використовується поняття зони. Список всіх допустимих зон за замовчуванням:

# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

Призначення зон (умовно, звісно):

  • drop – всі вхідні пакети відкидаються (drop) без відповіді. Дозволено лише вихідні з'єднання.
  • block - вхідні з'єднання відхиляються (rejected) з відповіддю icmp-host-prohibited (або icmp6-adm-prohibited). Дозволено лише ініційовані системою з'єднання.
  • public - зона за замовчуванням. З назви ясно, що ця зона націлена на роботу в громадських мережах. Ми не довіряємо цій мережі та дозволяємо лише певні вхідні з'єднання.
  • external – зона для зовнішнього інтерфейсу роутера (т.зв. маскарадінг). Дозволено лише визначені нами вхідні з'єднання.
  • dmz - зона DMZ, дозволені лише певні вхідні з'єднання.
  • work – зона робочої мережі. Ми все ще не довіряємо нікому, але вже не так сильно, як раніше:) Дозволено лише певні вхідні з'єднання.
  • home – домашня зона. Ми довіряємо оточенню, але дозволено лише певні вхідні з'єднання
  • internal – внутрішня зона. Ми довіряємо оточенню, але дозволено лише певні вхідні з'єднання
  • trusted – дозволено все.

Список усіх активних зон:

# firewall-cmd --get-active-zones
public
interfaces: enp1s0

Ага, зона public, до якої приєднано мережевий інтерфейс enp1so. Далі в зону public додамо новий порт, на якому висітиме sshd.

Знаючи ім'я інтерфейсу мережі (наприклад, enp1s0), можна дізнатися, до якої зони він належить:

# firewall-cmd --get-zone-of-interface=enp1s0
public

А можна дізнатися, які інтерфейси належать до конкретної зони:

# firewall-cmd --zone=public --list-interfaces
enp1s0

Приклад: дозволяємо ssh на нестандартному порту

Давайте дозволимо доступ до сервера по ssh на порті 2234/tcp, а не на 22/tcp, як за промовчанням. Принагідно трохи торкнемося selinux.

Спочатку подивимося, що взагалі дозволено постійно на нашому сервері:

# firewall-cmd --permanent --list-all
public (default)
interfaces:
sources:
services: ssh dhcpv6-client
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Я не використовую поки ipv6, тому відразу приберу соотв. правило з firewalld:

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

Дозволимо на постійній основі (щоб після перезавантаження не потерлося) з'єднання на порт 2234/tcp (на нього повісимо sshd):

# firewall-cmd --permanent --zone=public --add-port=2234/tcp

Перезавантажимо правила:

# firewall-cmd --reload

Перевіримо:

# firewall-cmd --zone=public --list-ports
2234/tcp

Ок, порт відкритий. Редагуємо конфіг sshd:

# nano /etc/ssh/sshd_config
...
port 2234
...

# systemctl restart sshd.service

Але SELinux, що ви, сподіваюся, не відключали, не дасть підключитися до ssh на нестандартному порту (порт 2234/tcp для sshd - нестандартний). Ви можете пропустити цей крок і перевірити, як спрацює захист SELinux, а можете відразу все налаштувати:

# yum provides semanage
# yum install policycoreutils-python
# semanage port -a -t ssh_port_t -p tcp 2234

Ось тепер все прибл. Перевіряємо підключення через ssh на новому порту. Якщо всі ок, закриваємо доступ до порту 22:

# firewall-cmd --permanent --zone=public --remove-service=ssh
# firewall-cmd --reload

Дивимося, що вийшло:

# firewall-cmd --list-all
public (default, active)
interfaces:
sources:
services:
ports: 2234/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

От і все.

Різні корисні команди:

Увімкнути режим блокування всіх вихідних та вхідних пакетів:

# firewall-cmd --panic-on

Вимкнути режим блокування всіх вихідних та вхідних пакетів:

# firewall-cmd --panic-off

Дізнатися, чи увімкнено режим блокування всіх вихідних та вхідних пакетів:

# firewall-cmd --query-panic

Перезавантажити правила firewalld без втрати поточних з'єднань:

# firewall-cmd --reload

Перезавантажити правила firewalld та скинути поточні з'єднання(рекомендується лише у разі проблем):

# firewall-cmd --complete-reload

Додати до зони мережевий інтерфейс:

# firewall-cmd --zone=public --add-interface=em1

Додати до зони мережевий інтерфейс (збережеться після перезавантаження firewall):

# firewall-cmd --zone=public --permanent --add-interface=em1

У конфізі ifcfg-enp1s0 можна вказати, якій зоні належить цей інтерфейс. Для цього додамо ZONE=work у файл /etc/sysconfig/network-scripts/ifcfg-enp1s0. Якщо параметр ZONE не вказано, буде призначено зону за промовчанням (параметр DefaultZone у файлі /etc/firewalld/firewalld.conf).

Дозволити діапазон портів:

# firewall-cmd --zone=public --add-port=5059-5061/udp

Маскарад (masquerade, він же nat, він же...):

Перевірити статус:

# firewall-cmd --zone=external --query-masquerade

Увімкнути:

# firewall-cmd --zone=external --add-masquerade

Тут треба зазначити, що ви можете включити маскерад і для зони public, наприклад.

Перенаправити вхідні на 22 порт на інший хост:

# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toaddr=192.168.1.23

Перенаправити вхідні на 22 порт на інший хост зі зміною порту призначення (з 22 на 192.168.1.23:2055):

# firewall-cmd --zone=external /
--add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.168.1.23

У цьому закінчу, т.к. прикладів може бути дуже багато. Додам тільки, що особисто я остаточно не склав свою думку з приводу нововведення firewalld, т.к. до синтаксису звикаєш довго і якщо у вашому зоопарку зустрічаються різні OS Linux, то насамперед можуть бути проблеми саме зі звичкою. Але освоївши firewalld, ви розширите кругозір - найчастіше це варто витрачених зусиль.

Не хочу firewalld! Поверніть мені старі iptables!

Якщо все ж таки ви хочете повернути минуле і замінити firewalld на iptables, то зробити це зовсім не важко:

Початківцям тут не місце:

# systemctl disable firewalld
# systemctl stop firewalld

Ставимо старий добрий iptables:

# yum install iptables-services

Запускаємо брандмауер:

# systemctl start iptables
# systemctl start ip6tables

Автозапуск при включенні:

# systemctl enable iptables
# systemctl enable ip6tables

Для збереження правил iptablesпісля перезавантаження:

# /sbin/iptables-save > /etc/sysconfig/iptables
# /sbin/ip6tables-save > /etc/sysconfig/ip6tables

Або по-старому:

# service iptables save

Поточні правила знаходяться у файлах:
/etc/sysconfig/iptables
/etc/sysconfig/ip6tables

Перезапуск iptables (наприклад, після здійснення будь-яких змін):

# systemctl restart iptables.service