В версии CentOS 7 для управления iptables начали использовать firewalld, он в свою очередь управляется через команду firewall-cmd.
В отличии от iptables, firewalld оперирует зонами и сервисами, а не цепочками и правилами. Каждому сетевому интерфейсу присваивается определенная зона, она может быть как пользовательская так и предустановленная.
Список предустановленных зон:
- drop — уничтожает все входящие пакеты, исходящие разрешены
- block — уничтожает все входящие пакеты, при этом отправляя сообщение отправителю, что пакет был удален, исходящие разрешены
- public — разрешены входящие соединения только для ssh и dhcp-client
- external — поддерживает NAT для трансляции адресов внутренней сети
- internal — разрешены службы ssh, samba, mdns, dhcp
- dmz — разрешено только ssh подключение
- work — разрешены только ssh и dhcp
- home — то же самое что и internal
- trusted — все разрешено
Эти зоны служат для того, чтобы быстро сменить набор правил интерфейсы, изменив его зону.
Еще одной полезной особенностью firewalld является то, что есть конфигурация выполнения — runtime, и конфигурация постоянная — permanent.
Синтаксис команд
В отличии от iptables, тут довольно все просто
# firewall-cmd --[permanent] --zone=[zone_name] options
Если не указывать, что правило будет постоянное, то все изменения будут проводиться только в runtime, то есть действительны только до перезагрузки.
Следующие опции могут быть использованы для манипуляций с зонами:
- —state — вывести состояние брандмауэра;
- —reload — перезагрузить правила из постоянной конфигурации;
- —complete-reload — жёсткая перезагрузка правил с разрывом всех соединений;
- —runtime-to-permanent — перенести настройки конфигурации runtime в постоянную конфигурацию;
- —permanent — использовать постоянную конфигурацию;
- —get-default-zone — отобразить зону, используемую по умолчанию;
- —set-default-zone — установить зону по умолчанию;
- —get-active-zones — отобразить активные зоны;
- —get-zones — отобразить все доступные зоны;
- —get-services — вывести предопределенные сервисы;
- —list-all-zones — вывести конфигурацию всех зон;
- —new-zone — создать новую зону;
- —delete-zone — удалить зону;
- —list-all — вывести всё, что добавлено, из выбранной зоны;
- —list-services — вывести все сервисы, добавленные к зоне;
- —add-service — добавить сервис к зоне;
- —remove-service — удалить сервис из зоны;
- —list-ports — отобразить порты, добавленные к зоне;
- —add-port — добавить порт к зоне;
- —remove-port — удалить порт из зоны;
- —query-port — показать, добавлен ли порт к зоне;
- —list-protocols — вывести протоколы, добавленные к зоне;
- —add-protocol — добавить протокол к зоне;
- —remove-protocol — удалить протокол из зоны;
- —list-source-ports — вывести порты источника, добавленные к зоне;
- —add-source-port — добавить порт-источник к зоне;
- —remove-source-port — удалить порт-источник из зоны;
- —list-icmp-blocks — вывести список блокировок icmp;
- —add-icmp-block — добавить блокировку icmp;
- —add-icmp-block — удалить блокировку icmp;
- —add-forward-port — добавить порт для перенаправления в NAT;
- —remove-forward-port — удалить порт для перенаправления в NAT;
- —add-masquerade — включить NAT;
- —remove-masquerade — удалить NAT.
Пример использования
К примеру, мы хотим добавить к зоне какой-либо сервис:
# firewall-cmd --zone=public --add-service=http --permanent
А удалить можно так:
# firewall-cmd --zone=public --remove-service=http --permanent
Если мы используем ключ —permanent, то для того, чтобы правила начали работать, нужно использовать команду
# firewall-cmd --reload
которая перечитает правила в конфигурацию исполнения
Если необходимо открыть специфичный порт, то можно просто указать его командой:
# firewall-cmd --zone=public --add-port=8083/tcp --permanent
Проброс портов в Firewalld настраивается намного проще, чем в iptables. Если вам нужно, например, перенаправить трафик с порта 2223 на порт 22, достаточно добавить к зоне перенаправление:
# firewall-cmd --zone=public --add-forward-port=port=2223:proto=tcp:toport=22
Здесь перенаправление выполняется только на текущей машине. Если вы хотите настроить сеть NAT и пробрасывать порт на другую машину, то вам нужно сначала включить поддержку masquerade
# firewall-cmd --zone=public --add-masquerade
Затем уже можно добавить порт:
firewall-cmd --zone=publiс --add-forward-port=port=2223:proto=tcp:toport=22:toaddr=192.168.56.4
Расширенные правила
Если функциональности зон вам недостаточно, вы можете использовать расширенные правила. Общий синтаксис расширенных правил такой:
rule family="семейтво" source значение destination значение log audit действие
Вот значение основных параметров:
- В качестве семейства протоколов можно указать ipv4 или ipv6 или ничего не указывать, тогда правило будет применяться к обоим протоколам;
- source и destination — это отправитель и получатель пакета. В качестве этих параметров может быть использован IP-адрес (address), сервис (service name), порт (port), протокол (protocol) и так далее;
- log — позволяет логгировать прохождение пакетов, например в syslog. В этой настройке вы можете указать префикс строчки лога и уровень подробности логгирования;
- audit — это альтернативный способ логгирования, когда сообщения будут отправляться в службу auditd.
- действие — это действие, которое необходимо выполнить с совпавшим пакетом. Доступны: accept, drop, reject, mark.
Давайте рассмотрим несколько примеров. Нам необходимо заблокировать доступ к серверу для пользователя с IP 135.152.53.5:
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=135.152.53.5 reject'
Или нам нужно запретить для этого же пользователя только доступ к порту 22:
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=135.152.53.5 port port=22 protocol=tcp reject'
Посмотреть все расширенные правила можно командой:
# firewall-cmd --list-rich-rules