我正在尝试在使用socks5代理的同时设置proxy_pass。我可以使用以下命令使用curl访问我的后备服务:
curl -x socks5h://localhost:8001 -svo /dev/null -I http://[abcd:1234::]:8000因此,我目前在nginx配置中得到的不起作用的是:
location / {
proxy_pass http://[abcd:1234::]:8000
proxy_redirect http://localhost:8001 /;
}nginx似乎也没有其他应用程序可以使用的ALL_PROXY|HTTP(S)_PROXY环境变量的概念。
你知道我怎么才能让它工作吗?
我确实发现了一个相关的问题- socks5 proxy/tunnel for nginx upstream?,但它已经有6年的历史了,我不确定它还能不能用。
发布于 2021-08-26 11:37:14
为什么不工作?
据我所知,ngx_http_proxy_module中的proxy_pass、proxy_redirect和其他功能只是作为一个HTTP/HTTPS代理。这似乎得到了“作为协议,可以指定”http“或”https“的确认。”proxy_pass documentation中的注释(没有提到SOCKS)。
proxy_pass指令允许您告诉NGINX接受它在特定位置接收的任何请求,并盲目地将它们发送到另一个HTTP服务器,等待来自该服务器的响应,并将响应返回给客户端。模块中的其他指令(例如proxy_redirect)允许对请求/响应进行细微的修改。重要的是,整个过程非常简单,并且没有隧道(除了位置为https时的TLS )或包装在额外的协议中。
相反,SOCKS代理需要实现SOCKS proxy protocol并使用它包装所有连接。这项额外的工作不能使用ngx_http_proxy_module执行。
如何让它工作?
不幸的是,在NGINX中使用SOCKS代理似乎不被任何核心模块支持(在“模块参考”下面列出了here )。它似乎也不是一个流行的用例,所以我预计NGINX核心不会很快支持它。在another question中,你链接的一个答案引用了一个同样是listed on the nginx.com website的third party nginx module (列表中没有锚点,所以按CTRL键+F表示"SOCKS“,你会找到它)。最后一次提交是在2016年,但它可能仍然有效。
如果你不能改变你访问后端服务的方式,我会说你最好的选择是使用上面提到的模块,如果它不起作用,试着修复它,或者编写你自己的模块。或者,您可以通过SOCKS代理建立到后端服务的端口转发,然后只使用proxy_pass到您的本地端口。如果您的后端服务主机上运行着一台ssh服务器,则可以设置一个简单的概念验证,如下所示:
ssh <YOUR-SSH-LOGIN>@<BACKEND-HOST> \
-L 8081:localhost:80 \
-o "ProxyCommand=nc -X 5 -x <YOUR-SOCKS-PROXY-IP>:<YOUR-SOCKS-PROXY-PORT> %h %p"-L参数在您的本地8081端口和后端主机上的端口80 (http)之间创建端口转发。-o参数添加了一个ProxyCommand选项,该选项使用netcat通过SOCKS代理转发流量(并不是所有的netcat版本都支持-X和-x参数,我使用的是Arch Linux上的openbsd-netcat )。使用该命令后,您应该能够在NGINX中将proxy_pass连接到localhost:8081。此设置的性能不是很好,仅用作概念验证,如果您决定这样做,您应该找到另一种通过代理转发端口的方法。
最后,在我个人看来,如果可以的话,你应该改变你访问后端服务的方式。如果您是设置连接的人,那么当您所要做的只是连接到几台主机时,SOCKS代理就有点过分了。如果它是由您的公司或您上面的人设置的代理,那么我会与网络管理员讨论它。
https://stackoverflow.com/questions/68884353
复制相似问题