Мое мнение при выборе брандмауэра для Ubuntu систем:

  • Iptables – это для тех кто более глубоко разбирается в защите, им важен полный контроль над всеми действиями каждого соединения. Порог вхождения сложен, но после вы получаете более глубокие знания, и Вы не зависите от системы Linux на которой делается защита
  • Ufw – настройка над iptables. Конфигурирование не вызывает проблем если делается на одном конкретном сервере, к примеру блоге на WordPress, Asterisk, Fog Project, Samba и т.д. Но если нужно сделать с помощью ufw защиту шлюза, то Вас ожидает неправдоподобность официальной инструкции, разнородностью информации в интернете в качестве справки если Вы будете прибегать к ним. Море убитого времени и не понимания почему оно не работает. Кстати, хорошо дружит с защитником сервисов – я имею ввиду Fail2ban.
  • firewalld – тоже надстройка над iptables, но позволяющая делать чуть более чем ufw в плане, защита сервисов, настройка системы в качестве шлюза и т.д. Как и второе настройка правил через синтаксис объектов, Вы не оперируете голыми правилами iptables. А это важно.

Об последнем инструменте firewalld я сейчас и узнаю, сформировав пошаговую заметку по его внедрению на Ubuntu 18.04 Server.

Достоинства, которые выделил я для себя:

  • Принцип работы firewalld основан над управлением зонами.
  • За работу firewalld отвечает демон и правила применяется без его перезапуска, т.к. он работает динамически.
ekzorchik@srv-bionic:~$ apt-cache search firewalld

firewall-applet - panel applet providing status information of firewalld

firewall-config - graphical configuration tool to change the firewall settings

firewalld - dynamically managed firewall with support for network zones

Шаг №1: Устанавливаю firewalld в систему Ubuntu 18.04 Server:

ekzorchik@srv-bionic:~$ sudo apt-cache show firewalld | grep Version

Version: 0.4.4.6-1

ekzorchik@srv-bionic:~$ sudo apt-get install -y firewalld

Т.к. по умолчанию он выставляется, как не запущен, включаю его и запускаю:

ekzorchik@srv-bionic:~$ sudo systemctl enable firewalld

Synchronizing state of firewalld.service with SysV service script with /lib/systemd/systemd-sysv-install.

Executing: /lib/systemd/systemd-sysv-install enable firewalld

ekzorchik@srv-bionic:~$ sudo systemctl start firewalld

Проверяю текущий статус работы:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --state

running -> работает.

Т.к. в один момент времени может/желательно чтобы работала только одна надстройка над iptables, то следует выключить ufw:

ekzorchik@srv-bionic:~$ sudo apt-get remove --purge ufw

ekzorchik@srv-bionic:~$ sudo find / -name ufw

/etc/ufw

ekzorchik@srv-bionic:~$ sudo rm -Rf /etc/ufw

или можно проще, просто его деактивировать:

ekzorchik@srv-bionic:~$ sudo ufw disable

Шаг №2: Отобразить текущую политику работы установленного firewalld:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --list-all

public

target: default

icmp-block-inversion: no

interfaces:

sources:

services: ssh dhcpv6-client

ports:

protocols:

masquerade: no

forward-ports:

source-ports:

icmp-blocks:

rich rules:

ekzorchik@srv-bionic:~$

из вывода видно, что дефолтная зона работы именуется public, сервисы на защите ssh & dhcp6-client

Шаг №3: Отобразить список всех сервисов которые могут быть поставлены на защиту:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --get-service

RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client и т.д.

Шаг №4: Допустим Вам нужно включить в правило брандмауэера возможность удаленного взаимодействия с текущей системой, только для доступа через https, к примеру у Вас здесь блог, а значит нужно правило разрешающее 443/tcp:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-service=https --permanent

success

именование сервиса я получил из Шаг №3.

Параметр “--permanent” обозначает что следует применять данное правила после перезагрузки, т.е. делает его постоянным. Я так себе это вижу.

Шаг №5: А если нужно включить несколько правил, можно конечно указать их каждая отдельной командой или же объединить все в одну:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-service={https,http} --permanent

Warning: ALREADY_ENABLED: https

success

