我想设置三个veth可以相互通信的虚拟网络接口 ( )。为了模拟一个三节点集群,每个程序然后绑定到一个veth接口。如果可能的话,我想在没有 LXC 的情况下进行。
我尝试使用:
veth对:sudo ip link add type vethsudo brctl addbr br0sudo brctl addif br0 veth1sudo brctl addif br0 veth3sudo brctl addif br0 veth5sudo ifconfig veth0 10.0.0.201 netmask 255.255.255.0 upsudo ifconfig veth2 10.0.0.202 netmask 255.255.255.0 upsudo ifconfig veth4 10.0.0.203 netmask 255.255.255.0 up然后我验证是否使用:ping -I veth0 10.0.0.202但它没有:(
该I添加的IP地址到veth1,veth3,veth5和br0在10.0.1.x / 24范围的接口。但这无济于事。
有任何想法吗?或指南,我在如何将它与 LXC 一起使用中找到的所有内容。还是我在尝试不可能的事情?
Mar*_*iae 38
要使 veth 工作,隧道的一端必须与另一个接口桥接。由于您希望所有这些都保持虚拟,您可以在一个名为 brm 的网桥中使用 Tap 类型的虚拟接口桥接隧道的 vm1 端(vm2 是隧道的另一端)。现在您将 IP 地址提供给 brm 和 vm2(分别为 10.0.0.1 和 10.0.0.2),通过以下方式启用 IPv4 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
Run Code Online (Sandbox Code Playgroud)
启动所有接口,并添加一条路由,指示内核如何到达 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
Run Code Online (Sandbox Code Playgroud)
请注意,我们没有调出 brm 和 vm2,因为我们必须为它们分配 IP 地址,但我们确实调出了 tapm 和 vm1,这是将它们包含到桥 brm 中所必需的。现在将接口 tapm 和 vm1 奴役到网桥 brm,
ip link set tapm master brm
ip link set vm1 master brm
Run Code Online (Sandbox Code Playgroud)
现在为网桥和剩余的 veth 接口 vm2 提供地址,
ip addr add 10.0.0.1/24 dev brm
ip addr add 10.0.0.2/24 dev vm2
Run Code Online (Sandbox Code Playgroud)
现在启动 vm2 和 brm,
ip link set brm up
ip link set vm2 up
Run Code Online (Sandbox Code Playgroud)
路由不需要显式添加到子网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
Run Code Online (Sandbox Code Playgroud)
您也可以向后执行,即从 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
Run Code Online (Sandbox Code Playgroud)
veth类NIC 最有用的应用是网络命名空间,它用于 Linux 容器 (LXC)。你开始一个叫 nnsm 如下
ip netns add nnsm
Run Code Online (Sandbox Code Playgroud)
然后我们将 vm2 传输给它,
ip link set vm2 netns nnsm
Run Code Online (Sandbox Code Playgroud)
我们赋予新的网络命名空间一个 lo 接口(绝对必要),
ip netns exec nnsm ip link set dev lo up
Run Code Online (Sandbox Code Playgroud)
我们允许在主机中进行 NATting,
iptables -t nat -A POSTROUTING -o brm -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
(如果您通过eth0连接到 Internet ,否则相应更改),在新的网络命名空间中启动一个 shell,
ip netns exec nnsm xterm &
Run Code Online (Sandbox Code Playgroud)
现在,如果您开始输入新的 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
Run Code Online (Sandbox Code Playgroud)
现在您可以从 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
68290 次 |
| 最近记录: |