Ahojte!
Snažím se na archlinuxu rozhýbat firewall
Vytvořím tabulku s názvem filter
# nft add table filter
Strčím do ní chain na filtrování příchozích paketů
# nft add chain filter input { type filter hook input priority 0 \; }
Přidám do chainu pár nějakých pravidel
# nft add rule filter input iifname lo accept
# nft add rule filter input tcp dport 443 accept
# nft add rule filter input tcp dport 53 counter reject with tcp reset
# nft add rule filter input udp dport 53 counter drop
# nft list ruleset
table ip filter {
chain input {
type filter hook input priority 0; policy accept;
tcp dport https accept
tcp dport domain counter packets 0 bytes 0 reject with tcp reset
udp dport domain counter packets 0 bytes 0 drop
}
}
Až po sem to projde a chová se to podle očekávání.
Teď bych chtěl přidat pravidla co povolí už navázaná spojení
# nft add rule filter input ct state established accept
<cmdline>:1:1-50: Error: Could not process rule: No such file or directory
add rule filter input ct state established accept
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# nft add rule filter input ct state related accept
<cmdline>:1:1-46: Error: Could not process rule: No such file or directory
add rule filter input ct state related accept
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Nebo bych chtěl přidat další tabulku ve které se nebude rozlišovat jestli se jedná o ipv4 nebo o ipv6
# nft add table inet table2
<cmdline>:1:1-22: Error: Could not process rule: Address family not supported by protocol
add table inet table2
^^^^^^^^^^^^^^^^^^^^^^
Na wiki archu se píše že když nft hází podobný errory tak asi chybí jaderný moduly
# lsmod | grep '^nf'
nfnetlink_queue 24576 0
nfnetlink_log 20480 0
nft_reject_ipv4 16384 1
nf_reject_ipv4 16384 1 nft_reject_ipv4
nft_reject 16384 1 nft_reject_ipv4
nft_counter 16384 3
nft_meta 16384 2
nf_tables_ipv4 16384 3
nf_tables 77824 32 nft_reject,nft_reject_ipv4,nf_tables_ipv4,nft_meta,nft_counter
nfnetlink 16384 3 nfnetlink_log,nfnetlink_queue,nf_tables
Modul nf_tables se tváří že je aktivni a v pořádku, lsmod ho vidí.
jenže
# modinfo nf_tables
modinfo: ERROR: Module alias nf_tables not found.
Co to je "module alias"? Tady už se začínám ztrácet.
# find /usr/lib/modules/ -name nft*
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/bridge/netfilter/nft_reject_bridge.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/bridge/netfilter/nft_meta_bridge.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_set_rbtree.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_numgen.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_fib.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_hash.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_set_hash.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_reject.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_fwd_netdev.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_objref.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_meta.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_limit.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_compat.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_ct.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_exthdr.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_nat.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_dup_netdev.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_queue.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_masq.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_log.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_reject_inet.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_redir.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_quota.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_counter.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_rt.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_fib_inet.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv4/netfilter/nft_masq_ipv4.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv4/netfilter/nft_redir_ipv4.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv4/netfilter/nft_fib_ipv4.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv4/netfilter/nft_reject_ipv4.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv4/netfilter/nft_chain_nat_ipv4.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv4/netfilter/nft_chain_route_ipv4.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv4/netfilter/nft_dup_ipv4.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv6/netfilter/nft_redir_ipv6.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv6/netfilter/nft_dup_ipv6.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv6/netfilter/nft_chain_nat_ipv6.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv6/netfilter/nft_reject_ipv6.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv6/netfilter/nft_chain_route_ipv6.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv6/netfilter/nft_fib_ipv6.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/net/ipv6/netfilter/nft_masq_ipv6.ko.gz
/usr/lib/modules/4.10.8-1-ARCH/kernel/drivers/mtd/nftl.ko.gz
# modinfo /usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_ct.ko.gz
filename: /usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_ct.ko.gz
alias: nft-expr-notrack
alias: nft-expr-ct
author: Patrick McHardy <kaber@trash.net>
license: GPL
depends: nf_tables,nf_conntrack
intree: Y
vermagic: 4.10.8-1-ARCH SMP preempt mod_unload modversions
Nějaké moduly by tu byly, zkusím je teda ručně natáhnout
# insmod nft_ct
insmod: ERROR: could not load module nft_ct: No such file or directory
# insmod /usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_ct.ko.gz
insmod: ERROR: could not insert module /usr/lib/modules/4.10.8-1-ARCH/kernel/net/netfilter/nft_ct.ko.gz: Unknown symbol in module
Tady jsem se zaseknul. Nerozumím tomu proč nftables fungujou jenom tak nějak napůl. Podle čeho se nftables rozhoduje které moduly si natáhnout automaticky a které ignorovat?
Taky jsem na to zkoušel jít přes systemd. Tajně jsem doufal že když pustím nftables jako "service" tak to celé proběhne nejak automatizovaně bez ručního žonglování s modulama no nepovedlo se.
# systemctl start nftables.service
Job for nftables.service failed because the control process exited with error code.
nft jako systemd nftables.service si defaultně čte kofigurák /etc/nftables.conf a na tom to celé shoří protože ten přidává tabulku "table inet filter" která a teď budu hádat, asi potřebuje modul "nft_fib_inet"? Prostě to celé spadne se starou známou hláškou "Address family not supported by protocol". Takže ani systemd si nedokáže natáhnout moduly pro nft automaticky. Co s tím? Potřeboval bych trochu popostrčit.