在 Ubuntu 上,我需要让它看起来像是真实网络上有多台独立的机器。这需要在不创建任何额外虚拟机的情况下完成。一开始,我想到了 IP 地址别名,这确实有效。例如,我的计算机的适配器名为 enp0s3,其 IP 地址为 10.0.2.14。我希望其他计算机能够看到网络上 10.0.2.15 上的另一台计算机。我使用以下命令来实现:
sudo ip a add 10.0.2.15/24 dev enp0s3
这很好用,但是 10.0.2.14 和 .15 的 MAC 地址是相同的,这是不可接受的。
我尝试简单地更改 MAC 地址,但这同时更改了 .14 和 .15。
解决办法是什么?我知道这是可能的,因为如果我添加一个额外的 VirtualBox 网络适配器,它就有自己的 IP 和 MAC 地址。我无法使用该解决方案,因为我需要模拟很多机器(50+)。
我找到的最接近的答案是这个堆栈交换帖子。
在此先感谢您的帮助!
答案1
您可以创建多个网络命名空间,每个都有自己的 IP 地址,并以您想要的任何方式将它们连接在一起。
例如,假设我们要模拟共享专用网络的三个节点。首先我们创建一个代表网络的桥接设备:
ip link add name br-net0 type bridge
ip addr add 192.168.13.1/24 dev br-net0
ip link set br-net0 up
这让我们:
# ip addr show br-net0
3: br-net0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 2a:06:b9:b4:e9:61 brd ff:ff:ff:ff:ff:ff
inet 192.68.13.1/24 scope global br-net0
valid_lft forever preferred_lft forever
接下来,我们将创建网络命名空间来表示假机器:
# ip netns add node0
# ip netns add node1
# ip netns add node2
接下来我们创建三个veth对我们将使用它来将命名空间连接到桥:
ip link add name node0-ext type veth peer name node0-int netns node0
ip link add name node1-ext type veth peer name node1-int netns node1
ip link add name node2-ext type veth peer name node2-int netns node2
这些命令中的每一个都会创建一veth
对,并将该对的一端放入指定的网络命名空间中。我们需要将每对的“外部”端连接到我们的桥:
ip link set master br-net0 dev node0-ext
ip link set master br-net0 dev node1-ext
ip link set master br-net0 dev node2-ext
最后,我们需要 (a) 为虚拟节点分配地址:
ip netns exec node0 ip addr add 192.168.13.10/24 dev node0-int
ip netns exec node1 ip addr add 192.168.13.11/24 dev node1-int
ip netns exec node2 ip addr add 192.168.13.12/24 dev node2-int
该ip netns exec
命令允许我们在网络命名空间内运行命令(您也可以使用 来执行此操作nsenter
)。
(b) 调出所有接口:
for node in 0 1 2; do
ip link set node${node}-ext up
ip netns exec node${node} ip link set node${node}-int up
done
现在,我们有三个虚拟节点,每个虚拟节点都有唯一的 IP 地址和 MAC 地址:
# ping -c 1 192.168.13.10
PING 192.168.13.10 (192.168.13.10) 56(84) bytes of data.
64 bytes from 192.168.13.10: icmp_seq=1 ttl=64 time=0.054 ms
--- 192.168.13.10 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.054/0.054/0.054/0.000 ms
# arp -an
? (192.168.122.1) at 52:54:00:90:73:ca [ether] on eth0
? (192.168.13.11) at ba:0b:4b:ed:e4:bb [ether] on br-net0
? (192.168.13.12) at da:38:38:32:29:17 [ether] on br-net0
? (192.168.13.10) at 56:ad:09:af:46:1f [ether] on br-net0
迷你网是自动化此类设置的一个很好的工具。