如何利用IPTables在DMZ环境下实现端口转发至本地其他IP?
如何利用IPTables在DMZ环境下实现端口转发至本地其他IP?
当然可以这么操作!把DMZ指向你的Linux服务器绝对是个巧妙的 workaround,完美解决路由器端口转发限制的问题。我之前也碰到过同款垃圾路由器,这套方法亲测有效,接下来一步步教你实现(以转发RDP默认3389端口到内网机器为例):
一、先开启Linux的IP转发功能
IP转发是端口转发的前提,必须先打开:
- 编辑sysctl配置文件,永久开启IP转发:
找到nano /etc/sysctl.confnet.ipv4.ip_forward=1这一行,如果前面有#注释符号,把它删掉,保存退出。 - 让配置立即生效:
(如果只是临时测试,也可以直接执行sysctl -pecho 1 > /proc/sys/net/ipv4/ip_forward,但重启服务器后会失效,建议修改配置文件做永久设置)
二、用iptables配置端口转发规则
假设你的Linux服务器内网IP是192.168.1.5,要转发的目标RDP机器内网IP是192.168.1.100,执行以下命令:
- 添加DNAT规则,把外部访问Linux的3389端口流量转发到目标机器:
iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination 192.168.1.100:3389 - 添加SNAT规则,让目标机器返回的流量能正确回到外部客户端:
iptables -t nat -A POSTROUTING -d 192.168.1.100 -p tcp --dport 3389 -j SNAT --to-source 192.168.1.5 - 确保iptables允许转发的流量通过:
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 3389 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
三、保存iptables规则,防止重启失效
不同Linux发行版保存规则的方法略有不同:
- 如果你用的是Debian/Ubuntu系列:
iptables-save > /etc/iptables/rules.v4 # 确保开机自动加载规则 systemctl enable iptables-persistent - 如果你用的是CentOS/RHEL系列:
(如果用的是firewalld,建议将这些规则导入到firewalld的自定义规则中,避免被覆盖)service iptables save
关键注意事项
- 先去路由器后台,把DMZ主机设置为你的Linux服务器的内网IP,确保外部流量能全部转发到Linux服务器上;
- 目标RDP机器要允许来自Linux服务器的3389端口连接,记得检查目标机器的本地防火墙设置;
- 如果要转发其他端口,只需要把所有命令里的
3389换成对应的端口号即可,比如转发SSH的22端口操作逻辑完全一致; - 如果你的Linux服务器装了ufw、firewalld这类上层防火墙管理工具,要确保它们不会拦截刚才添加的iptables规则,或者直接将这些规则整合到对应工具的配置里。
备注:内容来源于stack exchange,提问作者Zribe




