有一些网站,我只能从有限的机器访问,但我可以ssh进入一些这些机器(只作为一个普通用户),并使用ssh -D在本地机器上设置一个SOCKS代理,通过我可以访问这些网站。
但是,我更喜欢能够访问http://server.that.i.control/some_path/ (以某种方式保护),并通过ssh -D或其他类似的方法将其作为反向代理在server.that.i.control 。
这是可行的,最好用server.that.i.control上的apache或lighttpd?
我不知道apache或lighttpd使用SOCKS代理的方法,但是我认为这对于ssh和web服务器来说仍然是可行的。
有三台服务器。
your.server无法访问web.server或ssh到web.server的网站。 从你的服务器,你可以SSH到gateway.server 。 从gateway.server可以访问web.server上的网站。
首先,设置ssh,以便在访问先前未使用的端口(例如3000)时,通过ssh将stream量发送到gateway.server ,然后通过与web.server上的端口80(或任何相关端口)的正常连接。
[your.server]$ ssh -fnL 3000:web.server:80 gateway.server
其次,在apache中configuration代理。
<VirtualHost *:80> ServerName your.server ProxyPass /some_path http://localhost:3000 ProxyPassReverse /some_path http://localhost:3000 ProxyPassReverseCookieDomain web.server your.server ProxyPassReverseCookiePath / /some_path </VirtualHost>
现在,您应该可以访问http://您的服务器/ some_path并从http://web.server获取内容。 您可能已经完成,或者可能需要执行其他步骤。
这个设置中的潜在缺陷是当你的服务器上的apache连接到web.server时, Host头部将被设置为localhost 。 如果web.server承载多个站点,并使用Host头来决定返回哪个站点,这将无法工作。 我不知道有一种方法让Apache的mod_proxy更改主机头,而不是请求的主机( your.server )或后端服务器的主机(这得益于我们的SSH隧道是本地主机 )。 解决这个问题的方法是编辑your.server上的hosts文件,以便web.server上的站点的域名实际上指向your.server 。 假设您要访问两个站点, site1.web.server和site2.web.server 。 在/ etc / hosts中你会放
127.0.0.1 site1.web.server site2.web.server
你的apacheconfiguration会变成
<VirtualHost *:80> ServerName your.server ProxyPass /some_path http://site1.web.server:3000 ProxyPassReverse /some_path http://site1.web.server:3000 ProxyPassReverseCookieDomain site1.web.server your.server ProxyPassReverseCookiePath / /some_path ProxyPass /another_path http://site2.web.server:3000 ProxyPassReverse /another_path http://site2.web.server:3000 ProxyPassReverseCookieDomain site2.web.server your.server ProxyPassReverseCookiePath / /another_path </VirtualHost>
要确保访问您的反向代理,请查看Apache的身份validation指南 。