Linux端口转发可通过五种方法实现:一、iptables PREROUTING DNAT配IP转发与FORWARD放行;二、REDIRECT本地端口重定向;三、双网卡网关式DNAT+接口限定;四、nftables替代方案;五、rinetd用户态轻量映射。

如果您在Linux系统中需要将外部网络请求转发至内网特定主机的服务端口,则需通过iptables配置NAT规则实现端口转发。以下是多种可行的配置方法:
一、使用iptables PREROUTING链配置DNAT
该方法适用于将到达本机外网接口的指定端口流量,重定向至内网目标主机的对应端口,是标准的入站端口映射方式。
1、启用IPv4转发功能:执行 echo 1 > /proc/sys/net/ipv4/ip_forward。
2、添加DNAT规则:运行 iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80。
3、允许转发流量通过FORWARD链:执行 iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT。
4、配置SNAT或MASQUERADE确保返回包正确路由:运行 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE。
二、使用iptables REDIRECT实现本地端口重定向
此方式不涉及跨主机转发,仅将发往本机某端口的TCP连接重定向至本机另一端口,常用于服务端口调整或代理拦截场景。
1、清除可能冲突的已有规则:执行 iptables -t nat -D OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080 2>/dev/null。
2、添加重定向规则:运行 iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080。
3、确保本地回环接口允许该转发:执行 iptables -t nat -I OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080。
三、结合FORWARD与DNAT实现双网卡网关式转发
当Linux主机作为双网卡网关(如eth0接外网、eth1接内网)时,必须显式放行FORWARD链并绑定接口,避免规则被默认策略丢弃。
1、确认内外网接口名称:使用 ip link show 查看并记录外网接口(如ens33)与内网接口(如ens34)。
2、设置PREROUTING DNAT规则:运行 iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 2222 -j DNAT --to-destination 192.168.2.5:22。
3、放行FORWARD链中目的为内网主机的流量:执行 iptables -A FORWARD -i ens33 -o ens34 -p tcp -d 192.168.2.5 --dport 22 -j ACCEPT。
4、放行已建立连接的返回流量:运行 iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT。
四、使用nftables替代iptables配置等效端口映射
nftables是iptables的现代替代方案,语法更简洁且规则管理更结构化,适用于较新Linux发行版(如Debian 12+、RHEL 9+)。
1、加载nf_tables内核模块:执行 modprobe nf_tables。
2、创建nat表与链:运行 nft add table ip nat && nft add chain ip nat prerouting { type nat hook prerouting priority -100\; }。
3、添加DNAT规则:执行 nft add rule ip nat prerouting tcp dport 9000 dnat to 192.168.3.20:8080。
4、启用IP转发并保存规则:运行 echo 1 > /proc/sys/net/ipv4/ip_forward && nft list ruleset > /etc/nftables.conf。
五、通过rinetd工具实现轻量级端口映射
rinetd无需修改内核参数或防火墙规则,以用户态进程运行,适合快速部署且对系统权限要求较低的场景。
1、安装rinetd:在Ubuntu/Debian上执行 apt install rinetd;在CentOS/RHEL上使用 yum install rinetd 或编译安装。
2、编辑配置文件 /etc/rinetd.conf,追加一行:0.0.0.0 8080 192.168.4.30 80。
3、重启服务:执行 systemctl restart rinetd。
4、检查监听状态:运行 netstat -tlnp | grep :8080 确认rinetd已绑定端口。

















