我正在尝试创建两个通过用户空间程序连接的分接接口,该接口应该能够查看(并稍后修改)通过“线路”传输的所有数据包。虽然这在我使用不同的主机(并通过 TCP 连接转发数据包)时有效,但当两个 TAP 接口位于同一主机上时,我会遇到此设置问题。有人建议我使用单独的名称空间来完成这项工作。
所以我的想法如下:
- 在根命名空间中设置 tun1
- 在根命名空间中设置 tun2
- 使用用户空间程序连接两者(我在下面的 POC 中使用 socat)
- 将 tun1 移动到新的命名空间 ns1
- 将 tun2 移动到新的命名空间 ns2
- 在 ns1 或 ns2 的接口之间执行 Ping 操作
但是,当我这样做时,socat(或任何其他用户空间“连接器”)在写入 Tap fd 时会出现 IO 错误。我怎样才能做到这一点?
我的 POC 代码如下所示:
openvpn --mktun --dev tun1 --user timos
openvpn --mktun --dev tun2 --user timos
ip link set dev tun1 up
ip link set dev tun2 up
ip addr add 192.168.1.1/24 dev tun1
ip addr add 192.168.1.2/24 dev tun2
socat TUN:192.168.1.1/24,tun-name=tun1 TUN:192.168.0.2/24,tun-name=tun2 &
ip netns add ns1
ip netns add ns2
ip netns exec ns1 ip link set dev lo up
ip netns exec ns2 ip link set dev lo up
ip link set tun1 netns ns1
ip link set tun2 netns ns2
ip netns exec ns1 ip link set dev tun1 up
ip netns exec ns2 ip link set dev tun2 up
ip netns exec ns1 ip addr add 192.168.1.1/24 dev tun1
ip netns exec ns2 ip addr add 192.168.1.2/24 dev tun2
ip netns del ns1
ip netns del ns2
类似问题的回答是否可以仅使用 TUN/TAP 接口在网络命名空间之间发送数据包?似乎表明这应该有效,但我无法重现它。