Python Requests模块:能否通过HTTP头指定请求源IP?From字段可行吗?
关于请求头指定源IP与From字段的问题
先给你明确说结论:没法通过HTTP请求头来设置请求的源IP,包括你用的From字段也做不到这个事儿,原因和解决方案我给你拆解开说:
1. 为什么请求头改不了源IP?
HTTP请求的源IP是在TCP连接建立阶段就确定的——客户端和服务器握手时,服务器会直接获取到客户端的真实出口IP(或者客户端网卡绑定的IP),这属于网络传输层的信息。而HTTP请求头是应用层的数据,只是请求内容的一部分,服务器不会把它当成请求的真实源IP来处理。
2. From字段的真实作用
HTTP标准里的From字段,设计初衷是用来标识请求的发起者(比如填写发起人的邮箱地址),方便服务器管理员联系请求发起方,完全不是用来设置源IP的。大多数服务器要么忽略这个字段,要么只会把它记录到日志里,绝对不会用它来替换真实的请求源IP。
3. 你的代码问题分析
你当前的代码里设置了headers={"From":"source_ip"},这只会在HTTP请求头里多一条From: source_ip的记录,但服务器那边看到的请求源IP还是你客户端的真实IP,不会有任何改变。
4. 真正能修改请求源IP的方法
如果你确实需要让请求从指定的源IP发出,得从TCP层面入手,分两种情况:
情况一:客户端有多个本地IP(多网卡)
如果你的机器本身配置了多个IP,可以通过绑定特定本地IP的方式发送请求,示例代码如下:
import requests from requests.adapters import HTTPAdapter from urllib3.util.connection import create_connection def bind_source_ip(source_ip): # 重写连接创建函数,绑定指定源IP def _create_connection(address, *args, **kwargs): sock = create_connection(address, *args, **kwargs) sock.bind((source_ip, 0)) # 0表示自动分配可用端口 return sock return _create_connection # 创建自定义适配器,替换默认的连接逻辑 adapter = HTTPAdapter() adapter.poolmanager.connection_factory = bind_source_ip("你的本地源IP") # 用Session挂载适配器,之后的请求都会使用指定IP session = requests.Session() session.mount("http://", adapter) session.mount("https://", adapter) # 发送请求 response = session.get("http://server_ip/file_name", stream=True) with open("/home/client1/test/try101.txt", "wb") as handle: for chunk in response.iter_content(chunk_size=512): if chunk: handle.write(chunk)
注意:这里的你的本地源IP必须是你客户端机器上实际存在的IP(比如网卡配置的IP),否则会报错。
情况二:需要伪装成其他外部IP
如果要让服务器看到的是完全不同的外部IP,那得用代理服务器,通过代理转发请求,示例代码:
import requests # 设置代理地址 proxies = { "http": "http://代理服务器IP:端口", "https": "http://代理服务器IP:端口" } response = requests.get("http://server_ip/file_name", proxies=proxies, stream=True) with open("/home/client1/test/try101.txt", "wb") as handle: for chunk in response.iter_content(chunk_size=512): if chunk: handle.write(chunk)
这种方式需要你有可用的代理服务器,服务器会把代理IP当成请求的源IP。
内容的提问来源于stack exchange,提问作者Siddharth Sampath
相关产品推荐
相关产品推荐

