如何将所有流量转发至目标服务器 配置S作为M的反向代理访问方案
解决方案
方案1:iptables 端口转发(四层转发,适配所有TCP流量场景)
你之前配置失败大概率是漏了内核转发开启或源地址转换步骤,完整配置流程如下:
前置准备
- 替换下文
S_IP为服务器S的公网IP,M_IP为服务器M的公网/内网互通IP - 服务器S需要开放80、443、6789三个端口的入站规则
配置步骤
- 开启S的内核IP转发功能
编辑/etc/sysctl.conf文件,将net.ipv4.ip_forward参数值改为1,保存后执行sysctl -p生效 - 配置目的地址转换(DNAT),将S收到的流量转发到M
# 80端口转发 iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination M_IP:80 # 443端口转发 iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination M_IP:443 # 6789 websocket端口转发 iptables -t nat -A PREROUTING -p tcp --dport 6789 -j DNAT --to-destination M_IP:6789 - 配置源地址转换(SNAT),让M返回的流量通过S回传给用户(绝大多数配置失败都是漏了这一步)
iptables -t nat -A POSTROUTING -p tcp -d M_IP --dport 80 -j SNAT --to-source S_IP iptables -t nat -A POSTROUTING -p tcp -d M_IP --dport 443 -j SNAT --to-source S_IP iptables -t nat -A POSTROUTING -p tcp -d M_IP --dport 6789 -j SNAT --to-source S_IP - 放行转发流量规则
iptables -A FORWARD -p tcp -d M_IP --dport 80 -j ACCEPT iptables -A FORWARD -p tcp -s M_IP --sport 80 -j ACCEPT iptables -A FORWARD -p tcp -d M_IP --dport 443 -j ACCEPT iptables -A FORWARD -p tcp -s M_IP --sport 443 -j ACCEPT iptables -A FORWARD -p tcp -d M_IP --dport 6789 -j ACCEPT iptables -A FORWARD -p tcp -s M_IP --sport 6789 -j ACCEPT - 保存规则,不同系统命令不同:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 - CentOS/RHEL:
service iptables save
- Debian/Ubuntu:
方案2:Nginx 反向代理(七层转发,对websocket支持更好,方便后续加日志、限流等扩展配置)
配置更简单,出错概率更低,适合需要处理应用层流量的场景:
- 在服务器S上安装Nginx
- 新建配置文件
/etc/nginx/conf.d/proxy.conf,填入以下内容,按需替换参数:# 80端口转发配置 server { listen 80; server_name 你的域名; # 无域名可留空 location / { proxy_pass http://M_IP:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } # 443端口转发配置(证书部署在S侧的场景,若要透传SSL到M可直接用stream模块转发) server { listen 443 ssl; server_name 你的域名; ssl_certificate 你的SSL证书路径; ssl_certificate_key 你的SSL私钥路径; location / { proxy_pass https://M_IP:443; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } # 6789 websocket端口配置 server { listen 6789; location / { proxy_pass http://M_IP:6789; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 300s; # 长连接超时时间可按需调整 proxy_send_timeout 300s; proxy_read_timeout 300s; } } - 执行
nginx -t检查配置是否正确,无误后执行nginx -s reload生效即可。
内容的提问来源于stack exchange,提问作者Admia
相关产品推荐
相关产品推荐

