我正在尝试设置两个网络命名空间来相互通信。我设置了两个命名空间,ns0
每个ns1
命名空间都有一个 veth 对,其中 veth 的非命名空间一侧链接到桥。
我是这样设置的:
ip link add veth0 type veth peer name brveth0
ip link set brveth0 up
ip link add veth1 type veth peer name brveth1
ip link set brveth1 up
ip link add br10 type bridge
ip link set br10 up
ip addr add 192.168.1.11/24 brd + dev br10
ip netns add ns0
ip netns add ns1
ip link set veth0 netns ns0
ip link set veth1 netns ns1
ip netns exec ns0 ip addr add 192.168.1.20/24 dev veth0
ip netns exec ns0 ip link set veth0 up
ip netns exec ns0 ip link set lo up
ip netns exec ns1 ip addr add 192.168.1.21/24 dev veth1
ip netns exec ns1 ip link set veth1 up
ip netns exec ns1 ip link set lo up
ip link set brveth0 master br10
ip link set brveth1 master br10
ns0
正如预期的那样,我可以从ping 接口ns1
。
$ sudo ip netns exec ns1 ping -c 3 192.168.1.20
PING 192.168.1.20 (192.168.1.20) 56(84) bytes of data.
64 bytes from 192.168.1.20: icmp_seq=1 ttl=64 time=0.099 ms
64 bytes from 192.168.1.20: icmp_seq=2 ttl=64 time=0.189 ms
但是,我无法通过 TCP 连接两者。
例如,在以下位置运行服务器ns0
:
$ sudo ip netns exec ns0 python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
我希望能够从 卷曲它ns1
,但这会产生错误:
$ sudo ip netns exec ns1 curl 192.168.1.20:8080
curl: (7) Failed to connect to 192.168.1.20 port 8080: No route to host
为什么会发生这种情况?
答案1
我遇到了类似的情况:在使用 flannel 的 k8s 主机上,podA 可以 ping 同一主机上的 podB,但 tcp 连接被来自 cni0 的 ICMP 重置重置。
iptables-save
显示了有关 k8s 的规则,其中任何一个看起来都很好。
nft list ruleset
显示由firewalld制定的规则:
table inet firewalld {
chain filter_FORWARD {
type filter hook forward priority filter + 10; policy accept;
ct state { established, related } accept
ct status dnat accept
iifname "lo" accept
ip6 daddr { ::/96, ::ffff:0.0.0.0/96, 2002::/24, 2002:a00::/24, 2002:7f00::/24, 2002:a9fe::/32, 2002:ac10::/28, 2002:c0a8::/32, 2002:e000::/19 } reject with icmpv6 addr-unreachable
jump filter_FORWARD_ZONES
ct state invalid drop
reject with icmpx admin-prohibited
}
停止firewalld服务后一切正常:
systemctl stop firewalld
因此,请尝试检查是否有任何其他服务或内核模块也可能正在使用netfiler。