使用Caddy服务器和reverse_proxy
服务器,如下所示:
my.domain.com {
reverse_proxy * unix//path/to/socket
}
我可以很容易地访问我的请求头,在Python/Flask中执行以下操作:
request.headers.get('X-Forwarded-For')
它根据请求返回一个值列表。文档规定第一个值是我所依赖的客户端IP,但我最近发现这个值可能被欺骗,如下所示:
# Using Python requests
requests.get('https://my.domain.com', headers={'X-Forwarded-For': 'www.google.com'})
在这种情况下,标头值为:
X-Forwarded-For: www.google.com, xxx.xxx.xxx.xxx
(xxx.xxx.xxx.xxx在这种情况下是我的有效IP(。
我的问题是:在排除任何欺骗的情况下,我如何确定地检索客户端的IP?
详细信息:
我在Flask中测试了以下标题,使用我上面的Caddy配置,这些标题都设置为None:
Remote Addr: 0.0.0.0
X-Forwarded-For: www.google.com, xxx.xxx.xxx.xxx
Remote-Addr: None
Client-Ip: None
X-Forwarded: None
X-Cluster-Client-Ip: None
Forwarded-For: None
Forwarded: None
如维基百科所述,X-Forwarded-For
的通用格式为:
X-Forwarded-For: client, proxy1, proxy2
其中,该值是一个以逗号+空格分隔的IP地址列表,最左边是原始客户端,传递请求的每个连续代理都添加了接收请求的IP地址。
在本例中,请求通过proxy1、proxy2,然后是caddy(未在标头中显示(caddy显示为请求的远程地址。
由于伪造X-Forwarded-For字段很容易,因此应谨慎使用给定的信息。最右边的IP地址始终是连接到最后一个代理的IP地址,这意味着它是最可靠的信息源。
简而言之:选择最后一个值!