我的服务器设置了很长的服务列表,一切都运行良好......在 IPv4 上。但当我针对 IPv6 测试它们时,没有任何问题得到解决。禁用nftables
一切后开始工作,所以我重新打开它并通过反复试验,能够识别-->
导致事情失败的两行(如下所示)......
# Accept related or established, drop bad, accept everything else
add rule inet filter INPUT ct state related,established accept
add rule inet filter INPUT tcp flags & (fin|syn|rst|psh|ack|urg) == 0x0 drop
--> add rule inet filter INPUT tcp flags & (fin|syn|rst|ack) != syn ct state new drop
--> add rule inet filter INPUT tcp flags & (fin|syn|rst|psh|ack|urg) == fin|syn|rst|psh|ack|urg drop
add rule inet filter INPUT iifname "lo" accept
我在 TCP 方面没有受过应有的教育,实际上,我受的教育只是让自己陷入麻烦,所以我希望得到一些帮助来解释我在这里所做的事情。我的理解是,我接受所有相关/已建立的流量,以及与环回接口相关的所有流量。我真的只是在看“新”请求......
syn
我的问题是,除了和之外,我并不真正理解 TCP 标志ack
(并且实际上只了解它们如何在三路 TLS 握手),我在这里添加的其他内容似乎在我正在查看的教程中很常见。我担心的是我不明白将它们留在那里或将它们带出去意味着什么以及我要向自己敞开心扉。我的目标是允许 IPv4 和 IPv6 流量,同时消除任何坏的或者无关数据包无法通过。
这最终将与商业产品联系在一起,所以我想更好地理解,但需要一些指导。如果有人帮助我解决这个问题,我将不胜感激。
编辑:事实证明这些都不是问题,导致问题的规则实际上是规则icmp
,IPv6 需要一些nb-*
规则才能正常运行。我将在答案中提供详细信息。
答案1
事实证明,我发布的规则并不是罪魁祸首,正如我在问题更新中指出的那样。实际问题与 ICMP 流量有关,特别是与 IPv6 直接相关的几种类型。我的 ICMP 规则是...
add rule inet filter INPUT ct state new icmp type { echo-request, echo-reply } accept
add rule inet filter INPUT ct state new icmpv6 type { echo-request, echo-reply } accept
但为了正常运行 IPv6 需要一些邻居发现相关规则( nd-*
)。我已经将它们以及其他一些类型包括在内,这些都是成为“优秀网络公民”的一部分。我认为问题实际上对于缓解攻击很重要,并且现在我已经修复了 ICMP 流量,并且工作正常。
新的 ICMP 规则是...
add rule inet filter INPUT ip protocol icmp icmp type { destination-unreachable, echo-reply, echo-request, source-quench, time-exceeded } accept
add rule inet filter INPUT ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, echo-reply, echo-request, nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert, packet-too-big, parameter-problem, time-exceeded } accept
我认为问题的最初规则实际上是为了减轻恶意行为......
圣诞节攻击这条规则是为了减轻圣诞节攻击,或者启用所有 tcp 的数据包位类型,否则,像“圣诞树”一样点亮它,以解析操作系统对此类请求的响应的细微差异,以帮助识别不良行为者的进一步攻击途径......
add rule inet filter INPUT tcp flags & (fin|syn|rst|psh|ack|urg) == fin|syn|rst|psh|ack|urg drop
强制 SYN 检查如果我理解正确的话,这有助于通过消除初始 SYN 数据包之前的其他无用数据包来降低处理负载,这些数据包可能是对资源的攻击的一部分,例如通过资源耗尽造成的拒绝服务......
add rule inet filter INPUT tcp flags & (fin|syn|rst|ack) != syn ct state new drop
这个帖子帮助我站稳脚跟并开始寻找更好的理解。
希望这能为其他人提供答案的捷径! :)
答案2
您可能想简化您的 nftables 规则。这是我的作品:
table inet Filter {
chain Input {
type filter hook input priority 0
policy drop
iif lo accept
ct state established,related counter accept
ct state invalid counter drop
#Your other rules here
# this rule exists to avoid junk in syslog
ct state new tcp flags & (fin|syn|rst|ack) != syn counter drop
}
}
如果不需要,counter
可以将其随处删除。
答案3
如果您不希望 IP6 规则被 IP4 规则破坏,请将“inet”更改为“ip”。 nftables 允许适用于 IP4(“ip”)、IP6(“ip6”)以及 IP4 和 IP6(“inet”)的规则。目的是可以在一个地方一致地处理 TCP 和 UDP 规则。功能后来被称为错误。