在单独的命名空间中访问具有重复 IP 的以太网设备

在单独的命名空间中访问具有重复 IP 的以太网设备

如果有人问过这个问题,我深表歉意。我已经搜索了好几天,尝试了很多不同的方法,但还是遗漏了一些东西。

问题

我必须同时连接多个设备,其中 2 个设备的 IP 为 192.168.240.120/24。其他设备位于 169.254.xx/16 和 192.168.1.x/24 范围内,每次只能连接一个。这些 IP 由制造商设置,无法更改。目前,除了能够同时连接 2 个具有相同 IP 的设备外,我拥有所需的所有功能。

目标

我希望能够同时使用相同的 IP 192.168.240.120/24 访问两个设备。一个设备在 eth0 上,另一个在 eth1 上。所有其他设备将一次通过 eth0 进行访问。它们不需要通过 wlan0 访问互联网。

  1. 将设备1(192.168.240.120)插到eth0上,在192.168.15.1处访问设备,进行配置
  2. 将设备2(192.168.240.120)插到eth1上,在192.168.15.2处访问设备,进行配置
  3. 断开两个设备(eth0、eth1)
  4. 将设备3(169.254.1.5)插到eth0上,访问192.168.15.1的设备,进行配置
  5. 断开 eth0 设备
  6. 对其余设备重复 4-5

我做了什么

为了能够连接到 eth0 上的所有设备,我为该接口设置了多个 IP 地址。我还从 dhcpcd 切换到 NetworkManager,因为我无法让 dhcpcd 正确处理本地链接地址。

sudo ip addr add 192.168.240.121/24 dev eth0
sudo ip addr add 192.168.1.2/24 dev eth0
sudo ip addr add 169.254.1.3/16 dev eth0
sudo ip addr add 169.254.2.1/16 dev eth0

当我不需要使用同一个 IP 连接两个设备时,这种方法非常有用。经过多日的搜索,我偶然发现了这个,并认为这正是我需要的:
https://networkengineering.stackexchange.com/a/38572

因此,我花了更多天来查找如何创建命名空间以及如何向其中添加 veth、网桥和物理以太网端口。我能够从默认命名空间 ping 命名空间 1 和命名空间 2 内的 veth,但无法弄清楚如何将 IP 路由到 eth0 和 eth1 设备。我试图理解如何路由它,这让我很沮丧,所以我继续搜索。我为此运行的命令如下。

以下是我关注的 YouTube 视频:
https://www.youtube.com/watch?v=j_UUnlVC2Ss

# Enable ip forwarding
sudo echo -e "net.ipv4.ip_forward=1" >> /etc/sysctl.d/custom.conf

# Create namespaces
sudo ip netns add ns-eth0
sudo ip netns add ns-eth1

# Add ethernet devices to their namespaces
sudo ip link set eth0 netns ns-eth0
sudo ip link set eth1 netns ns-eth1

# Bring loopbacks up
sudo ip netns exec ns-eth0 ip link set dev lo up
sudo ip netns exec ns-eth1 ip link set dev lo up

# Create bridge for namespaces
sudo ip link add eth-bridge type bridge
sudo ip link set dev eth-bridge up

# Create veth pairs for new namespaces
sudo ip link add veth0 type veth peer name veth0-br
sudo ip link add veth1 type veth peer name veth1-br

# Attach veth to namespaces
sudo ip link set veth0 netns ns-eth0
sudo ip link set veth1 netns ns-eth1

# Attach veth-br to the bridge
sudo ip link set veth0-br master eth-bridge
sudo ip link set veth1-br master eth-bridge

# Set veth ip's in their namespaces
sudo ip -n ns-eth0 addr add 192.168.15.10/24 dev veth0
sudo ip -n ns-eth1 addr add 192.168.15.11/24 dev veth1

# Set ip's for physical eth devices
sudo ip -n ns-eth0 addr add 192.168.1.2/24 dev eth0
sudo ip -n ns-eth0 addr add 192.168.255.130/24 dev eth0
sudo ip -n ns-eth0 addr add 169.254.1.3/16 dev eth0
sudo ip -n ns-eth0 addr add 169.254.2.1/16 dev eth0
sudo ip -n ns-eth1 addr add 192.168.255.130 dev eth1

# Bring veths up
sudo ip -n ns-eth0 link set veth0 up
sudo ip -n ns-eth1 link set veth1 up

# Give the bridge an ip
sudo ip addr add 192.168.15.254/24 dev eth-bridge

经过搜索,我找到了 IPVLAN 和 MACVLAN。据我所知,由于我通过 wlan0 连接到路由器,因此无法使用 MACVLAN,因此我找到了 IPVLAN。在搜索了如何创建 MACVLAN 后,我找到了一个关于如何设置的简短视频。我不确定哪种选择最适合我的情况,但根据视频来看,IPVLAN 似乎不太复杂。
这是我所指的视频:https://www.youtube.com/watch?v=_CtnWyrRvG4

配置方式如下:

ip link add link wlan0 name ipnet1 type ipvlan mode l3
ip link add link wlan0 name ipnet2 type ipvlan mode l3
ip netns add ns1
ip netns add ns2
ip link set dev ipnet1 netns ns1
ip link set dev ipnet2 netns ns2
ip -n ns1 link set ipnet1 up
ip -n ns1 addr add 192.168.15.1/32 dev ipnet1
ip -n ns2 addr add 192.168.15.2/32 dev ipnet2
ip -n ns2 link set ipnet2 up
ip -n ns1 route add default dev ipnet1
ip -n ns2 route add default dev ipnet2
ip netns exec ns1 ping 192.168.15.2 # successful
ip netns exec ns2 ping 192.168.15.1 # successful
ip link add link wlan0 name ipnet0 type ipvlan mode l3
ip link set dev ipnet0 up
ip addr add 192.168.15.5/32 dev ipnet0
ip route add 192.168.15.1/32 dev ipnet0
ip netns exec ns1 ping 192.168.137.42 # successful
ip netns exec ns1 ping 192.168.15.5 # successful
ping 192.168.15.1 # successful
ip route add 192.168.15.2/32 dev ipnet0
ping 192.168.15.2 # successful

# Now to add physical eth to namespace
ip link set eth0 netns ns1
ip link set eth1 netns ns2
ip -n ns1 route del default
ip -n ns2 route del default
ip -n ns1 link set eth0 up
ip -n ns2 link set eth1 up
ip -n ns1 route add default dev eth0
ip -n ns2 route add default dev eth1
ip -n ns2 addr add 192.168.240.121/24 dev eth1
ip -n ns1 addr add 192.168.1.2/24 dev eth0
ip -n ns1 addr add 169.254.1.3/16 dev eth0
ip -n ns1 addr add 169.254.2.1/16 dev eth0

一旦我将 nsX 中的默认路由设置为,default dev ethX我就无法再 ping 通,也无法与连接到 ethX 的设备进行通信。我花了很长时间尝试排除故障,我真的需要一些帮助。

注意:我知道你们中的许多人可能会想“那就换个设备吧”,但这是不可能的。这些设备将通过光纤链路进行带内访问,并且一旦配置加载,本地管理端口就会被禁用。

编辑:我会尽快回复。当我创建帐户时,它没有将其链接到此问题,因此在支持人员解决该问题之前我无法回复。

相关内容