我不确定这是否是这个问题最正确的位置,如果不是,请告诉我,我会移动它。
这是我的设置:使用 slirp4netns 在无根 podman 容器中运行 pihole。
pihole 服务在容器内的端口 53 上运行。容器将端口 3953 从主机映射到端口 53。我使用 nftables 规则并使所有这些工作正常。
这是有效的(pihole 在 HostA-10.10.10.5 上运行):
HostB --DNS (UDP/TCP:10.10.10.5:3953)--> HostA:3953 --> Container = valid response
HostA --DNS (UDP/TCP:10.10.10.5:3953)--> HostA:3953 --> Container = valid response
HostA --DNS (TCP:127.0.0.1:3953)--> HostA:3953 --> Container = valid response
HostA --DNS (UDP:127.0.0.1:3953)--> HostA:3953 --> Container = timed out
Container -- DNS (UDP:127.0.0.1:53) --> valid response.
如果我执行到容器中并运行 tcpdump,我可以看到所有请求都有 UDP 请求,但从 HostA 到 127.0.0.1 的请求没有得到响应。这是我的 tcpdump:
#Internal To Container: success
01:04:18.425902 lo In IP 127.0.0.1.60839 > 127.0.0.1.53: 57697 [1au] A? pihole.home. (52)
01:04:18.426008 lo In IP 127.0.0.1.53 > 127.0.0.1.60839: 57697* 1/0/1 A 10.10.10.5 (52)
#External to Host: (from HostB): success
01:04:35.044972 tap0 In IP 10.10.10.6.55428 > 10.0.2.100.53: 63205+ [1au] A? pihole.home. (52)
01:04:35.045154 tap0 Out IP 10.0.2.100.53 > 10.10.10.6.55428: 63205* 1/0/1 A 10.10.10.5 (56)
#Host loopback (hostA 127.0.0.1): Failed.
01:04:23.666449 tap0 In IP 127.0.0.1.34179 > 10.0.2.100.53: 27771+ [1au] A? pihole.home. (52)
01:04:28.689778 tap0 In IP 127.0.0.1.50000 > 10.0.2.100.53: 27771+ [1au] A? pihole.home. (52)
而且我没有看到 pihole 中的日志,这让我想知道它是否可以通过。
我认为有趣的是 HostA 环回上的接口是 tap0,但 IP 127.0.0.1。这让我觉得路线有些奇怪?
这是我在容器中的接口(输出:)ip -br a
:
lo UNKNOWN 127.0.0.1/8
tap0 UNKNOWN 10.0.2.100/24
这是我的“本地”路由表:( # ip ro sh table local
):
local 10.0.2.100 dev tap0 proto kernel scope host src 10.0.2.100
broadcast 10.0.2.255 dev tap0 proto kernel scope link src 10.0.2.100
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
这是我的“主”路由表:(# ip ro sh table main
)
default via 10.0.2.2 dev tap0
10.0.2.0/24 dev tap0 proto kernel scope link src 10.0.2.100
这让我想知道是否因为请求传入 127.0.0.1,但在 Tap0 接口上,而不是环回,东西被破坏了。
我可以用容器上的路由表来修复这个问题吗?或者还有其他方法可以解决这个问题吗?