说到Linux下的端口转发,很多人第一反应是装个nginx或者用socat之类的东西。但其实,系统自带的iptables就能把这事儿干得漂漂亮亮的,而且性能损耗极低。今天就聊聊怎么用iptables做端口转发,从最基础的安装配置到规则保存,一步不落。

1. 确保iptables已安装
先确认一下系统里有没有iptables。大部分Linux发行版默认都带了,如果没有,装一下也很简单:
sudo apt-get update
sudo apt-get install iptables
2. 启用IP转发
Linux内核默认是关掉IP转发这个功能的——毕竟普通电脑不需要当路由器。要打开它,需要修改一个内核参数。
编辑 /etc/sysctl.conf 文件:
sudo nano /etc/sysctl.conf
找到这一行,把注释去掉,值改成1:
net.ipv4.ip_forward=1
保存退出后,让配置立即生效:
sudo sysctl -p
3. 配置iptables规则
假设你要把外部端口8080上的流量,转发到内网一台服务器的80端口。这就需要在NAT表里加两条规则。
3.1 添加PREROUTING规则
这条规则告诉iptables:凡是目标端口是8080的TCP包,通通改掉目标地址,扔给内网的192.168.1.100:80。
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
3.2 添加POSTROUTING规则
光改目标地址还不够,回包还得知道从哪回来。所以需要加一条MASQUERADE(伪装)规则,让数据包看起来就像是从这台路由器本身发出去的。
sudo iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j MASQUERADE
4. 保存iptables规则
重启之后规则就没了,这可是个坑。得把它们存起来。
4.1 用iptables-persistent(Debian/Ubuntu)
装一个工具就能自动保存:
sudo apt-get install iptables-persistent
安装过程中会问你“是否保存当前规则”,选“是”就行。
4.2 手动保存规则
如果不想多装东西,直接手动导出也行:
sudo sh -c "iptables-sa ve > /etc/iptables/rules.v4"
5. 验证端口转发
规则配好之后,拿telnet或者curl试试看:
telnet your-router-ip 8080
或者
curl http://your-router-ip:8080
要是能看到内网服务器的响应,说明成了。
注意事项
- 别忘了检查防火墙有没有拦住这些流量——规则生效的前提是包能进来。
- 如果你用的是云服务器,光配iptables还不够,云控制台的安全组也得放行对应端口。
- 定期看看iptables规则列表,确保没有莫名其妙的多余规则,安全这事不能偷懒。
按上面这些步骤走下来,iptables端口转发基本就稳了。下次再遇到类似需求,完全可以抛弃那些花里胡哨的方案,内核原生能力往往才是最靠谱的。