我可以 ping 跨命名空间,但无法使用 TCP 连接

我可以 ping 跨命名空间,但无法使用 TCP 连接

我正在尝试设置两个网络命名空间来相互通信。我设置了两个命名空间,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。

相关内容