ekzorchik@srv-bionic:~$

из вывода видно, что одно из добавляемых правил уже есть, а другого нет и оно добавилось.

Шаг №6: А если Вы не хотите довольствоваться шаблонами правил, а добавляете свое, точно зная какой порт и тип соединения, то можно так чтобы контролировать:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-port=2049/tcp --permanent

success

ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-port=2049/udp --permanent

success

Шаг №7: Можно создать новую зону и уже в нее добавлять Ваши правила:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --new-zone=blog --permanent

success

ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=blog --add-port=8081/tcp --permanent

success

ekzorchik@srv-bionic:~$

Шаг №8: Отобразить какие зоны есть сейчас по дефолту:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --get-zones

block dmz drop external home internal public trusted work

Описание предустановленных зон:

  • drop - Все входящие сетевые пакеты сбрасываются, ответ на них недопустим. Возможны только исходящие сетевые соединения.
  • block - Все входящие сетевые соединения отклоняются с сообщениями icmp-host-prohibited (для IPv4) и icmp6-adm-prohibited (для IPv6). Возможны только инициированные в рамках данной системы сетевые соединения.
  • public - Предназначено для использования в общественных местах. Остальные компьютеры сети считаются ненадёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения.
  • external - Предназначено для использования во "внешних" сетях с активированным режимом маскарадинга, особенно с применением роутеров. Остальные компьютеры сети считаются ненадёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения.
  • internal - Предназначено для использования во "внутренних" сетях. Остальные компьютеры сети, по большей части, считаются надёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения.
  • dmz - Предназначено для компьютеров в личной "безоружной" зоне с ограниченным общественным доступом к внутренней сети. Разрешены лишь отдельные входящие соединения.
  • work - Предназначено для использования в рабочем пространстве. Остальные компьютеры сети, по большей части, считаются надёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения.
  • home - Предназначено для использования в домашних сетях. Остальные компьютеры сети, по большей части, считаются надёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения.
  • trusted - Разрешены все сетевые соединения.

А зона – это уровень доверия для сетевых соединений.

Шаг №9: В зону можно предопределить интерфейс:

ekzorchik@srv-bionic:~$ ip r | awk '{print $5}' | head -n1

ens18

ekzorchik@srv-bionic:~$ sudo firewall-cmd --get-zone-of-interface=ens18 --permanent

no zone -> текущий интерфейс не значится не в одной зоне

ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=public --add-interface=ens18 --permanent

success

ekzorchik@srv-bionic:~$

Шаг №10: Правило разрешающее взаимодействие с сервисом этой системы из сети 172.35.35.0/24

ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-rich-rule 'rule family="ipv4" service name="ssh" source address="172.35.35.0/24" accept' --permanent

success

Шаг №11: Отобразить список правил:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --list-rich-rules

Шаг №12: Если нужны правила определяющие доступ на эту систему по одному а после переход на другую, т.е. организовываем Port Forwarding – к примеру эта система шлюз:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-masquerade --permanent

При подключении на 22 порт перенаправление на 2222:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-forward-port=port=22:proto=tcp:toport=2222 --permanent

При подключении на 22 порт перенаправление на IP:порт:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-forward-port=port=22:proto=tcp:proto=tcp:toport=22:toaddr=172.33.33.25 --permanent

Шаг №13: Чтобы удалить порт или сервис, здесь все просто заменяем если при добавлении пишем --add, то наоборот --remove.

Шаг №14: И самое важно, чтобы применить правило(а):

ekzorchik@srv-bionic:~$ sudo firewall-cmd --reload

см. какие порты открыты в зоне public:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=public --list-ports

2049/tcp 2049/udp

См. какие действия порты/сервисы/поведение предопределены Вам в текущей зоне:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=public --list-all

public (active)

target: default

icmp-block-inversion: no

interfaces: ens18

sources:

services: ssh dhcpv6-client https http

ports: 2049/tcp 2049/udp

protocols:

masquerade: yes

forward-ports: port=22:proto=tcp:toport=2222:toaddr=

port=22:proto=tcp:toport=22:toaddr=172.33.33.25

source-ports:

icmp-blocks:

rich rules:

