1

在以下情况下,我试图在服务器 Y 上获取客户端 IP,

客户端请求服务器 X,服务器 X 将请求转发到服务器 Y。

并且返回流程是Y->X->client

http标头中的'REMOTE_ADDR'(实际上我是从request.environ ['REMOTE_ADDR']获取的)具有服务器X的IP。从哪里可以获得服务器Y的客户端IP?

更新:

X有一个公共IP。Y 在专用网络中,外部无法访问。现在我在同一个专用网络中使用客户端,我通过公共网络请求 X。

我只想知道标头是否已经具有我需要的内容,而无需在 X 处操作标头以包含客户端的 ip。

4

2 回答 2

2

如果您的应用程序位于代理之后,那么在您的应用程序看来,请求的远程地址将来自代理,而不是实际的客户端。

http 规范中没有规定传递“真实”地址,但这样做的事实上的标准是让您的代理设置一个X-Forwarded-For 标头

Werkzeug 提供了一个修复程序来帮助解决这个问题, Flask 文档中有一个详细的示例,request.remote_addr应该是你所期望的

于 2013-01-16T15:04:49.560 回答
0

尽管您声称,X 基本上是一个代理,因为它根据用户提出的请求向 Y 发出自己的请求。所以它REMOTE_ADDR是 X 之一是完全有效的。

您必须在 X 的请求中添加自定义标头,例如X-Original-User-IP使用户的 IP 可用于 Y。ProxyFix如果需要,您可以使用它,它将重写X-Forwarded-ForREMOTE_ADDR

您应该确保 Y 仅对 X 可用并且不能直接访问。否则,只需发送该自定义标头即可欺骗他的 IP 地址。

于 2013-01-16T17:27:38.567 回答