一台服务器上的 http 反向代理通过 ssh/socks 代理传递到第二台服务器

一台服务器上的 http 反向代理通过 ssh/socks 代理传递到第二台服务器

有些网站我只能从有限的几台机器访问,但我可以通过 ssh 进入其中一些机器(仅作为普通用户)并ssh -D在本地机器上设置 SOCKS 代理,通过它我就可以访问这些网站。

然而,我更希望能够转到http://server.that.i.control/some_path/(以某种方式保护)并让它成为通过的反向代理ssh -D或类似的东西server.that.i.control

这是可行的吗,最好使用 apache 或 lighttpd server.that.i.control

答案1

我不知道 apache 或 lighttpd 如何使用 SOCKS 代理,但我认为只需 ssh 和 web 服务器就可以做到。

有三台服务器。

  1. 你的服务器
  2. 网关服务器
  3. 网络服务器

你的服务器无法访问网络服务器或者 ssh 到网络服务器。 从你的服务器你可以 ssh 到网关服务器。 从网关服务器您可以访问网络服务器

首先,设置 ssh,这样当访问以前未使用的端口(例如 3000)时,流量将通过 ssh 发送到网关服务器然后通过正常连接到端口 80(或任何相关端口)网络服务器

[your.server]$ ssh -fnL 3000:web.server:80 gateway.server

二、在apache中配置代理。

<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 开启时你的服务器连接到网络服务器。 如果网络服务器托管多个网站并使用主持人标头来决定返回哪个网站,这行不通。我不知道有办法让 apache 的 mod_proxy 更改主持人标头不是请求发往的主机(你的服务器)或后端服务器的主机(得益于我们的 ssh 隧道本地主机)。解决此问题的一种方法是编辑 hosts 文件你的服务器因此网络服务器实际上指向你的服务器假设你想访问两个网站,站点1.web.服务器站点2.web.服务器。 在/etc/hosts你会把

127.0.0.1 site1.web.server site2.web.server

你的 Apache 配置将更改为

<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 身份验证指南

相关内容