基于接收IP的Linux路由器端口转发配置可行性问询
基于接收IP的Linux路由器端口转发配置可行性问询
当然可以实现!这种基于目标IP地址的端口转发正好匹配你的需求——毕竟外部设备只能指定IP和固定的502 Modbus端口,没法改端口来区分设备。在Linux路由器上用iptables就能轻松搞定,下面是具体的配置步骤:
前提:开启IP转发
首先要确保路由器允许IP转发,这是NAT转发的基础:
- 临时生效(重启后失效):
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效(重启后依然有效):
编辑/etc/sysctl.conf文件,找到net.ipv4.ip_forward这一行,把注释去掉并设为1:
然后执行命令让配置生效:net.ipv4.ip_forward=1sysctl -p
配置DNAT(目标地址转换)规则
这一步是把外部发往Eth0特定IP的502端口请求,转发到Eth1侧的对应内部设备:
- 转发
192.168.0.1:502到30.0.0.1:502:iptables -t nat -A PREROUTING -d 192.168.0.1 -p tcp --dport 502 -j DNAT --to-destination 30.0.0.1:502 - 转发
192.168.0.2:502到30.0.0.2:502:iptables -t nat -A PREROUTING -d 192.168.0.2 -p tcp --dport 502 -j DNAT --to-destination 30.0.0.2:502
配置SNAT(源地址转换)规则
这一步是让内部设备的响应能正确回传给外部设备——因为内部设备的网关是路由器的Eth1接口(30.0.0.10),需要把响应的源地址替换成路由器对应的Eth0 IP,这样外部设备才能识别:
- 把
30.0.0.1的响应源地址替换为192.168.0.1:iptables -t nat -A POSTROUTING -s 30.0.0.1 -p tcp --sport 502 -j SNAT --to-source 192.168.0.1 - 把
30.0.0.2的响应源地址替换为192.168.0.2:iptables -t nat -A POSTROUTING -s 30.0.0.2 -p tcp --sport 502 -j SNAT --to-source 192.168.0.2
规则持久化(可选)
如果希望路由器重启后这些规则依然生效,可以保存iptables配置:
- Debian/Ubuntu系统:
iptables-save > /etc/iptables/rules.v4 - CentOS/RHEL系统:
service iptables save
适配多单元场景
针对你提到的多个相同配置的单元,只需要给每个单元的路由器Eth0分配一组不重复的IP(比如单元2用192.168.0.3和192.168.0.4),然后复制上述配置替换对应IP即可。外部设备就能通过不同的IP访问每个单元的Device 1和Device 2了。
备注:内容来源于stack exchange,提问作者Scoobler




