如何用iptables实现端口转发
利用iptables实现端口转发,可通过DNAT将流量导向目标端口,必要时配合MASQUERADE确保回包可达。还可用SSH隧道临时映射。删除规则需将-A改为-D并保持参数一致。操作需root权限,规则默认不持久化,需注意防火墙和IP转发配置。
说到用 iptables 做端口转发,很多刚接触 Linux 网络管理的朋友可能会觉得有点绕。其实说白了,这就是把流向某个端口的流量,偷偷“转个弯”送到另一个端口或者另一台机器上。下面几个典型场景,基本覆盖了日常工作中最常用的配置方式。

基本端口转发
先看一个最直接的例子:你想把本地主机的 8080 端口收到的请求,全部转发到另一台服务器的 80 端口。怎么做?一条规则就够了:
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination <目标服务器IP>:80
这条命令的意思是:在 NAT 表的 PREROUTING 链上,把目标端口是 8080 的 TCP 包,目标地址和端口换成那台服务器的 IP 和 80 端口。数据包到了之后,服务器就会认为它是发给自己的。
反向端口转发
但如果外部访问你本地主机的 8080 端口,你还希望流量真正能到达目标服务器,光有 DNAT 还不够——因为回复包可能走不通。这时候需要再加一条 SNAT(源地址转换),让目标服务器认为流量就是来自你本地主机:
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination <目标服务器IP>:80
sudo iptables -t nat -A POSTROUTING -p tcp -d <目标服务器IP> --dport 80 -j MASQUERADE
第二条命令中的 MASQUERADE 会自动替换源地址为你本地主机的出口 IP,这样目标服务器回复时就能正确回到你这里,再原路返回给客户端。
本地端口转发
有时候你并不想在本地主机上直接改 iptables 规则,而是想通过 SSH 隧道做一个临时转发。比如把远程某台服务器的 80 端口映射到本地的 8080 端口:
ssh -L 8080:<目标服务器IP>:80 <用户名>@<远程服务器IP>
这种方式的好处是不需要 root 权限,适合快速调试或者临时访问内网服务。缺点嘛,SSH 会话一旦断开,隧道也就没了。
通用端口转发
如果你需要把本地任意端口转发到另一台服务器的任意端口,其实把上面的例子泛化一下就行了:
sudo iptables -t nat -A PREROUTING -p tcp --dport <本地端口> -j DNAT --to-destination <目标服务器IP>:<目标端口>
sudo iptables -t nat -A POSTROUTING -p tcp -d <目标服务器IP> --dport <目标端口> -j MASQUERADE
把 本地端口、目标服务器IP 和 目标端口 换成你实际的值就 OK 了。这个模板在负载均衡或者服务迁移场景里特别实用。
删除端口转发规则
规则加错了或者不用了,怎么删?把 -A 改成 -D,其他参数原样复制即可:
sudo iptables -t nat -D PREROUTING -p tcp --dport 8080 -j DNAT --to-destination <目标服务器IP>:80
sudo iptables -t nat -D POSTROUTING -p tcp -d <目标服务器IP> --dport 80 -j MASQUERADE
注意:删除时参数必须和添加时完全一致,包括 --dport 的顺序,否则会提示找不到规则。
注意事项
- 权限:修改 iptables 规则需要 root 权限,别忘了加
sudo,否则会报错“Permission denied”。 - 持久化:iptables 规则默认只在内存中生效,重启后就会消失。想让它重启后还在,可以用
iptables-persistent工具保存规则。Debian/Ubuntu 上装一下这个包,然后netfilter-persistent sa ve就行了。 - 防火墙:如果你的系统本身有防火墙(比如 ufw、firewalld),记得确认对应端口没有被拦截。另外,目标服务器上的防火墙也要放行转发的端口。
- 网络配置:目标服务器必须能够正常接收并处理转发过来的流量,包括路由可达、服务监听等。如果目标服务器和本地主机不在同一个网段,可能还需要检查路由表或开启 IP 转发(
net.ipv4.ip_forward=1)。
掌握了上面这几组规则,日常工作中绝大部分端口转发需求都能搞定。总之一句话:先想清楚流量要“从哪进、往哪转、从哪出”,然后对应选择 DNAT、MASQUERADE 或者 SSH 隧道,思路就清晰了。


































