Задача
Изучить основные концепции firewalld и способы взаимодействия с ним с помощью утилиты firewall-cmd
Требования
Полномочия root
Введение
Начиная с версии 7 Rhel и CentOS и версии 18 Fedora, firewalld является системой брандмауэра по умолчанию.
Одной из его отличительных черт является его модульность: он работает над концепцией зон – zones
В этом уроке мы узнаем больше об этом и о том, как с ним работать, используя утилиту firewall-cmd.
Брандмауэр на основе зон
Firewalld – это брандмауэр на основе зоны: каждая зона может быть настроена так, чтобы принимать или отклонять некоторые службы или порты и, следовательно, с другим уровнем безопасности.
Зоны могут быть связаны с одним или несколькими сетевыми интерфейсами.
Обычно firewalld поставляется с набором предварительно сконфигурированных зон: чтобы перечислять эти зоны и, в общем, взаимодействовать с брандмауэром, мы будем использовать утилиту firewall-cmd.
Я работаю в системе Fedora 27, давайте посмотрим, какие существуют доступные зоны:
$ firewall-cmd --get-zones FedoraServer FedoraWorkstation block dmz drop external home internal public trusted work
Как вы можете увидеть, приведенная выше команда возвращает список всех доступных интерфейсов в моей системе.
Их имя вполне объясняет их назначение, но нам нужно знать, какие услуги и порты доступны через них: общее правило по умолчанию заключается в том, что все службы или порт запрещены.
Затем каждый интерфейс настраивается с некоторыми исключениями, в зависимости от служб, которые должны быть разрешены.
Если мы хотим получить список всех сервисов, связанных с зоной, мы можем запустить firewall-cmd с параметром –get-services.
Если зона не передана явно в команду, будет запрошена зона по умолчанию:
# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens5f5 sources: services: ssh mdns dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Команда вернула сводку состояния зоны (в данном случае по умолчанию «public»).
Среди прочего вы можете четко видеть, какие сетевые интерфейсы связаны с этой зоной (в данном случае – ens5f5) и какие услуги разрешены (ssh, mdns, dhcpv6-client).
Если мы хотим получить информацию о конкретной, не по умолчанию зоне, мы должны передать имя зоны в качестве аргумента опции -zone.
Например, чтобы получить информацию о external мы будем запустим:
# firewall-cmd --zone=external --list-all external target: default icmp-block-inversion: no interfaces: sources: services: ssh ports: protocols: masquerade: yes forward-ports: source-ports: icmp-blocks: rich rules:
Настройки зон
Как говорилось ранее, при использовании инструмента firewall-cmd, если зона не указана, ссылаются на зону по умолчанию.
Возможно, мы захотим изменить зону по умолчанию.
Скажем, например, мы хотим установить внешнюю зону external как значение по умолчанию:
# firewall-cmd --set-default=external
Легко ли говорить, не так ли? Теперь давайте посмотрим, как мы можем добавлять или удалять службы или порты в определенной зоне.
Прежде всего, сервисы представляют собой предварительно сконфигурированный набор портов, связанных с конкретным протоколом.
Например: служба ssh будет включать в себя TCP-порт 22, тогда как служба samba будет понимать набор портов 139 и 445 TCP и 137 и 138 UDP.
Используя сервисы, мы можем избежать необходимости запоминать определенные порты каждый раз.
Предположим, что мы хотим добавить службу samba во внешнюю зону, все, что нам надо сделать, это:
# firwall-cmd --zone=external --add-service=samba success
Демон Firewalld ответил успешно, это означает, что добавление службы выполнено.
Чтобы проверить это, давайте проверим сервисы зоны:
$ sudo firewall-cmd --zone=external --list-services ssh samba
Как вы можете видеть, мы использовали опцию -list-services для этой задачи.
Результат команды явно означает, что служба samba была добавлена в зону. Тем не менее, модификации, сделанные таким образом, являются временными и не выдержат перезагрузки firewalld-демона. Давайте проверим это.
Сначала мы перезагружаем службу:
# firewall-cmd --reload
Затем мы снова проверяем сервисы, разрешенные во внешней зоне external:
# firewall-cmd --zone=external --list-services ssh
Как вы можете увидеть, единственной службой, разрешенной во внешней зоне, является ssh.
Чтобы сделать постоянную модификацию зоны, мы должны использовать опцию -perantent:
# firewall-cmd --permanent --zone=external --add-service=samba
Для внесения изменений в постоянные изменения потребуется перезагрузка брандмауэра.
Если мы хотим сделать обратную операцию дабы удалить сервис из зоны, мы выполним:
# firewall-cmd --permanent --zone=external --remove-service=samba
Синтаксис очень интуитивно понятен и не нуждается в дальнейших объяснениях.
Но что, если мы хотим добавить определенный порт вместо службы? Синтаксис слегка изменится:
# firewall-cmd --permanent --zone=external --add-port=139/tcp
Чтобы убедиться, что порт добавлен в зону:
# firewall-cmd --zone=external --list-ports 139/tcp
Операция прошла успешно.
Точно так же, чтобы удалить порт:
# firewall-cmd --permanent --zone=external --remove-port=139/tcp
Создание пользовательской зоны
До сих пор мы посмотрели, как изменять существующие зоны.
Также можно создать несколько новых, и это так же просто.
Предположим, мы хотим создать пользовательскую зону под названием linuxconfig:
# firewall-cmd --permanent --new-zone=linuxconfig
Создана новая пустая зона: по умолчанию в ней не разрешены службы или порты.
Также можно создать зону, загрузив файл конфигурации:
# firewall-cmd --permanent --new-zone-from-file=file --name=linuxconfig
Где file – это путь к файлу, содержащему определение зоны.
Обратите внимание, что при создании или удалении зоны параметр -permanent является обязательным: ошибка будет отображена, если он не указан.
Свяжите зону с интерфейсом
Создание зоны – это только первый шаг: теперь мы должны связать ее с сетевым интерфейсом.
Предположим, мы хотим использовать нашу новую созданную зону, связывая ее с интерфейсом ethernet через ens5f5: вот команда, которая позволяет нам выполнить задачу:
# firewall-cmd --permanent --zone=linuxconfig --add-interface=ens5f5
если мы запрашиваем зону на назначенные ей интерфейсы, мы должны увидеть:
# firewall-cmd --zone=linuxconfig --list-interfaces ens5f5
Удаление интерфейса из зоны так же просто:
# firewall-cmd --remove-interface=ens5f5 --zone=linuxconfig
Углубленные правила | Rich rules
В определенных ситуациях нам может потребоваться создать более сложное правило, а не просто разрешить некоторые порты или службы в зоне.
Например, мы можем создать правило для блокировки трафика определенного типа с определенного компьютера.
Для этого нужны – Rich rules.
Правило в основном состоит из двух частей: в первом мы указываем условия, которые должны выполняться для применяемого правила, а во втором – действие, которое должно выполняться: принимать, сбрасывать или отклонять – accept
, drop
, ,reject
.
Предположим, мы хотим заблокировать трафик с компьютера с ip 192.168.0.37 в локальной сети: вот как мы будем составлять наше правило:
# firewall-cmd --zone=linuxconfig --add-rich-rule="rule \ family="ipv4" \ source address=192.168.0.37 \ service name=ssh \ reject \
Чтобы добавить правило, мы использовали опцию -add-rich-rule, описывающую правило в качестве аргумента.
Правило начинается с ключевого слова правила. В family мы указали, что правило применяется только к ipv4-пакетам: если это ключевое слово не указано, правило применяется как к ipv4, так и к ipv6.
Затем мы предоставили исходный адрес, который получает пакеты для запуска правила с адресом источника.
С помощью service мы указали тип сервиса для правила, в данном случае ssh.
Наконец, мы предоставили действие, которое должно быть выполнено, если пакет соответствует правилу, в этом случае reject.
Если мы попытаемся установить соединение ssh с машиной с 192.168.0.37 ip, мы получим:
ssh 192.168.0.35 ssh: connect to host 192.168.0.35 port 22: Connection refused
Вы можете посмотреть документацию по firewalld, чтобы увидеть весь диапазон доступных параметров и опций.
panic mode
Panice mode- это режим, который следует использовать только в ситуациях, когда есть серьезные проблемы с сетевой средой.
Когда этот режим активен, все существующие соединения отбрасываются, и все входящие и исходящие пакеты удаляются.
Он может быть включен таким образом:
# firewall-cmd --panic-on
Чтобы выйти из этого режима:
# firewall-cmd --panic-off
Можно даже запросить его статус, выполнив:
# firewall-cmd --query-panic