HTTP端口转发是Web运维中的常见需求,比如把80端口的请求转到8080端口,或者把公网请求转发到内网的Web服务器。Linux下有多种方式可以实现,本文介绍几种最实用的方法。
简单说就是:访问A服务器的某个HTTP端口,实际由B服务器的Web服务处理。典型的应用场景:
服务器只有一个公网IP,但需要对外提供多个Web服务(通过不同端口区分)
内网有多个Web服务器,想通过一台前置服务器统一对外暴露
临时将流量导向备用服务器,实现平滑切换
iptables工作在内核层,性能最高,适合生产环境。
# 开启IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward # 将访问8080的TCP流量重定向到80端口 iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
# DNAT:修改目标地址 iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80 # SNAT:修改源地址,确保返回包能正确路由 iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j MASQUERADE
优点:性能最高、稳定可靠
缺点:不支持基于域名(Host头)的高级路由
Nginx是专业的Web服务器和反向代理工具,支持HTTP层面的精细控制。
# Ubuntu/Debian apt-get install nginx # CentOS/RHEL yum install nginx
编辑 /etc/nginx/sites-available/default:
server { listen 80; # 监听的端口 location / { proxy_pass http://192.168.1.100:80; # 转发目标 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
# 域名A转发到服务器A server { listen 80; server_name www.example1.com; location / { proxy_pass http://192.168.1.100:80; } } # 域名B转发到服务器B server { listen 80; server_name www.example2.com; location / { proxy_pass http://192.168.1.200:80; } }
upstream backend { server 192.168.1.100:80 weight=3; server 192.168.1.101:80 weight=2; server 192.168.1.102:80 backup; # 备用服务器 } server { listen 80; location / { proxy_pass http://backend; proxy_set_header Host $host; } }
优点:支持基于域名/路径的智能转发、负载均衡、缓存、SSL卸载
缺点:性能略低于iptables
socat是一个多功能的网络工具,配置简单。
# 安装socat apt-get install socat # 将本机8080端口转发到192.168.1.100:80 socat TCP4-LISTEN:8080,fork,reuseaddr TCP4:192.168.1.100:80
优点:一条命令搞定,支持UDP/SSL等协议
缺点:不适合大规模生产环境
通过SSH建立加密隧道,适合远程调试内网Web服务。
# 将本地的8888端口,通过SSH隧道转发到远程服务器的80端口 ssh -L 8888:localhost:80 user@远程服务器IP -N # 访问 http://localhost:8888 即可看到远程服务器的Web页面
优点:SSH自带加密,安全
缺点:需要保持SSH连接,性能一般
如果你需要图形化管理端口转发规则,或者想快速搭建多节点转发架构,可以试试这款工具:
它提供Web界面,支持:
多台后端服务器的流量分发和故障转移
几分钟完成配置,无需修改原有业务
隐藏后端真实IP,提升安全性
| 方法 | 性能 | HTTP感知 | 配置难度 | 适用场景 |
|---|---|---|---|---|
| iptables | 最高 | 无 | 中等 | 纯端口转发,高性能需求 |
| Nginx | 高 | 有(域名/路径) | 简单 | 智能路由、负载均衡、HTTPS |
| socat | 中 | 无 | 最简单 | 临时测试、快速验证 |
| SSH隧道 | 低 | 无 | 简单 | 加密通道、远程调试 |
对于正式的HTTP服务转发,推荐方案:
入口层:用iptables做DNAT,做粗粒度的端口映射
应用层:用Nginx做反向代理,处理域名路由、负载均衡、SSL证书
加密需求:Nginx直接配置HTTPS,比SSH隧道更合适
举个常见组合的例子:
外网:80/443 → iptables DNAT → 内网Nginx:80/443 → 根据域名分发 → 后端Web服务器集群
这样既利用了iptables的高性能,又发挥了Nginx在应用层的灵活性。