ricsanfre.firewall
Ansible Rola: Zapora
Zainstaluj i skonfiguruj zaporę (opartą na nftables) w systemach Linux.
Wymagania
Brak.
Zmienne Roli
Dostępne zmienne są wymienione poniżej wraz z wartościami domyślnymi (patrz defaults/main.yaml
).
Włączanie NAT i przekazywania ruchu
- firewall_forward_enabled: Włącz lub wyłącz wsparcie dla przekazywania ruchu na danym hoście. [domyślnie:
false
]. - firewall_nat_enabled: Włącz lub wyłącz wsparcie dla NAT na danym hoście. [domyślnie:
false
].
Definiowanie domyślnych otwartych portów
- in_tcp_port: Ruch TCP wejściowy jest dozwolony na tych portach. [domyślnie:
{ ssh }
]. - in_udp_port: Ruch UDP wejściowy jest dozwolony na tych portach. [domyślnie:
{ snmp }
]. - out_tcp_port: Ruch TCP wychodzący jest dozwolony na tych portach. [domyślnie:
{ http, https, ssh }
]. - out_udp_port: Ruch UDP wychodzący jest dozwolony na tych portach. [domyślnie:
{ domain, bootps, ntp }
].
Słowniki reguł
Dla każdego łańcucha w tabeli ip (input, output, forward) i tabeli nat (nat-prerouting i nat-postrouting) reguły nft są przechowywane w słownikach, które można nadpisywać na poziomie grupy i hosta.
Zbiory zmiennych i reguł globalnych
Zestaw zmiennych i zestaw definicji używanych przez różne łańcuchy reguł i reguły globalne, które mogą być wywoływane z innego łańcucha za pomocą reguły jump global
.
definicja | zbiory | łańcuch globalny |
---|---|---|
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 |
Reguły tabeli IP
łańcuch wejściowy | łańcuch wychodzący | łańcuch przekazywania |
---|---|---|
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 |
Reguły tabeli NAT
łańcuch prerouting | łańcuch 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 |
Każdy typ słownika reguł będzie scalany, a reguły będą stosowane w alfabetycznej kolejności kluczy (dlatego używa się prefiksu od 000 do 999). Tak więc:
- nft_*_default_rules: Definiuje domyślne reguły dla wszystkich węzłów. Można je zdefiniować w
group_vars/all
. - nft_*_group_rules: Może dodać reguły i nadpisać te zdefiniowane przez nft_*_default_rules i nft_*_rules. Można je zdefiniować w
group_vars/group_servers
. - nft_*_host_rules: Może dodać reguły i nadpisać te zdefiniowane przez nft_*_default_rules, nft_*_group_rules oraz nft_*_rules. Można je zdefiniować w
host_vars/specific_host
.
Domyślna konfiguracja nftables
Domyślnie rola wygeneruje następujące pliki konfiguracyjne:
/etc/nftables.conf
#!/usr/sbin/nft -f
# Zarządzane przez Ansible
# czyszczenie
flush ruleset
include "/etc/nftables.d/defines.nft"
table inet filter {
chain global {
# 000 zarządzanie stanem
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
# broadcast i multicast
define badcast_addr = { 255.255.255.255, 224.0.0.1, 224.0.0.251 }
# broadcast i multicast
define ip6_badcast_addr = { ff02::16 }
# in_tcp_accept
define in_tcp_accept = { ssh }
# in_udp_accept
define in_udp_accept = { snmp }
# out_tcp_accept
define out_tcp_accept = { http, https, ssh }
# out_udp_accept
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 polityka
type filter hook input priority 0; policy drop;
# 005 globalnie
jump global
# 010 odrzuć niepożądane
ip daddr @blackhole counter drop
# 011 odrzuć niepożądane ipv6
ip6 daddr @ip6blackhole counter drop
# 015 localhost
iif lo accept
# 050 icmp
meta l4proto {icmp,icmpv6} accept
# 200 akceptacja wejściowego udp
udp dport @in_udp_accept ct state new accept
# 210 akceptacja wejściowego tcp
tcp dport @in_tcp_accept ct state new accept
}
/etc/nftables.d/filter-output.nft
chain output {
# 000 polityka
type filter hook output priority 0; policy drop;
# 005 globalnie
jump global
# 015 localhost
oif lo accept
# 050 icmp
ip protocol icmp accept
ip6 nexthdr icmpv6 counter accept
# 200 akceptacja wychodzącego udp
udp dport @out_udp_accept ct state new accept
# 210 akceptacja wychodzącego tcp
tcp dport @out_tcp_accept ct state new accept
# 250 reset-ssh
tcp sport ssh tcp flags { rst, psh | ack } counter accept
}
A powyższym zestawie reguł na hoście (wywołanym za pomocą komendy 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
}
}
Zależności
Brak.
Przykładowe Playbooki
Zastosowanie domyślnych reguł
Zainstaluj i skonfiguruj zaporę na hoście z domyślnymi regułami.
- hosts: serverx
roles:
- ricsanfre.firewall
w group_vars/all.yml
możesz nadpisać domyślne reguły dla wszystkich hostów:
nft_input_default_rules:
000 polityka:
- type filter hook input priority 0; policy drop;
005 globalnie:
- jump global
010 odrzuć niepożądane:
- ip daddr @blackhole counter drop
011 odrzuć niepożądane ipv6:
- ip6 daddr @ip6blackhole counter drop
015 localhost:
- iif lo accept
050 icmp:
- meta l4proto {icmp,icmpv6} accept
200 akceptacja wejściowego udp:
- udp dport @in_udp_accept ct state new accept
210 akceptacja wejściowego tcp:
- tcp dport @in_tcp_accept ct state new accept
Modyfikowanie domyślnych reguł na poziomie grupy
Otwieranie przychodzącego ruchu HTTP dla grupy webservers
:
W group_vars/webservers.yml
można to zrobić, modyfikując in_tcp_port
:
in_tcp_port: { ssh, http }
Lub dodając nową konkretną regułę
nft_input_group_rule:
220 akceptacja przychodzącego web:
- tcp dport http ct state new accept
Modyfikowanie domyślnych + reguł grupowych na poziomie hosta
Otwieranie przychodzącego ruchu HTTPS dla hosta secureweb
w host_vars/secureweb.yml
chciałbyś otworzyć https i usunąć dostęp do http:
nft_input_group_rule:
220 akceptacja przychodzącego web: []
230 akceptacja secure web:
- tcp dport https ct state new accept
Domyślne reguły można usunąć
Aby "usunąć" reguły, wystarczy przypisać pustą listę do istniejącego klucza słownika: Przykład: wyłączanie ruchu ICMP wejściowego
nft_input_host_rules:
050 icmp: []
Usuń domyślne reguły dotyczące zezwalania na cały ruch wychodzący. w konkretnym group_vars/group.yml
nft_output_group_rules:
000 polityka:
- type filter hook output priority 0;
005 globalnie:
-
015 localhost:
-
050 icmp:
-
200 akceptacja wychodzącego udp:
-
210 akceptacja wychodzącego tcp:
-
250 reset-ssh:
-
Zasada 000 polityka
jest nadpisywana, aby zaakceptować cały ruch, a pozostałe reguły są usuwane.
Podsumowując, reguły w nft_X_host_rules
nadpisują reguły w nft_X_group_rules
, a następnie reguły w nft_X_group_rules
nadpisują reguły w nft_X_default_rules
.
Licencja
MIT/BSD
Informacje o autorze
Ricardo Sanchez (ricsanfre)
Nftables-based firewall installation and configuration role
ansible-galaxy install ricsanfre.firewall