发布于2026-07-06 阅读(0)
扫一扫,手机访问
说到用 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 的顺序,否则会提示找不到规则。
sudo,否则会报错“Permission denied”。iptables-persistent 工具保存规则。Debian/Ubuntu 上装一下这个包,然后 netfilter-persistent sa ve 就行了。net.ipv4.ip_forward=1)。掌握了上面这几组规则,日常工作中绝大部分端口转发需求都能搞定。总之一句话:先想清楚流量要“从哪进、往哪转、从哪出”,然后对应选择 DNAT、MASQUERADE 或者 SSH 隧道,思路就清晰了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8