FirewallD появился в CentOS 7 и на первый взгляд может вам показаться неудобным. Рассмотрим основные моменты работы с сервисом который удовлетворит большинство потребностей стандартного сервера. Тонкая настройка возможна при доскональном изучении руководства.

Вступление

С появлением FirewallD многие советуют отключать его и пользоваться старым проверенным механизмом iptables. Мне обычно надо открывать доступ по определенным службам или портам, делать шлюз для выхода в интернет и пробрасывать необходимые порты или службы внутрь локальной сети. Все эти настройки делаются просто, если понять суть и логику работы о которой я и расскажу.

Установка и команды работы сервиса FirewallD

Проверка наличия

systemctl status firewalld
= вывод команды =
Unit firewalld.service could not be found.

Установка

Установим FirewallD вез вопросов

yum -y install firewalld

Добавление в автозагрузку и запуск

systemctl enable firewalld
systemctl start firewalld

Проверка работы

systemctl status firewalld
 ● firewalld.service - firewalld - dynamic firewall daemon
 Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
 Active: active (running) since Чт 2017-04-13 20:22:40 MSK; 14s ago
 Docs: man:firewalld(1)
 Main PID: 2099 (firewalld)
 CGroup: /system.slice/firewalld.service
 └─2099 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

апр 13 20:22:39 fd.sevo44.loc systemd[1]: Starting firewalld - dynamic firewall daemon...
 апр 13 20:22:40 fd.sevo44.loc systemd[1]: Started firewalld - dynamic firewall daemon.

Или короткой командой

firewall-cmd --state
= вывод команды =
running

Опция —permanent для FirewallD

Особое внимание хочу сразу обратить на параметр —permanent который указывается в командах. Команды введенные в консоли без этого флага будут работать только в период данной сессии. После перезагрузки службы или компьютера все настройки вернутся в начальное состояние. Не забывайте этот важный момент! На практике это очень удобно использовать, когда надо дать временный доступ или настраиваете и хотите проверить как будут работать настройки. Если что то пошло не так достаточно перезагрузить сервер и все вернется в исходное состояние.

Применение изменений FirewallD

После каждого введенного нового правила необходимо их применить чтобы они стали работать

firewall-cmd --reload
= вывод команды =
success

Вывод «success» после любой команды показывает что все хорошо и команда выполнена успешно.

Что такое Зоны в FirewallD

Просмотр списка всех имеющихся зон

firewall-cmd --get-zones
= вывод команды =
work drop internal external trusted home dmz public block

Каждая зона имеет свои установки по умолчанию и имеет определенный набор правил. Вы можете использовать их и настраивать имеющиеся зоны или создать свои с необходимыми настройками.

Добавление своей зоны

firewall-cmd --permanent --new-zone=custom_zone

Важно понять то что каждый сетевой интерфейс может быть привязан только к одной зоне. К любой зоне можно привязать хоть все интерфейсы. Зоной по умолчанию считается public и именно туда и попадут все подключенные сетевые интерфейсы.

Изменение зоны по умолчанию

firewall-cmd ---permanent --set-default-zone=home

После этого все новые подключенные сетевые интерфейсы попадут в эту зону.

Примеры настройки FirewallD

Рассмотрим все основные моменты настройки. Первое что нам надо это вывести и посмотреть настройки всех зон.

Просмотр всех зон

firewall-cmd --list-all-zones
= вывод части команды =
work
 target: default
 icmp-block-inversion: no
 interfaces: 
 sources: 
 services: dhcpv6-client ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules: 

internal
 target: default
 icmp-block-inversion: no
 interfaces: 
 sources: 
 services: dhcpv6-client mdns samba-client ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules: 

external
 target: default
 icmp-block-inversion: no
 interfaces: 
 sources: 
 services: ssh
 ports: 
 protocols: 
 masquerade: yes
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules: 

home
 target: default
 icmp-block-inversion: no
 interfaces: 
 sources: 
 services: dhcpv6-client mdns samba-client ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules: 

public (active)
 target: default
 icmp-block-inversion: no
 interfaces: enp0s3 enp0s8
 sources: 
 services: dhcpv6-client ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules:

Из вывода мы видим настройки каждой зоны. Полный вывод не всегда удобен и поэтому лучше вывести список активных зон.

Вывод активных зон

firewall-cmd --get-active-zones
= вывод команды =
public
 interfaces: enp0s3 enp0s8

Видим что есть два сетевых интерфейса которые работают согласно правилам зоны public.

Информация о конкретной зоне

firewall-cmd --list-all --zone=public
public (active)
 target: default
 icmp-block-inversion: no
 interfaces: enp0s3 enp0s8
 sources: 
 services: dhcpv6-client ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules:

В выводе мы видим по каким правилам работает активная зона.

Создание правил для зоны FirewallD

Правила можно создавать как для сервисов так и для необходимых портов и их диапазонов.

Правила для сервисов

Выведем все доступные сервисы командой

firewall-cmd --get-services
= вывод команды =
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