rule family="ipv4" source address="172.35.35.0/24" service name="ssh" accept

ekzorchik@srv-bionic:~$

Что здесь такого интересного? Зона Public активна, в нее включен единственный интерфейс системы Ubuntu 18.04 Server ens18, файервол на сервисы и на указанные порты, включен Masquerade (т.е. система выступает шлюзом, возможно), доступ к системе возможен по SSH из сети 172.35.35.0/24

Шаг №15: Чтобы возможностями firewalld заблокировать определенный IPадрес:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="172.35.35.4" reject'

success

ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=public --list-all

public (active)

target: default

icmp-block-inversion: no

interfaces: ens18

sources:

services: ssh dhcpv6-client https http

ports: 2049/tcp 2049/udp

protocols:

masquerade: yes

forward-ports: port=22:proto=tcp:toport=2222:toaddr=

port=22:proto=tcp:toport=22:toaddr=172.33.33.25

source-ports:

icmp-blocks:

rich rules:

rule family="ipv4" source address="172.35.35.0/24" service name="ssh" accept

rule family="ipv4" source address="172.35.35.4" reject

ekzorchik@srv-bionic:~$

Вот такие вот расширенные правила делаются через Rich rules и позволяют описывать действия: accept (принимать), drop (сбрасывать), reject (отклонять).

Шаг №16: Узнать что же firewall-cmd думает о предопределенных службах, нужно открыть файл xml:

ekzorchik@srv-bionic:~$ cat /usr/lib/firewalld/services/https.xml

<?xml version="1.0" encoding="utf-8"?>

<service>

<short>Secure WWW (HTTPS)</short>

<description>HTTPS is a modified HTTP used to serve Web pages when security is important. Examples are sites that require logins like stores or web mail. This option is not required for viewing pages locally or developing Web pages. You need the httpd package installed for this option to be useful.</description>

<port protocol="tcp" port="443"/>

</service>

ekzorchik@srv-bionic:~$

ekzorchik@srv-bionic:~$ cat /usr/lib/firewalld/services/nfs.xml

<?xml version="1.0" encoding="utf-8"?>

<service>

<short>NFS4</short>

<description>The NFS4 protocol is used to share files via TCP networking. You will need to have the NFS tools installed and properly configure your NFS server for this option to be useful.</description>

<port protocol="tcp" port="2049"/>

</service>

ekzorchik@srv-bionic:~$

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

ekzorchik@srv-bionic:~$ sudo cp /usr/lib/firewalld/services/ssh.xml /usr/lib/firewalld/services/oracle.xml

Далее изменяем в собственном файле собственного сервиса:

ekzorchik@srv-bionic:~$ cat /usr/lib/firewalld/services/oracle.xml

<?xml version="1.0" encoding="utf-8"?>

<service>

<short>oracle</short>

<description>oracle</description>

<port protocol="tcp" port="22223"/>

<port protocol=”udp” port=”22224”/>

</service>

ekzorchik@srv-bionic:~$ sudo firewall-cmd --reload

Шаг №17: Если Вы тестируете правила, то добавлять ключ--permanentне нужно, опуская его вы разрешите только в рамках текущего сеанса:

ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=public --add-port=21/tcp

ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=public --add-service=nrpe

ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=public --list-port

2049/tcp 2049/udp 21/tcp

ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=public --list-service

ssh dhcpv6-client https http nrpe

ekzorchik@srv-bionic:~$

Шаг №18: Т.к. firewall-cmd это надстройка над iptables, то можно отобразить все правила и посмотреть, как они были созданы:

ekzorchik@srv-bionic:~$ iptables -S

iptables v1.6.1: can't initialize iptables table `filter': Permission denied (you must be root)

Perhaps iptables or your kernel needs to be upgraded.

ekzorchik@srv-bionic:~$ sudo iptables -S

в выводе будет видно, что созданы цепочки (ключ -N) и для данные цепочки правил помещены в типы доступа: INPUT, FORWARD, ACCEPT.

Вот из всего выше разобранного самолично я составил мнение что пора с ufw перейти на данную надстройку, т.к. функционал расширенный и легко настраивается. Пока у меня на этом всё, с уважением автор блога Олло Александр aka ekzorchik.