互いに通信するために2つのネットワーク名前空間を設定しようとしています。私はns0
それぞれvethペアを持つ2つの名前空間を設定しましたns1
。ここで、 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
同様の状況が発生しました。フランネルを使用するk8sホストでは、podAは同じホスト上でpodBをpingできましたが、cni0のICMPリセットによってtcp接続がリセットされました。
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
}
ファイアウォールサービスを停止した後、すべてがうまくいきました。
systemctl stop firewalld
したがって、他のサービスやカーネルモジュールもnetfilerを使用していることを確認してください。