在实现正常的TCP/IP 双方通信情况下,是无法伪造来源 IP 的,也就是说,在 TCP/IP 协议中,可以伪造数据包来源 IP ,但这会让发送出去的数据包有去无回,无法实现正常的通信。这就像我们给对方写信时,如果写出错误的发信人地址,而收信人按信封上的发信人地址回信时,原发信人是无法收到回信的。一些DDoS 攻击,如 SYN flood,  就是利用了 TCP/ip 的此缺陷而实现攻击的。对这种行为定义为“发射出去就不管”。

HTTP 是一个应用层协议,基于请求 / 响应模型。客户端(往往是浏览器)请求与服务器端响应一一对应。请求头均以回车换行结束,即“\r\n   最后是一个空行(内容为 \r\n  , 表示请求 header 结束。而请求 header 中除第一行外,其它行均由 header 名称, header 值组成, 在HTTP 应用程序中,如何取得指定的请求 header 信息呢?这里使用 PHP 语言为例说明。对所有客户端请求 header, PHP 程序中取得其值的方式如下: 

$_SERVER[‘HTTP_ HEADER_NAME ‘]

HEADER_NAME应该以换成对应的 header 名称,此项的规律是:全大写,连接线变成下划线。比如要取得客户端的User-Agent 请求头,则使用 $_SERVER[‘HTTP_USER_AGENT’],  掌握这个规律,即可达到举一反三的效果。如要取得 COOKIE 信息,则使用 $_SERVER[‘HTTP_COOKIE’] 即可。也就是说, $_SERVER 数组中,以 HTTP开头的项均属于客户端发出的信息。

 为防止http客户端伪造ip, 服务器重新配置X-Forward-For 为正确的值。以nginx为例

……
fastcgi_param HTTP_X_FORWARDED_FOR $remote_addr;
include  fastcgi_params;
……

如果网站做了cdn, 或是用作其它代理,那与代理层协商真实ip变量名,以在程序作出相应处理