В случае если необходимо понять какие порты работают в сервисе можно это посмотреть в файле (на примере ssh)

cat /usr/lib/firewalld/services/ssh.xml
= вывод команды =
<?xml version="1.0" encoding="utf-8"?>
<service>
 <short>SSH</short>
 <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
 <port protocol="tcp" port="22"/>
</service>

Из вывода видно что сервис SSH работает на 22 порту. Все сервисы вы можете посмотреть в папке /usr/lib/firewalld/services/ и при необходимости по аналогии можно добавить любой свой сервис указав все необходимые параметры. Можно изменить порт по которому будет работать ssh в файле или добавить нужный порт в необходимую зону, все зависит от ваших пожеланий.

Добавление разрешение для службы http в зоне public

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

Правила для портов

Добавление необходимого порта в зону public

firewall-cmd --permanent --zone=public --add-port=25555/tcp

Добавление диапазона портов в зоне public

firewall-cmd --permanent --zone=public --add-port=49000-55000/tcp

Удаление ненужного сервиса с зоны public

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

Настройка сетевых интерфейсов в FirewallD

Для начала нам надо понять где сидят сетевые интерфейсы

ip addr
= вывод команды =
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
 valid_lft forever preferred_lft forever
 inet6 ::1/128 scope host 
 valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether 08:00:27:05:ba:20 brd ff:ff:ff:ff:ff:ff
 inet 192.168.0.172/24 brd 192.168.0.255 scope global dynamic enp0s3
 valid_lft 31948sec preferred_lft 31948sec
 inet6 fe80::37:68ea:f655:3c2c/64 scope link 
 valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether 08:00:27:a8:9d:bf brd ff:ff:ff:ff:ff:ff
 inet 10.10.0.1/24 brd 10.10.0.255 scope global enp0s8
 valid_lft forever preferred_lft forever
 inet6 fe80::a00:27ff:fea8:9dbf/64 scope link 
 valid_lft forever preferred_lft forever

Из вывода видно что enp0s3 работает с внешней сетью а enp0s8 с внутренней.

Отнесем внешнюю сеть в зону external а внутреннюю в зону internal.

Существует два способа назначения интерфейса в зону:

  • Удалить из текущей зоны и добавить в новую;
  • Сразу назначить в нужную зону.

Удаление и добавление

= внешняя сеть =
firewall-cmd --permanent --zone=public --remove-interface=enp0s3
firewall-cmd --permanent --zone=external --add-interface=enp0s3
= внутренняя сеть =
firewall-cmd --permanent --zone=public --remove-interface=enp0s8
firewall-cmd --permanent --zone=internal --add-interface=enp0s8

Назначение в нужную зону

firewall-cmd --permanent --zone=external --change-interface=enp0s3
firewall-cmd --permanent --zone=internal --change-interface=enp0s8

Настройка интернет шлюза

Для того чтобы у нас внутренняя сеть имела доступ в интернет нам необходимо на зоне работающей во внешней сети настроить маскарад (masquerade).

Проверим состояние masquerade на внешнем интерфейсе

firewall-cmd --zone=external --query-masquerade
= вывод команды =
yes

Как видим все работает. В случае необходимости мы можем назначить этот параметр для любой другой зоны

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

Настройка шлюза закончена и теперь компьютеры внутренней сети могут ходить в интернет.

Проброс порта на внутреннюю сеть

В случае необходимости мы можем сделать доступ с внешней сети до компьютера внутренней сети способом проброса необходимого порта.

Пробросим порт на котором работает SSH до компьютера внутренней сети с адресом 10.10.0.10

firewall-cmd --permanent --zone=external --add-forward-port=port=22:proto=tcp:toaddr=10.10.0.10

Можно пробросить входящие на 22 порт с изменением порта назначения (с 22 на 20155):

firewall-cmd --permanent --zone=external --add-forward-port=port=22:proto=tcp:toport=20155:toaddr=10.10.0.10

Посмотрим что в итоге получилось с настройками

###
firewall-cmd --get-active-zones
= посмотрим активные зоны =
internal
 interfaces: enp0s8
external
 interfaces: enp0s3
###
firewall-cmd --list-all --zone=internal
= посмотрим внутреннюю зону =
internal (active)
 target: default
 icmp-block-inversion: no
 interfaces: enp0s8
 sources: 
 services: mdns samba-client ssh http https
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules: 
###
firewall-cmd --list-all --zone=external
= посмотрим внешнюю зону =
external (active)
 target: default
 icmp-block-inversion: no
 interfaces: enp0s3
 sources: 
 services: ssh
 ports: 
 protocols: 
 masquerade: yes
 forward-ports: port=22:proto=tcp:toport=:toaddr=10.10.0.10
 sourceports: 
 icmp-blocks: 
 rich rules:

Результат

При понимании устройства и принципа работы нового брандмауэра произвести базовые настройки не вызывает сложности. Можно настраивать и более тонко использую все возможности новой системы, но это отдельная тема.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Хотите сказать денежное спасибо? Подарите денежку!