nft
让我头疼不已,无论我如何调整政策,我仍然无法让它发挥作用。
我想到的概念:
- 一个存在通用规则的“基础”链(例如允许
ssh
等) - 一个或多个特定于守护程序特定规则所在的应用程序(例如 http 服务器链)
我尝试了许多不同的规则排列,但我永远无法同时获得“基础”+ 守护程序流量,我总是最终阻止其中一个!;-(
这是我当前的(简化的)配置(目前构成它允许ssh
但不允许http
)
/etc/nftables.conf:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
counter input_ssh {}
set my_admin_ipv4 {
type ipv4_addr
flags interval
counter
elements = {
10.0.0.0/8,
172.16.0.0/12,
192.168.0.0/16
}
}
chain input {
type filter hook input priority filter;
iifname lo accept comment "Allow loopback traffic";
ct state established,related accept comment "Allow established/related connections";
ct state invalid drop comment "Deny invalid connections";
# SSH
tcp dport ssh ip saddr @my_admin_ipv4 counter name input_ssh accept comment "Allow IPv4 SSH from Admin";
policy drop;
}
chain forward {
type filter hook forward priority 0;
policy drop;
}
chain output {
type filter hook output priority 0;
}
include "/etc/nft/*.conf"
}
/etc/nft/http.conf:
counter input_http {}
chain http {
type filter hook input priority filter - 1;
# HTTP #
tcp dport {80,443} counter name input_nginx accept comment "Allow HTTP";
policy accept;
}
您可以选择在同一钩子的后续链中将数据包标记为安全行为。
每个接受规则都应该标记数据包
执行显式接受的规则应在接受之前标记数据包。任何发生:
应替换为:
如果标记没有其他角色,则该值不重要,只要它不为 0。
每个链都应该接受一个标记的数据包,因为这是安全的行为
通过在链的早期使用此规则:
这是一般的想法。如果更有意义,仍然可以进行调整和例外。
这是遵循这种方法的重新审视的规则集。该标记在
ct ... invalid drop
规则之后被接受,这是一条不应被绕过的重要规则(实际上本可以在较早的链中一劳永逸地完成,因为它是一个丢弃规则)。如果在下面,输入是过滤器/输入钩子中的最后一个链,它实际上并不需要标记已接受的数据包,但这样做并没有什么坏处。/etc/nftables.conf:
:/etc/nft/http.conf
(替换counter_nginx
为counter_http
)。meta mark != 0 accept
这里可能不需要该规则,因为之前可能没有任何其他链,但拥有它也没有什么坏处。此方法使用标记,因此将更难与已将标记用于其他目的的其他防火墙规则集成。通过按位运算保留一些标记位仍然是可能的。