假设我有一个支持以太网的设备,其中有一个硬编码的 IP 地址。我有与该设备配合使用的软件,该软件可以配置为与该设备的任何 IP 地址配合使用,但如上所述,该设备始终使用相同的固定地址。
现在问题来了:假设我想在我的网络中使用多个这样的设备。两个设备的例子足以说明问题。显然存在直接的 IP 冲突。我可以运行两个软件实例,但无法区分哪个软件实例应该与哪个设备关联。
我认为可能可行的方法是使用具有第 3 层功能的设备来执行网络地址转换,但我不需要对整个 LAN 进行 NAT,大多数商用路由器似乎都是这样做的。我真正想做的是在每个端口上应用静态 NAT。我想告诉路由器 (?),“你看到这个设备插入端口 2,认为它是 10.1.1.1?让它看起来像 192.168.1.2,另一个插入端口 3,认为它是 10.1.1.1?还认为它是 10.1.1.1 – make那一个看起来像 192.168.1.3” ......等等。(当然假设我的 LAN 的其余部分是 192.168.1/24)
我曾使用过一个可以处理 VLAN 和路由域的“交换机”,但似乎没有在 VLAN 之间转换地址的能力。由于空间和成本限制,无法为每个设备配备一个完整的支持 NAT 的路由器。
那么这种事情可能吗?如果可能,需要什么样的设备才能实现呢?哎呀,也许是我正在使用的交换机能做这件事,我只是不知道到底要寻找什么,也没有意识到!但如果根本没做,我也会想知道为什么没做,以找出我的想法的缺陷。不过,这似乎并非不可能。
答案1
可以的。其实我去年就自己做过了。
3 个 Airco 设备带有 LAN 监控,每个设备都要求为 10.0.0.2,并期望默认网关为 10.0.0.1,子网为 255.0.0.0。可以更改,但只能由不再营业的制造商更改。
购买新的根本不是一个选择:每个工业设备的价格约为 100,000 美元。
最糟糕的是:通信必须是双向的:远程访问设备中的 Web 界面,并且它需要能够自行发送系统日志消息。
诀窍在于您需要多个 NAT 路由器才能实现此功能。单个路由器根本无法处理具有相同 IP 子网的下游 LAN。(至少我从未见过任何设备......)
我的做法是购买 3 个便宜的现成路由器 (D-Link DIR-615)。将每个设备放在自己的路由器后面。将每个路由器的 LAN 端设置为 10.0.0.1,并将 HTTP 端口转发到 10.0.0.2 地址。每个路由器的 WAN 端都位于常规 LAN 上,每个路由器都有自己的正常 IP 地址。
要连接到设备,我只需将 Web 浏览器指向其路由器的 WAN-IP,其余的工作由端口转发完成。设备的 Syslog 消息(传出)经过 NAT 处理,看起来好像来自 3 个路由器。
唯一的缺点是,要重新配置 D-Links,我需要将一台 PC 连接到每个路由器的 LAN 端,这样我才能进入路由器的基于 Web 的管理界面。(D-link 实际上可以在 WAN 端运行其管理界面,但据我所知,只能在端口 80 上运行,这会干扰端口转发。)
答案2
由于所有设备都具有相同的真实 IP,因此您需要执行某种屏蔽或静态 NAT。
一个解决方案是将每个设备(交换机端口)放在单独的 VLAN 上并在网络之间路由。交换机需要能够在每个端口上执行静态 nat。
另一个解决方案可能是让一个端口上的 Linux 机器成为所有 VLAN 的成员,并利用虚拟 IP 并在 Linux 中执行路由/nat 部分。Iptables 可以执行 NAT。
答案3
如果固定 IP 地址与您所在网段的有效主机不重叠,我会简单地将它们插入并在运行管理软件的主机上为它们设置虚假地址。只需向特定设备的 mac 地址添加静态 arp 条目,现在您就可以让它们在网段上“使用”不同的地址。
我认为这是一种黑客行为,但既然你暗示了无法直接解决问题的其他原因,那么这可能就合适了。
答案4
我相信有一个比这里提出的解决方案更简单的解决方案。
要求:您的设备、1 台交换机(支持 VLAN 中继和访问,为简单起见我假设是思科)、1 台 Linux PC。我假设这些设备所连接的 IP 地址无关紧要(如果重要,这会变得更加“有趣”)。
我假设目标设备都运行在静态 10.0.0.2,网关 10.0.0.1,掩码 255.255.255.0(请参阅此处的另一个答案)。
在交换机上将端口 1 连接到第一个设备:
interface Gi0/1
switchport mode access
switchport access vlan 10
在交换机上将端口 2 连接到第二个设备:
interface Gi0/2
switchport mode access
switchport access vlan 20
在交换机上,将端口 3 连接到将控制以下内容的 PC:
interface Gi0/2
switchport mode trunk
switchport trunk allowed vlan 10,20
现在我们已经有了链路层分离,但遗憾的是这并没有就此结束。
在您的 Linux PC 上,设置 2 个虚拟接口。下面包含执行此操作的具体命令。
eth0.10 IP地址 10.0.10.1 255.255.255.0 eth0.20 IP地址 10.0.20.1 255.255.255.0
现在到了好玩的地方,非常有趣。虚拟 NIC、VRF、iptables 和大量路由!
# First create 2 vrf for both devices
ip link add device1 type vrf table 1
ip link add device2 type vrf table 2
ip link set dev vrfdevice1 up
ip link set dev vrfdevice2 up
# Second, create vlan device
ip link add link eth0 name eth0.10 type vlan id 10
ip link add link eth0 name eth0.20 type vlan id 20
# Add the vlan to the correct vrf
ip link set eth0.10 master vrfdevice1
ip link set eth0.20 master vrfdevice2
# Assign them proper IP address (unique)
ip addr add 10.0.10.1/24 dev eth0.10
ip addr add 10.0.20.1/24 dev eth0.20
# Add the route in the **normal** route table to these devices (so normal kernel can work with it)
ip route add 10.0.10.0/24 dev eth0.10
ip route add 10.0.20.0/24 dev eth0.20
# Add the route to the targets on both VRF
ip route add 10.0.0.0/24 dev eth0.10 table 1
ip route add 10.0.0.0/24 dev eth0.20 table 2
# Verify your routes in the tables!
ip -br route show table 1
10.0.0.0/24 dev eth0.10 scope link
10.0.10.0/24 dev eth0.10 proto kernel scope link src 10.0.10.1
ip -br route show table 2
10.0.0.0/24 dev eth0.20 scope link
10.0.20.0/24 dev eth0.20 proto kernel scope link src 10.0.20.1
现在真实的有趣,ip 表!
iptables -t nat -A OUTPUT --destination 10.0.10.2 -j DNAT --to-destination 10.0.0.2 --out-interface vrfdevice1
iptables -t nat -A OUTPUT --destination 10.0.20.2 -j DNAT --to-destination 10.0.0.2 --out-interface vrfdevice2
就是这样!我想。我已经用 wireshark 验证了它有效...
给出的命令:telnet 10.0.10.2
Wireshark 输出:ARP:谁有 10.0.0.2?告诉 10.0.10.1
再次:telnet 10.0.20.2
Wireshark 输出:ARP:谁有 10.0.0.2?告诉 10.0.20.2
这是一个相当艰巨的任务,如果其中任何一项对您有帮助,请告诉我并点赞。我们实际上不需要很多昂贵的路由器,VRF 可以解决大部分问题,尤其是与虚拟接口结合使用时!有趣的是,现在所有这些都可以在 Linux 中运行,很酷的东西