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 = вывод команды = success firewall-cmd --reload = вывод команды = success
Правила для портов
Добавление необходимого порта в зону public
firewall-cmd --permanent --zone=public --add-port=25555/tcp = вывод команды = success firewall-cmd --reload = вывод команды = success
Добавление диапазона портов в зоне public
firewall-cmd --permanent --zone=public --add-port=49000-55000/tcp = вывод команды = success firewall-cmd --reload = вывод команды = success
Удаление ненужного сервиса с зоны public
firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client = вывод команды = success firewall-cmd --reload = вывод команды = success
Настройка сетевых интерфейсов в 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 firewall-cmd --reload
Можно пробросить входящие на 22 порт с изменением порта назначения (с 22 на 20155):
firewall-cmd --permanent --zone=external --add-forward-port=port=22:proto=tcp:toport=20155:toaddr=10.10.0.10 firewall-cmd --reload
Посмотрим что в итоге получилось с настройками
### 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:
Результат
При понимании устройства и принципа работы нового брандмауэра произвести базовые настройки не вызывает сложности. Можно настраивать и более тонко использую все возможности новой системы, но это отдельная тема.