我logging所有访问我的网站,如date,请求的url和IP地址。 我今天从“10.xxx”格式的“内部”IP中获得了一些条目。无论这是谁,访问了我网站上的几个链接,我无法确切知道这个“连接”在做什么。 我真的想问,他们是如何欺骗他们的知识产权的,“这个连接”的意图可能是“什么”,如果他们使用的是内部知识产权,他们如何从我的网站收到任何数据? 我希望这些问题不要太模糊。
谢谢
由于您的服务器“通过nginx代理请求到apache”,您可能会看到代理服务器的内部IP地址(尽pipe您通常会在所有请求中看到),而不是客户端的IP地址。
如果您的代理服务器添加了一个包含原始IP地址的标头,并且您的应用程序logging了该标头,则需要确保代理服务器实际上将该标头中的IP地址replace为已存在的标头。
例如,在客户端也在设置相同头部的代理的情况下,即,
client with internal-IP \__ client-proxy sets "X-forwarded-for: internal-IP" \__ (internet) \__ your nginx proxy passes unmodified "X-forwarded-for: internal-IP" \__ PHP reads the internal-IP
你需要什么地方:
client with internal-IP \__ client-proxy sets "X-forwarded-for: internal-IP" \__ (internet) \__ your nginx proxy sets a replacement "X-forwarded-for: public-IP-of-client-proxy" \__ PHP reads the public-IP-of-client-proxy
也可能是nginx将public-IP-of-client-proxy到现有的头文件中,并且需要检查代码以了解它将如何处理多个值。
回应你的评论:
你的PHP代码如下:
function get_ip_address() { foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) { if (array_key_exists($key, $_SERVER) === true) { foreach (explode(',', $_SERVER[$key]) as $ip) { if (filter_var($ip, FILTER_VALIDATE_IP) !== false) { return $ip; } } } } }
该代码检查一些不同的(潜在的)头,并返回包含有效IP地址的第一个头,如果不存在这样的头,它将返回包含客户IP地址的服务器variables$_SERVER[REMOTE_ADDR]检测到Apache。
如果是反向代理, $_SERVER[REMOTE_ADDR]将始终是您的代理的IP地址,因此可能不会告诉您您想知道的内容。
一个相当常见的事情是指示你的反向代理设置一个包含代理检测到的客户端IP地址的头部。
在你的nginxconfiguration中,看起来像这样:
location /some/path/ { proxy_set_header FORWARDED_FOR $remote_addr; proxy_pass http://apache.example.com:8000/some/path; }
与mod_php的Apache将使_SERVER[HTTP_FORWARDED_FOR]标题可用,你去:你的代码检测到客户端的正确的远程IP地址。
除非你的代码崩溃,如果另一个头,你的代码中有优先权,已经设置。 IE当用自定义标题CLIENT_IP: <some-ip>的客户端请求被你的代码parsing时,那就是你的PHP函数会检测到的IP地址,而不是实际的客户端IP地址。
testing例如: curl -H "CLIENT_IP: 10.0.0.0" http://yoursite.example.com/
解决scheme:在你的代码中,只接受你在nginx中设置的实际头文件,或者用nginx来取消或覆盖你的代码正在寻找的所有可能的头文件。