如何从带DDoS防护的服务器代理流量至源服务器并保留客户端IP?
如何从带DDoS防护的服务器代理流量至源服务器并保留客户端IP?
嘿,你的需求我太懂了——用带DDoS防护的Server B当流量入口,转发到没防护的Server A,还得让Server A能拿到真实的客户端IP,现在用NGINX TCP流总觉得麻烦,想找更简单高效的路子对吧?
我给你推荐两个比现有方案更清爽、性能也更优的选择:
1. 首选:用HAProxy做四层代理(最简洁高效)
HAProxy天生就是为代理场景设计的,做四层TCP代理的配置比NGINX简单太多,性能损耗也极低,完全适配你的需求。
具体配置示例(Server B上的HAProxy)
编辑HAProxy的主配置文件(一般是/etc/haproxy/haproxy.cfg),添加以下片段:
frontend public_ports bind *:80 bind *:443 mode tcp default_backend server_a backend server_a mode tcp # 开启PROXY协议,把真实客户端IP传递给Server A server origin_server <Server_A_IP>:80 send-proxy server origin_server_ssl <Server_A_IP>:443 send-proxy
配套Server A的配置(以NGINX为例)
你需要让Server A的NGINX支持接收PROXY协议,这样才能拿到真实IP,修改NGINX的监听配置:
# 原来的listen 80;改成下面的 listen 80 proxy_protocol; # 443同理 listen 443 ssl proxy_protocol; # 然后可以在日志里记录真实IP,比如把log_format里的$remote_addr换成$proxy_protocol_addr log_format main '$proxy_protocol_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
这样配置好之后,HAProxy会自动把客户端的真实IP通过PROXY协议传给Server A,Server A就能直接拿到,整个配置流程比你之前的复杂TCP流设置简单太多。
2. 简化版NGINX方案(如果不想换HAProxy)
其实你完全不用搞复杂的TCP流配置,NGINX的stream模块配合PROXY协议就能轻松搞定,配置比你现在的方案清爽很多。
Server B上的NGINX stream配置
在NGINX的配置里添加stream块:
stream { server { listen 80; proxy_pass <Server_A_IP>:80; # 开启PROXY协议传递真实IP proxy_protocol on; } server { listen 443; proxy_pass <Server_A_IP>:443; proxy_protocol on; } }
同样需要Server A的NGINX支持PROXY协议
和上面HAProxy方案里的Server A配置一样,把listen指令加上proxy_protocol参数,日志也换成用$proxy_protocol_addr记录真实IP。
为什么这两个方案比你现在的好?
- 配置更直观:没有复杂的TCP流转发逻辑,都是代理场景的原生配置,维护起来特别轻松
- 性能损耗更低:HAProxy和优化后的NGINX stream都是专门为代理优化的,比自定义的复杂TCP流实现效率高很多
- 可靠性更强:PROXY协议是行业标准的IP传递方式,比自己折腾的方案稳定
最后提醒一句:不管用哪个方案,都要确保Server B的DDoS防护规则已经正确配置,把80/443端口的正常流量放行,同时拦截恶意攻击流量哦。
备注:内容来源于stack exchange,提问作者Andrei
相关产品推荐
相关产品推荐

