如何设置 `veth` 虚拟网络

如何设置 `veth` 虚拟网络

我想设置三个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 地址。但这没有帮助。veth3veth5br0

有什么想法吗?或者指南,我找到的都是关于如何将其与 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

相关内容