我尝试使用代理协议在Google容器上设置nginx入口(节点端口),以便可以将真实IP转发到后端服务,但最终报头损坏。
2017/02/05 13:48:52 [error] 18#18: *2 broken header: "?????~??]H?k??m[|????I??iv.?{y??Z ??v??q???2Iu4P?z;? o$?s????"???+?/?,?0??????/" while reading PROXY protocol, client: 10.50.0.1, server: 0.0.0.0:443
Run Code Online (Sandbox Code Playgroud)
如果没有代理协议,一切都会很好。根据https://blog.mythic-beasts.com/2016/05/09/proxy-protocol-nginx-broken-header/,这是由于使用了v2协议(二进制),但是nginx只能说v1 。有什么建议吗?
当在网络负载均衡器后面运行套接字服务器时,实例由 IP 指定,...
server_sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=socket.IPPROTO_TCP)
server_sock.setblocking(False)
server_sock.bind(('', port))
server_sock.listen(socket.IPPROTO_TCP)
loop = asyncio.get_event_loop()
sock, adddress = await loop.sock_accept(server_sock)
Run Code Online (Sandbox Code Playgroud)
... 然后...
print(adddress)
Run Code Online (Sandbox Code Playgroud)
打印网络负载均衡器本身的私有 IP。
如何确定原始客户端IP?
环境
我已经在AWS经典负载均衡器上设置了代理协议支持,如下所示,该协议将流量重定向到后端nginx(使用ModSecurity配置)实例。
一切正常,我可以从开放的互联网访问我的网站。
现在,由于我的nginx配置是在AWS User Data中完成的,因此我想在实例开始提供可通过AWS Lifecycle挂钩实现的流量之前进行一些检查。
问题
在启用代理协议之前,我曾经检查过我的nginx实例是否正常,并且ModSecurity正在通过检查403此命令的响应来工作
$ curl -ks "https://localhost/foo?username=1'%20or%20'1'%20=%20'"
Run Code Online (Sandbox Code Playgroud)
启用代理协议后,我将无法再执行此操作,因为该命令失败并出现以下错误(根据此链接预期会出现此错误)。
# curl -k https://localhost -v
* About to connect() to localhost port 443 (#0)
* Trying ::1...
* Connected to localhost (::1) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* NSS error -5938 (PR_END_OF_FILE_ERROR)
* Encountered end of file
* Closing connection 0
curl: (35) Encountered end of file
# cat …Run Code Online (Sandbox Code Playgroud)