我想设置三个veth
可以相互通信的虚拟网络接口()。为了模拟三节点集群,每个程序都绑定到一个veth
接口。如果可能的话,我想不使用 LXC 来实现这一点。
我尝试使用:
- 创建了三
veth
对:sudo ip link add type veth
- 搭建了一座桥梁
sudo brctl addbr br0
- 在桥上添加了每对中的一个:
sudo brctl addif br0 veth1
sudo brctl addif br0 veth3
sudo brctl addif br0 veth5
- 配置接口:
sudo ifconfig veth0 10.0.0.201 netmask 255.255.255.0 up
sudo ifconfig veth2 10.0.0.202 netmask 255.255.255.0 up
sudo ifconfig veth4 10.0.0.203 netmask 255.255.255.0 up
然后我验证了它是否可以正常工作:ping -I veth0 10.0.0.202
但是它不起作用:(
我在 10.0.1.x/24 范围内为、veth1
和接口添加了 IP 地址。但这没有帮助。veth3
veth5
br0
有什么想法吗?或者指南,我找到的都是关于如何将其与 LXC 一起使用。还是我正在尝试一些不可能的事情?
答案1
要使 veth 正常工作,隧道的一端必须与另一个接口桥接。由于您希望保持这一切虚拟,您可以在名为 brm 的桥接中将隧道的 vm1 端(vm2 是隧道的另一端)与 tap 类型的虚拟接口桥接起来。现在,您为 brm 和 vm2 提供 IP 地址(分别为 10.0.0.1 和 10.0.0.2),通过以下方式启用 IPv4 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
启动所有接口,并添加一条路由,指示内核如何到达 IP 地址 10.0.0.0/24。就这样。
如果要创建更多对,请对不同的子网重复以下步骤,例如 10.0.1.0/24、10.0.2.0/24 等。由于您启用了 IPv4 转发并将适当的路由添加到内核路由表,因此它们将能够立即相互通信。
另外,请记住,您使用的大多数命令(brctl、ifconfig……)都已过时:iproute2套件中有命令可以完成所有这些操作,请参阅下面我使用的知识产权命令。
这是使用以下类型接口的正确命令序列韦特:
首先创建所有必需的接口,
ip link add dev vm1 type veth peer name vm2
ip link set dev vm1 up
ip tuntap add tapm mode tap
ip link set dev tapm up
ip link add brm type bridge
请注意,我们没有启动 brm 和 vm2,因为我们必须为它们分配 IP 地址,但我们确实启动了 tapm 和 vm1,这对于将它们纳入网桥 brm 是必要的。现在将接口 tapm 和 vm1 绑定到网桥 brm,
ip link set tapm master brm
ip link set vm1 master brm
现在为网桥和剩余的 veth 接口 vm2 提供地址,
ip addr add 10.0.0.1/24 dev brm
ip addr add 10.0.0.2/24 dev vm2
现在启动 vm2 和 brm,
ip link set brm up
ip link set vm2 up
无需明确添加至子网 10.0.0.0/24 的路由,该路由是自动生成的,您可以使用以下命令进行检查ip 路由显示.这导致
ping -c1 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.035 m
--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.035/0.035/0.035/0.000 ms
你也可以反过来做,IE从vm2返回brm:
ping -I 10.0.0.2 -c1 10.0.0.1
PING 10.0.0.1 (10.0.0.1) from 10.0.0.2 : 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms
--- 10.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.045/0.045/0.045/0.000 ms
NIC 最有用的应用韦特kind 是一种网络命名空间,这是 Linux 容器 (LXC) 中使用的。您可以按如下方式启动一个名为 nnsm 的容器
ip netns add nnsm
然后我们将 vm2 传输给它,
ip link set vm2 netns nnsm
我们为新的网络命名空间赋予一个 lo 接口(绝对必要),
ip netns exec nnsm ip link set dev lo up
我们允许主机进行 NAT,
iptables -t nat -A POSTROUTING -o brm -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
(如果您通过以下方式连接到互联网eth0,否则相应更改),在新的网络命名空间中启动一个 shell,
ip netns exec nnsm xterm &
现在,如果你开始在新的 xterm 中输入内容,你会发现你处于一个单独的虚拟机中,IP 地址为 10.0.0.2,但你可以访问互联网。这样做的好处是,新的网络命名空间有自己的堆栈,这意味着,例如,你可以在其中启动 VPN,而你的电脑的其余部分不是在 VPN 上。这是 LXC 所基于的装置。
编辑:
我犯了一个错误,打开 vm2 接口会将其关闭并清除其地址。因此,您需要在 xterm 中添加以下命令:
ip addr add 10.0.0.2/24 dev vm2
ip link set dev vm2 up
ip route add default via 10.0.0.1
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
echo "nameserver 8.8.4.4" >> /etc/resolv.conf
现在您可以从 xterm 内部导航。
ip
也可以在 xterm 之前使用以下命令执行该命令
ip -netns nnsm addr add 10.0.0.2/24 dev vm2
ip -netns nnsm link set dev vm2 up
ip -netns nnsm route add default via 10.0.0.1
答案2
这是我使用的 5 节点桥接设置,效果很好。您应该能够使用 ifconfig 将地址分配到 NodeX 接口上
ip link add dev Node1s type veth peer name Node1
ip link add dev Node2s type veth peer name Node2
ip link add dev Node3s type veth peer name Node3
ip link add dev Node4s type veth peer name Node4
ip link add dev Node5s type veth peer name Node5
ip link set Node1 up
ip link set Node2 up
ip link set Node3 up
ip link set Node4 up
ip link set Node5 up
ip link set Node1s up
ip link set Node2s up
ip link set Node3s up
ip link set Node4s up
ip link set Node5s up
brctl addbr Br
ifconfig Br up
brctl addif Br Node1s
brctl addif Br Node2s
brctl addif Br Node3s
brctl addif Br Node4s
brctl addif Br Node5s
并清理
brctl delif Br Node1s
brctl delif Br Node2s
brctl delif Br Node3s
brctl delif Br Node4s
brctl delif Br Node5s
brctl delif Br Node1
brctl delif Br Node2
brctl delif Br Node3
brctl delif Br Node4
brctl delif Br Node5
ifconfig Br down
brctl delbr Br
ip link del dev Node1
ip link del dev Node2
ip link del dev Node3
ip link del dev Node4
ip link del dev Node5