-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
nginx 的透明代理实现 #142
Comments
up |
不知有没有试过让 listen 的 socket 也开启 IP_TRANSPARENT,用来获取请求的原始目标 IP? 例如 DNS 负载均衡的场合,一个域名对应多个 IP。直接 proxy_pass $host 相当于要再次做域名解析了,没法直接用客户端请求的真实目标 IP。 |
您好! 我看许多都是下面这样做法, |
作者您好,我的代理服务器和上游服务器是直连的,上游没有配置默认网关的情况下,在代理服务器上抓包也能抓到上游响应的包,按照上述配置后响应流量似乎并没有正常引入到nginx,最终nginx向客户端响应504 Gateway Time-out,这是怎么一回事呢 |
概述
作为代理服务器,把客户端真实ip传递到后端有时候是需要的。
Haproxy作者设计了代理协议、在7层http协议又可以通过header头传递。详细请看《nginx的proxy protocol实现》。而在Linux 2.6.24以后,socket增加了一个选项IP_TRANSPARENT可以接受目的地址没有配置的数据包,也可以发送原地址不是本地地址的数据包。可以通过该特性实现4层以上的透明代理。注意:需要设置路由。
代码实现
nginx通过指令
proxy_bind $remote_addr transparent;
让代理服务器绑定真实的客户端ip向上游发起请求连接。指令解析
nginx 在http模块和stream均支持该指令,逻辑基本相似。来看下stream模块的指令解析。
请求处理
配置
# route del default gw 10.0.2.2 route add default gw 172.16.0.1
总结
nginx在1.11 以后的版本中,在proxy_bind 指令支持了transparent参数。支持上游发起连接的ip地址为非本地地址。
通过配置$remote_addr 取得客户端的真实ip并配置transparent参数,nginx向上游发起连接的源地址就成为真实客户端IP了。
因该IP并不在本机配置,上游服务器需要配置路由,把代理服务器作为默认网关。并需要把上游回来的包引导到nginx进程上,需要配置iptables规则。
参考:https://www.nginx.com/blog/ip-transparency-direct-server-return-nginx-plus-transparent-proxy/
http://www.fairysoftware.com/tproxy_tou_ming_dai_li.html
The text was updated successfully, but these errors were encountered: