使用curl如何欺骗发件人IP地址?

54

为了测试目的,我需要使用伪造的IP地址发出请求。最简单的方法是什么?

3个回答

86

为了满足我的需求,仅通过以下方式更改HTTP标头就足够了:

curl --header "X-Forwarded-For: 1.2.3.4" "http://www.foobar.com"

这个设置是从哪里进行的?使用浏览器控制台吗? - HybrisHelp
1
@ankit337 curl是命令行工具,与Web浏览器无关,请参见http://curl.haxx.se/。 - Luke Cousins
我认为这并不保证在所有环境中都能正常工作。首先,除非明确配置,否则Play!框架会忽略来自本地主机以外的所有来源的此标头:https://www.playframework.com/documentation/2.3.3/api/java/play/mvc/Http.RequestHeader.html#remoteAddress() - Coder Guy
7
聪明,但这个问题暗示的并不是在网络层。看起来这个技巧会让接收方误以为存在代理,但这不应该影响帧的源IP地址。这个回答用不同的方式详细阐述了相同的内容:http://stackoverflow.com/questions/16910280/curl-with-spoof-ip-address。如果你更具体地说明你想要做什么或欺骗什么,那么这个问题(及其分数)将与其他问题区别开来,想要像问题所描述的那样欺骗,就必须构建数据包,这也是大多数完成此操作的工具需要使用原始套接字的原因。 - ǝɲǝɲbρɯͽ
1
这取决于客户端和Web服务之间代理的设置。例如,在Nginx上,使用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;由于嵌入变量$proxy_add...提供的内容完美地工作,但是当使用$remote_addr时,根据我的实验结果,情况并非如此。值得一提的是,NGINX支持的嵌入变量列表及其各自的含义:nginx.org/en/docs/varindex.html 此外,X-Forwarded-For通过逗号分隔地址跟踪发出请求的跳数。 - ivanleoncz
显示剩余2条评论

46

你做不到。

通常来说,欺骗TCP协议的IP地址是非常困难的。除非你控制着一个非常接近目标或接近你伪造IP地址的路由器,否则基本上是不可能的。

回复数据包需要一条返回的路径才能完成甚至是三次握手。最可靠的方法是控制在目标和你伪造的IP地址之间最常见的路径上的路由器:这将使您能够捕获目标和伪造地址之间的数据包,并将其转发给您。

您还可以尝试注入虚假BGP路由广告,但这样做无疑会被注意到,并且当您的同行完全放弃您时,这将使您付出沉重的代价。


25
这是他所问问题的正确答案,但不是他想问问题的正确答案。 :D @sarnold - Jay
1
如果您根本不需要收到答案怎么办?比如一个只响应特定IP的API,但您并不需要答案。 - Freedo
@Freedo,正如Jacob和许多其他人指出的那样,你尝试做某事的原因很重要;今天我可能不会给出这个答案。最好提出一个新问题,并描述清楚你想要实现什么。只是一个小小的挑剔:获得答案与TCP要求双向通信不同,接收方甚至可以开始从连接发起者读取数据之前。也许使用UDP才是答案,也许不是。最好提出一个新问题。 - sarnold

8

我能让libcurl伪装或隐藏我的真实IP地址吗?

不行。libcurl在更高的层次上操作。此外,伪造IP地址意味着发送带有虚假源地址的IP数据包,然后您通常会遇到接收回送的数据包的问题,因为它们将无法路由到您!

如果您使用代理访问远程站点,则这些站点将看不到您的本地IP地址,而是看到代理的地址。

还要注意,在许多网络上使用NAT或其他IP混淆技术,使您在本地看到和使用不同的IP地址,而远程服务器将看到您从哪里来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接