firewall
Ansible Роль: Брандмауэр
Установите и настройте брандмауэр (на основе nftables) на Linux.
Требования
Нет.
Переменные роли
Доступные переменные перечислены ниже с их значениями по умолчанию (см. defaults\main.yaml
)
Включение NAT и пересылки трафика
- firewall_forward_enabled: Включить или отключить поддержку пересылки трафика на данном хосте. [по умолчанию:
false
]. - firewall_nat_enabled: Включить или отключить поддержку NAT на данном хосте. [по умолчанию:
false
].
Определение портов по умолчанию
- in_tcp_port: Разрешен входящий TCP-трафик на этих портах. [по умолчанию:
{ ssh }
]. - in_udp_port: Разрешен входящий UDP-трафик на этих портах. [по умолчанию:
{ snmp }
]. - out_tcp_port: Разрешен выходящий TCP-трафик на этих портах. [по умолчанию:
{ http, https, ssh }
]. - out_udp_port: Разрешен выходящий UDP-трафик на этих портах. [по умолчанию:
{ domain, bootps , ntp }
].
Словари правил
Для каждой цепочки в таблице IP (входящие, исходящие, пересылка) и таблице NAT (nat-prerouting и nat-postrouting) правила nft хранятся в словарях, которые могут быть переопределены на уровне группы и хоста.
Переменные и определения наборов и глобальные правила
Набор переменных и наборы определений, используемые различными цепочками правил и глобальными правилами цепочек, которые могут быть вызваны из других цепочек с использованием правила jump global
.
Определение | Наборы | Глобальная цепочка |
---|---|---|
nft_define_default | nft_set_default | nft_global_default |
nft_define_group | nft_set_group | nft_global_group_rules |
nft_define_host | nft_set_host | nft_global_host_rules |
Правила таблицы IP
Входящая цепочка | Исходящая цепочка | Цепочка пересылки |
---|---|---|
nft_input_default_rules | nft_output_default_rules | nft_forward_default_rules |
nft_input_group_rules | nft_output_group_rules | nft_forward_group_rules |
nft_input_host_rules | nft_output_host_rules | nft_forward_host_rules |
Правила таблицы NAT
Цепочка prerouting | Цепочка postrouting |
---|---|
nft_nat_default_prerouting_rules | nft_nat_default_postrouting_rules |
nft_nat_group_prerouting_rules | nft_nat_group_postrouting_rules |
nft_nat_host_prerouting_rules | nft_nat_host_postrouting_rules |
Каждый тип словарей правил будет объединен, и правила будут применяться в алфавитном порядке по ключам (поэтому используется префикс от 000 до 999). Итак:
- nft_*_default_rules: Определяет правила по умолчанию для всех узлов. Вы можете определить их в
group_vars/all
. - nft_*_group_rules: Можно добавлять правила и переопределять те, которые определены в nft_*_default_rules и nft_*_rules. Вы можете определить их в
group_vars/group_servers
. - nft_*_host_rules: Можно добавлять правила и переопределять те, которые определены в nft_*_default_rules, nft_*_group_rules и nft_*_rules. Вы можете определить их в
host_vars/specific_host
.
Конфигурация nftables по умолчанию
По умолчанию роль будет генерировать следующие конфигурационные файлы:
/etc/nftables.conf
#!/usr/sbin/nft -f
# Управляемый Ansible
# очистка
flush ruleset
include "/etc/nftables.d/defines.nft"
table inet filter {
chain global {
# 000 управление состоянием
ct state established,related accept
ct state invalid drop
}
include "/etc/nftables.d/sets.nft"
include "/etc/nftables.d/filter-input.nft"
include "/etc/nftables.d/filter-output.nft"
}
/etc/nftables.d/defines.nft
# широковещательные и многоадресные
define badcast_addr = { 255.255.255.255, 224.0.0.1, 224.0.0.251 }
# широковещательные и многоадресные
define ip6_badcast_addr = { ff02::16 }
# входящий_tcp_разрешить
define in_tcp_accept = { ssh }
# входящий_udp_разрешить
define in_udp_accept = { snmp }
# исходящий_tcp_разрешить
define out_tcp_accept = { http, https, ssh }
# исходящий_udp_разрешить
define out_udp_accept = { domain, bootps , ntp }
/etc/nftables.d/sets.nft
set blackhole {
type ipv4_addr;
elements = $badcast_addr
}
set in_tcp_accept {
type inet_service; flags interval;
elements = $in_tcp_accept
}
set in_udp_accept {
type inet_service; flags interval;
elements = $in_udp_accept
}
set ip6blackhole {
type ipv6_addr;
elements = $ip6_badcast_addr
}
set out_tcp_accept {
type inet_service; flags interval;
elements = $out_tcp_accept
}
set out_udp_accept {
type inet_service; flags interval;
elements = $out_udp_accept
}
/etc/nftables.d/filter-input.nft
chain input {
# 000 политика
type filter hook input priority 0; policy drop;
# 005 глобальная
jump global
# 010 отклонение нежелательного
ip daddr @blackhole counter drop
# 011 отклонение нежелательного ipv6
ip6 daddr @ip6blackhole counter drop
# 015 localhost
iif lo accept
# 050 icmp
meta l4proto {icmp,icmpv6} accept
# 200 входящий udp разрешен
udp dport @in_udp_accept ct state new accept
# 210 входящий tcp разрешен
tcp dport @in_tcp_accept ct state new accept
}
/etc/nftables.d/filter-output.nft
chain output {
# 000 политика
type filter hook output priority 0; policy drop;
# 005 глобальная
jump global
# 015 localhost
oif lo accept
# 050 icmp
ip protocol icmp accept
ip6 nexthdr icmpv6 counter accept
# 200 исходящий udp разрешен
udp dport @out_udp_accept ct state new accept
# 210 исходящий tcp разрешен
tcp dport @out_tcp_accept ct state new accept
# 250 сброс сделать ssh
tcp sport ssh tcp flags { rst, psh | ack } counter accept
}
И следующий набор правил на хосте (показан при выполнении команды nft list ruleset
):
table inet filter {
set blackhole {
type ipv4_addr
elements = { 224.0.0.1, 224.0.0.251,
255.255.255.255 }
}
set in_tcp_accept {
type inet_service
flags interval
elements = { 22 }
}
set in_udp_accept {
type inet_service
flags interval
elements = { 161 }
}
set ip6blackhole {
type ipv6_addr
elements = { ff02::16 }
}
set out_tcp_accept {
type inet_service
flags interval
elements = { 22, 80, 443 }
}
set out_udp_accept {
type inet_service
flags interval
elements = { 53, 67, 123 }
}
chain global {
ct state established,related accept
ct state invalid drop
}
chain input {
type filter hook input priority filter; policy drop;
jump global
ip daddr @blackhole counter packets 0 bytes 0 drop
ip6 daddr @ip6blackhole counter packets 0 bytes 0 drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
udp dport @in_udp_accept ct state new accept
tcp dport @in_tcp_accept ct state new accept
}
chain output {
type filter hook output priority filter; policy drop;
jump global
oif "lo" accept
ip protocol icmp accept
ip6 nexthdr ipv6-icmp counter packets 0 bytes 0 accept
udp dport @out_udp_accept ct state new accept
tcp dport @out_tcp_accept ct state new accept
tcp sport 22 tcp flags { rst, psh | ack } counter packets 0 bytes 0 accept
}
}
Зависимости
Нет.
Примеры плейбуков
Применить правила по умолчанию
Установить и настроить брандмауэр на хосте с правилами по умолчанию.
- hosts: serverx
roles:
- ricsanfre.firewall
В group_vars/all.yml
вы можете переопределить правила по умолчанию для всех ваших хостов:
nft_input_default_rules:
000 политика:
- type filter hook input priority 0; policy drop;
005 глобальная:
- jump global
010 отклонение нежелательного:
- ip daddr @blackhole counter drop
011 отклонение нежелательного ipv6:
- ip6 daddr @ip6blackhole counter drop
015 localhost:
- iif lo accept
050 icmp:
- meta l4proto {icmp,icmpv6} accept
200 входящий udp разрешен:
- udp dport @in_udp_accept ct state new accept
210 входящий tcp разрешен:
- tcp dport @in_tcp_accept ct state new accept
Изменение правил по умолчанию на уровне группы
Открываем входящий HTTP-трафик для группы webservers
:
В group_vars/webservers.yml
это можно сделать, изменив in_tcp_port
:
in_tcp_port: { ssh, http }
Или добавив новое конкретное правило:
nft_input_group_rule:
220 входящий веб разрешен:
- tcp dport http ct state new accept
Изменение правил по умолчанию + групповых правил на уровне хоста
Открываем входящий HTTPS-трафик для хоста secureweb
:
В host_vars/secureweb.yml
вы хотите открыть https и убрать доступ к http:
nft_input_group_rule:
220 входящий веб разрешен: []
230 входящий безопасный веб разрешен:
- tcp dport https ct state new accept
Правила по умолчанию могут быть удалены
Чтобы "удалить" правила, просто присвойте пустой список существующему ключу словаря: Пример: отключить входящий ICMP-трафик.
nft_input_host_rules:
050 icmp: []
Удалите правила по умолчанию, позволяющие весь исходящий трафик, в конкретном group_vars/group.yml
:
nft_output_group_rules:
000 политика:
- type filter hook output priority 0;
005 глобальная:
-
015 localhost:
-
050 icmp:
-
200 исходящий udp разрешен:
-
210 исходящий tcp разрешен:
-
250 сброс сделать ssh:
-
000 политика
правило по умолчанию переопределяется, чтобы принимать весь трафик, и остальные правила удаляются.
В заключение, правила в nft_X_host_rules
будут перезаписывать правила в nft_X_group_rules
, а затем правила в nft_X_group_rules
будут перезаписывать правила в nft_X_default_rules
.
Лицензия
MIT/BSD
Информация об авторе
Рикардо Санчес (ricsanfre)
ansible-galaxy install ricsanfre/ansible-role-firewall