4

我正在尝试使用网络命名空间来实现 VRF 行为(虚拟路由和转发)以进行网络隔离。本质上,我有一个服务器应用程序 (C/C++) 在默认命名空间的 TCP 端口上运行。我想做的是使用网络命名空间来创建使用 VLAN 的隔离 VRF,然后让在默认命名空间中运行的应用程序能够为每个命名空间生成一个线程,以便在每个命名空间的同一端口上侦听。

我已经弄清楚了网络端,我只是看不到如何生成线程(如果可能,更喜欢使用 pthread 而不是 clone()),在其中一个命名空间上调用 setns(),然后绑定到同一个命名空间内的端口。下面是我为创建命名空间和桥接器所做的工作(为简单起见,此处限制为一个命名空间):

# ip netns add ns_vlan100
# ip link add link eno1 eno1.100 type vlan id 100

# ip link add veth0 type veth peer name veth_vlan100
# ip link set veth0 netns ns_vlan100

# ip netns exec ns_vlan100 ip link set dev veth0 up
# ip link set dev veth_vlan100 up

# brctl addbr bridge_vlan100
# brctl addif bridge_vlan100 eno1.100
# brctl addif bridge_vlan100 veth_vlan100

# ip link set dev bridge_vlan100 up
# ip link set dev eno1.100 up

# ip netns exec ns_vlan100 ifconfig veth0 10.10.10.1 netmask 255.255.255.0 up
# ip netns exec ns_vlan100 ip route add default via 10.10.10.1

有了这个,我可以在对等机器上创建一个 VLAN(没有容器)并 ping 10.10.10.1 没有问题。所以我知道链接很好。然后我想要做的是让我现有的应用程序能够在 C 或 C++ 中生成一个线程(pthreads 是首选),并且该线程调用 setns() 并将其放入命名空间 ns_vlan100,因此我可以绑定到我的应用程序的相同端口,就在那个命名空间内。

我似乎无法弄清楚如何做到这一点。任何帮助深表感谢。

4

0 回答 0