有一个网站我只能从几个白名单 IP 地址访问。我们将其称为 xyz.com。此外,xyz.com 仅允许通过 https 进行连接。
我还有一个 Debian 8.10 服务器,它有一个静态 IP 地址,是白名单 IP 之一,我为其设置了一个 DNS 名称。假设它是 myserver.biz。
我想要做的是连接到 myserver.biz 的某个特定部分(假设为 12345)并让其将请求转发到 xyz.com,这样它就能真正访问该网站,并且不会出现我无法创建例外的任何 SSL 问题。
我的第一次尝试是在我的服务器上使用iptables
将端口 12345 上的所有传入请求透明地转发到端口 443 上的 xyz.com 服务器的 IP 地址。即:
iptables -t nat -A PREROUTING -p tcp --dport 12345 -j DNAT --to <xyz.com's server IP>:443
iptables -t nat -a POSTROUTING -d <xyz.com's server IP> -j MASQUERADE
这几乎可以,但不太好。如果我将浏览器指向 myserver.biz:12345,它不会工作,因为 xyz.com 位于共享主机上,服务器不会像我连接到 xyz.com 一样处理我的请求。
但是,如果我编辑计算机的 hosts 文件,使 xyz.com 解析为我的服务器的静态 IP 地址,然后将浏览器指向 xyz.com:12345,它会可以工作。因此,它帮助我完成了部分工作,但它只在我可以访问 hosts 文件的系统上工作,而我需要它在无法访问 hosts 文件的系统上工作(例如 iOS 设备)。
总而言之,我需要:
- 对 myserver.biz:12345 的请求转发到 xyz.com:443
- 转发请求的主机名指定为 xyz.com,以便 xyz'com 的服务器能够正确解析
- 转发请求的源 IP 地址是我的白名单服务器的 IP 地址
有什么方法可以实现这个目的吗?
更新:
我一直在尝试nginx
这样做,虽然我设法让我的服务器转发到各种不同的网站,但我无法让它与我需要的网站一起工作!它始终产生“502:坏网关”。我不确定出了什么问题。
更新 #2:
我设法使nginx
大部分功能正常运行。诀窍是将其更新为最新的稳定版本并包含proxy_ssl_server_name on;
在我的服务器定义中。但是,现在存在一个问题,即 xyz.com 上的某些图像无法加载,并显示 403 状态。
看来 403 是由于服务器试图阻止热链接。目前还不清楚如何解决这个问题...
答案1
我已设法使用反向代理使其正常工作,具体来说nginx
。经过一些实验后,我发现我需要做的是使用 SSL 证书进行设置,然后使用它的proxy_pass
功能转发到我想要的网站。我的配置的最简单版本(不包括 SSL 部分)是:
server {
listen 12345;
proxy_ssl_server_name on;
location /some_path/ {
proxy_pass https://example.com/;
proxy_set_header Referer "https://example.com";
}
}
我使用前半部分建立了一个自签名证书本教程。必须包含,proxy_ssl_server_name on;
因为如果不这样做,nginx
将会失败并出现502: Bad Gateway
错误。