Мое мнение при выборе брандмауэра для 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.