端口转发是Linux运维中最实用的技巧之一,能将访问某端口的流量导向另一台服务器的指定端口。本文介绍几种主流设置方法,覆盖不同场景需求。
一、准备工作:开启IP转发
所有端口转发的前提是开启Linux内核的IP转发功能:
# 临时开启(重启失效) echo 1 > /proc/sys/net/ipv4/ip_forward # 永久开启 echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
二、方法一:iptables(最推荐,性能最高)
iptables工作在内核层,是最稳定高效的方案,适合生产环境。
本机端口转发
将访问8080端口的流量转到本机的80端口:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
跨服务器转发(DNAT)
将公网IP的80端口请求,转发到内网Web服务器(192.168.1.100:80):
# 修改目标地址 iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80 # 修改源地址,确保返回包能正确路由 iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j MASQUERADE
查看已设置的规则
iptables -t nat -L -n -v --line-numbers
删除规则(假设规则编号为1)
iptables -t nat -D PREROUTING 1
保存规则(重启不丢失)
# Ubuntu/Debian apt-get install iptables-persistent iptables-save > /etc/iptables/rules.v4 # CentOS/RHEL 7+ service iptables save
三、方法二:socat(简单灵活,适合测试)
socat是一个多功能的网络工具,配置非常简单。
安装
# Ubuntu/Debian apt-get install socat # CentOS/RHEL yum install epel-release && yum install socat
基本用法
将本地8080端口转发到192.168.1.100:80:
# 单连接 socat TCP4-LISTEN:8080 TCP4:192.168.1.100:80 # 多连接(支持多个客户端,推荐) socat TCP4-LISTEN:8080,fork,reuseaddr TCP4:192.168.1.100:80
后台运行
nohup socat TCP4-LISTEN:8080,fork,reuseaddr TCP4:192.168.1.100:80 &
四、方法三:SSH隧道(加密安全,适合临时使用)
利用SSH协议建立加密通道,适合远程调试或需要安全传输的场景。
本地端口转发
访问本地的8080端口,实际访问远程服务器192.168.1.100的80端口:
ssh -L 8080:192.168.1.100:80 user@跳板机IP -N
远程端口转发
将远程服务器的端口映射到本地:
ssh -R 8080:localhost:80 user@公网服务器IP -N
动态端口转发(SOCKS5代理)
在本地1080端口开启SOCKS5代理:
ssh -D 1080 user@远程服务器IP -N
五、方法四:rinetd(轻量级专用工具)
专门用于端口转发的工具,配置文件一目了然。
安装
# Ubuntu/Debian apt-get install rinetd # 手动编译 wget http://www.boutell.com/rinetd/rinetd.tar.gz tar zxvf rinetd.tar.gz && cd rinetd make && make install
配置
编辑 /etc/rinetd.conf:
# 格式:本机IP 本机端口 目标IP 目标端口 0.0.0.0 8080 192.168.1.100 80 192.168.1.10 3306 192.168.1.100 3306
启动
rinetd -c /etc/rinetd.conf
六、方法五:systemd-socket-proxyd(系统原生)
systemd自带的代理工具,适合作为系统服务运行。
# 安装(systemd自带) # 创建转发服务 systemd-socket-proxyd 192.168.1.100:80
配置systemd服务文件 /etc/systemd/system/port-forward.service:
[Unit] Description=Port Forwarding [Service] ExecStart=/usr/lib/systemd/systemd-socket-proxyd 192.168.1.100:80
七、工具推荐:80km无痕网关(图形化管理)
如果你需要Web界面管理端口转发,或者需要多节点调度功能:
特点:
-
图形化配置,无需记忆命令行
-
支持多台后端服务器的流量分发和故障转移
-
隐藏后端真实IP,提升安全性
-
几分钟即可完成设置
八、方法对比与选择建议
| 方法 | 性能 | 配置难度 | 适用场景 |
|---|---|---|---|
| iptables | 最高 | 中等 | 生产环境、高性能需求 |
| socat | 高 | 简单 | 临时转发、协议转换 |
| SSH隧道 | 中等 | 简单 | 加密传输、远程调试 |
| rinetd | 高 | 最简单 | 快速部署、简单需求 |
| systemd-socket-proxyd | 高 | 中等 | 系统原生、开机自启 |
九、常见问题排查
1. 转发不生效
# 检查IP转发是否开启 cat /proc/sys/net/ipv4/ip_forward # 检查防火墙是否放行 iptables -L -n -v
2. 查看连接状态
# 查看监听端口 netstat -tlnp | grep 8080 # 查看连接跟踪 conntrack -L
总结
Linux端口转发设置并不复杂,核心就三步:
-
开启IP转发(
echo 1 > /proc/sys/net/ipv4/ip_forward) -
选择合适工具(生产用iptables,临时用socat,加密用SSH)
-
配置转发规则(记住DNAT改目的、SNAT改源)
根据实际需求选择最适合的方法,就能轻松实现灵活的流量调度。
