理解 nftables 中的跳跃是如何工作的

理解 nftables 中的跳跃是如何工作的

我是 nftables 的新手。我读过一些文档,并浏览过主要维基页面,但我仍然不明白 DOCKER-USER 链是如何工作的。

以下是由 docker 创建的表:

table ip filter {
        chain DOCKER {
        }

        chain DOCKER-ISOLATION-STAGE-1 {
                iifname "docker0" oifname != "docker0" counter packets 0 bytes 0 jump DOCKER-ISOLATION-STAGE-2
                counter packets 0 bytes 0 return
        }

        chain DOCKER-ISOLATION-STAGE-2 {
                oifname "docker0" counter packets 0 bytes 0 drop
                counter packets 0 bytes 0 return
        }

        chain FORWARD {
                type filter hook forward priority filter; policy drop;
                counter packets 15050 bytes 1456483 jump DOCKER-USER
                counter packets 0 bytes 0 jump DOCKER-ISOLATION-STAGE-1
                oifname "docker0" ct state related,established counter packets 0 bytes 0 accept
                oifname "docker0" counter packets 0 bytes 0 jump DOCKER
                iifname "docker0" oifname != "docker0" counter packets 0 bytes 0 accept
                iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept
        }

        chain DOCKER-USER {
                iifname "pub_br0" oifname "pub_br0" counter packets 15050 bytes 1456483 accept
                counter packets 0 bytes 0 return
        }
}

如您所见,FORWARD 链的默认策略是“丢弃”。由于我的服务器也会路由到虚拟机,因此我必须插入一条规则作为官方文件说。

所以DOCKER-USER中的第一行是我创建的。

问题是:它为什么有效?我在 wiki 页面上看到““进入链意味着控制权将返回到调用者链,其中我的数据包应该按照默认策略被丢弃。

我错过了什么,为什么从 pub_br0 到 pub_br0 的数据包没有在 docker 的 FORWARD 链中被丢弃?

谢谢

答案1

只有当数据包policy到达该链的末尾且不匹配任何具有绝对裁决声明,即acceptdrop

如果数据包与规则匹配并得到drop判定,或者到达基链末尾并得到判定policy drop,数据包将立即永久消失;但如果数据包得到判定accept,它仍必须经过可能与优先级更高的相同钩子相关联的任何其他基链,以及包处理管道中可能在其之后的其他适用钩子中的任何链。这些其他链可能会阻止drop数据包。

因此,您的 FORWARD 基础链具有policy drop。这仅意味着如果数据包到达 FORWARD 链的末尾,它将被丢弃。但是链中的第一个规则匹配所有内容并跳转到 DOCKER-USER 链,因此您的数据包将首先由该链处理。

在 DOCKER-USER 链中,第一条规则匹配通过 pub_br0 进入并通过同一网桥直接出去的数据包。您的数据包匹配,结论是accept。这将终止规则集评估:无需在 DOCKER-USER 链中进一步处理,也无需处理 FORWARD 链的其余部分;并且由于似乎没有其他filter与 相关的基链hook forward,也没有任何类型的基链hook postrouting,因此我们完毕并且数据包被接受转发。

如果 DOCKER-USER 链中的第一个规则不匹配,则下一个规则只是一个计数器和一个显式的return,因此不匹配DOCKER-USER 链中的第一个规则将直接返回,通过发送到 DOCKER-USER 的链的其余部分进行处理,在本例中即 FORWARD 链。

但是该规则的计数器当前显示为packets 0 bytes 0,因此到目前为止到达 DOCKER-USER 链的所有内容都必须accept由链中的第一个规则编辑,因为它们还没有机会达到该return规则。

相关内容