我是 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
到达该链的末尾且不匹配任何具有绝对裁决声明,即accept
或drop
。
如果数据包与规则匹配并得到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
规则。