我一直在从“高级”(awall、ufw、firewall-cmd 等)防火墙工具迁移到nftables
“脚本”,但文档体验并不是最好的。手册页和 nftables wiki(以及其他来源,如 Gentoo 和 Arch wiki、Ubuntu 和 Debian 手册页等)似乎并未涵盖所有内容。
例如“meta l4proto”,我在 Gentoo wiki 上发现它可以接受“ipv6-icmp”来检查 v6 ping,但这仅在示例中显示,并没有在其他地方记录。
手册页仅提供:
l4proto | 第 4 层协议,跳过 ipv6 扩展标头 | 整数(8 位) |
---|
另一个例子是“meta”表达式关键字本身。有使用它的匹配示例,也有不使用它的匹配示例(例如:meta iff foo
vs iff foo
)。那么,它只是“冗长”的事情吗?还是它改变了规则的行为/匹配?
从手册页中:
元表达式有两种类型:非限定元表达式和限定元表达式。限定元表达式要求在元键前使用 meta 关键字,非限定元表达式可以直接使用元键指定,也可以作为限定元表达式指定。
因此,虽然我可以从不同来源破解防火墙(大多数示例似乎最具参考价值),但这一切似乎都适得其反,我没有足够的信心在生产中部署我不理解的 nftables。有没有真正完整的 nftables 来源?
我研究过由“高级”防火墙工具生成的 nftables,它们似乎都使用了非常混合的风格。
附件是我玩过的脚本:
#!/usr/bin/nft -f
flush ruleset
table inet my {
set CloudflareDNSv4 {
type ipv4_addr
elements = {1.1.1.1, 1.0.0.1}
}
set CloudflareDNSv6 {
type ipv6_addr
elements = {2606:4700:4700::1111, 2606:4700:4700::1001}
}
chain MY_INPUT {
type filter hook input priority 0; policy drop;
ct state invalid drop
meta l4proto icmp counter jump PING
meta l4proto ipv6-icmp counter jump PING
ct state established,related accept
meta iif "lo" accept
meta iif != "lo" ip daddr 127.0.0.1/8 drop
meta iif != "lo" ip6 daddr ::1/128 drop
tcp dport 22 accept
log prefix "IN Dropped packet: " drop
counter
}
chain MY_FORWARD {
type filter hook forward priority 0; policy drop;
log prefix "FW Dropped packet: " drop
counter
}
chain MY_OUTPUT {
type filter hook output priority 0; policy drop;
ct state established,related accept
ct state invalid drop
meta oif "lo" accept
meta oif != "lo" ip saddr 127.0.0.1/8 drop
meta oif != "lo" ip6 saddr ::1/128 drop
udp dport 53 jump DNS
udp dport 853 jump DNS
meta l4proto icmp accept
meta l4proto ipv6-icmp accept
log prefix "OUT Dropped packet: " drop
counter
}
chain DNS {
ip daddr @CloudflareDNSv4 accept
ip6 daddr @CloudflareDNSv6 accept
drop
}
chain PING {
counter packets 0 bytes 0
limit rate over 10/second burst 5 packets drop
icmp type {
echo-reply, # 0
destination-unreachable, # 3
echo-request, # 8
time-exceeded, # 11
parameter-problem, # 12
} accept
icmpv6 type {
destination-unreachable, # 1
packet-too-big, # 2
time-exceeded, # 3
parameter-problem, # 4
echo-request, # 128
echo-reply, # 129
} accept
drop
}
}