端口转发是Linux运维中的常用技术,能将访问某端口的流量导向另一台服务器的指定端口。本文介绍四种主流配置方法,适应不同场景需求。
无论使用哪种方法,都需要先开启Linux内核的IP转发功能:
# 临时开启(重启失效) echo 1 > /proc/sys/net/ipv4/ip_forward # 永久开启 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
适用场景:高性能生产环境、需要稳定可靠转发的场景-8
iptables是最常用的端口转发工具,工作在内核态,性能最高。
将访问8080端口的流量转发到本机80端口-8:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
将公网IP的8080端口请求转发至内网Web服务器(192.168.1.100:80)-1-4:
# 修改目标地址 iptables -t nat -A PREROUTING -p tcp --dport 8080 -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
# Ubuntu/Debian apt-get install iptables-persistent # CentOS/RHEL service iptables save
适用场景:需要灵活协议支持、测试环境-2
socat功能强大,支持TCP、UDP、SSL、Unix Socket等任意协议间的转发。
将本地8080端口转发到192.168.1.100:80-2-5:
# 单连接版本 socat TCP4-LISTEN:8080 TCP4:192.168.1.100:80 # 多连接版本(支持多个客户端,推荐) socat TCP4-LISTEN:8080,fork,reuseaddr TCP4:192.168.1.100:80
socat UDP4-LISTEN:8080,fork UDP4:192.168.1.100:80
SSH隧道利用SSH协议建立加密通道,安全性最高。
访问本地9999端口,实际访问远程服务器的8888端口-9:
ssh -g -N -L 9998:localhost:8888 user@远程服务器IP -p 22
参数说明:
-g:允许局域网其他设备访问
-N:仅做转发,不登录SSH
-L:本地端口转发
将远程服务器的端口映射到本地-3:
ssh -N -R 465:localhost:22 user@公网服务器IP
在本地1080端口开启SOCKS5代理-9:
ssh -C -N -D localhost:1080 user@远程服务器IP
适用场景:配置简单、快速部署-7
rinetd专门用于端口转发,配置极其简单。
# Ubuntu/Debian apt-get install rinetd # CentOS/RHEL wget http://www.boutell.com/rinetd/rinetd.tar.gz make && make install
编辑 /etc/rinetd.conf-7:
# 本机IP 本机端口 目标IP 目标端口 0.0.0.0 2018 103.74.192.160 2019 192.168.1.10 8080 192.168.1.100 80
pkill rinetd rinetd -c /etc/rinetd.conf
| 方法 | 性能 | 安全 | 配置难度 | 适用场景 |
|---|---|---|---|---|
| iptables | 最高 | 一般 | 中等 | 生产环境、高性能需求 |
| socat | 高 | 一般 | 简单 | 灵活协议、测试环境 |
| SSH隧道 | 中等 | 最高 | 简单 | 加密传输、临时通道 |
| rinetd | 高 | 一般 | 最简单 | 快速部署、简单需求 |
如果你在Windows或Linux上需要图形化管理端口转发规则,可以试试这款80km无痕网关:
它提供Web界面管理,支持多台后端服务器的流量分发和故障转移,几分钟即可完成设置,适合需要快速部署和可视化管理的场景。
Linux端口转发有多种实现方式,根据实际需求选择:
追求性能 → iptables内核转发
需要加密 → SSH隧道
灵活测试 → socat
快速部署 → rinetd
图形管理 → 80km无痕网关