这可能非常简单,但我就是无法理解。
我设置了一个子域名,假设是nc.example.com
。设置我的 DNS 和所有内容,将子域名指向远程服务器,该服务器运行 Nginx,将请求反向代理到端口3123
。
然后,我使用 netcat 监听请求远程服务器, 像这样:
nc -l 3123
这样我就可以接收来自的 HTTP 请求nc.example.com
。
接下来,在我的本地机器之后,我使用 netcat 连接到一个不相关的服务器(Google 的公共 DNS),如下所示:
$ nc 8.8.8.8 80
GET / HTTP/1.1
Host: nc.example.com
(多加 2 个换行符以完成 HTTP 请求,但无法在此处显示)
我在我的远程服务器如下:
$ nc -l 3123
GET / HTTP/1.1
Connection: upgrade
Host: nc.example.com
X-Real-IP: <redacted_1>
X-Forwarded-Host: nc.example.com
X-Forwarded-Server: nc.example.com
X-Forwarded-For: <redacted_2>, <redacted_1>
现在,我不确定为什么会发生这种情况,因为我认为nc
将连接到8.8.8.8
,而不是我的服务器的 IP 地址。8.8.8.8
是否代表我将请求转发到我的服务器?这样做会造成任何安全隐患吗?
编辑:
我刚刚意识到这<redacted_2>
是分配给我的“家庭”网络的私有 IP 地址 ( 172.24.199.96
)(访问它会带我进入路由器的主页)。我在大学网络中执行此操作。
这是否意味着上游路由器正在根据Host
标头为我代理请求?这是可以理解的,因为我的大学最近实施了某种网络过滤,尽管没有太多细节。虽然我不明白它为什么会这样?
答案1
你的 Nginx 服务器接收连接的 IP 地址是多少从?
看起来好像有一个“透明代理”拦截了本地计算机发送的所有 HTTP 请求,并根据 Host 标头转发它们。(可能是病毒、防病毒软件、缓存代理、家长过滤器等。)
特别是因为您的 X-Forwarded-For 标头有两个 IP 地址,尽管 Nginx 应该只添加一个。
Google DNS 服务器当然不会执行这样的转发 - 它们甚至不接受端口 80 上的连接。(事实上,行为如此的“开放代理”会被广泛认为是一个安全问题......)