如何建立一个“虚拟”虚拟网络


26

我想设置三个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但它不是:(

该I添加的IP地址到veth1veth3veth5br0在10.0.1.x / 24范围的接口。但这无济于事。

有任何想法吗?或指南,这是我在LXC上如何使用它的全部内容。还是我正在尝试一些不可能的事情?


br0自己吗?
grawity 2014年

是的,它起来了。配置它像VETH的
雷因德

Answers:


31

为了使veth工作,必须将隧道的一端与另一接口桥接。由于要保持所有虚拟状态,可以在名为brm的网桥中,将tap型虚拟接口与隧道的vm1端(隧道的另一端)连接在一起。现在,您将IP地址提供给brm和vm2(分别为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命令的使用。

这是使用veth类型的接口的正确命令序列:

首先创建所有必需的接口,

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 route show进行检查。这导致

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

您也可以向后执行此操作,从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

第十种网卡最有用的应用是网络名称空间,它是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

我们允许在主机上进行NATing,

iptables -t nat -A POSTROUTING -o brm -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

(如果您是通过eth0连接到Internet的,否则进行相应的更改),请在新的网络名称空间中启动Shell,

ip netns exec nnsm xterm & 

现在,如果您开始输入新的xterm,则会发现您位于IP地址为10.0.0.2的单独虚拟机中,但可以访问Internet。这样做的好处是,新的网络名称空间具有自己的堆栈,例如,这意味着您可以在其中启动VPN,而其他PC 不在 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

谢谢你的解释。我只在xterm中看到lo,缺少vm2接口。
Reinder 2014年

再次感谢。我制作了一个脚本来设置三个xterm,并且可以相互ping :)
Reinder,2014年

只有一个问题...当我在一个xterm中发送UPD广播时,其他人从10.0.0.254(brm)接收了数据包。对于我的脚本,请参见:此处(无法在评论中发布)
Reinder 2014年

我有问题造就了VM1#:( IP链接添加开发VM1型VETH等名称VM2 IP:RTNETLINK答案:文件存在#IP链路集开发VM1了IP:SIOCGIFFLAGS:没有这样的设备
resultsway

@ MariusMatutiae我不得不尝试几次,所以我同意第一个命令,但是以某种方式我的复制粘贴不适用于第二个命令(Iam在设备上使用minicom),总之我完全按照建议进行操作。我想我没有iproute2软件包。
resultsway

0

这是我使用的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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.