The*_*mer 2 python linux port firewall python-requests
我正在一个项目中,我们希望为防火墙上的传入流量分配白名单数据包筛选器,并且我们正在将Python脚本与请求库配合使用,以对该网络外部的某些服务器发出一些https请求。目前,脚本正在使用临时端口连接到服务器,但是我们希望通过特定端口发出这些https请求。这将使我们能够为这些端口创建严格的白名单。
如何指定请求库通过其发送请求的端口?脚本当前正在使用以下类型的代码来发送必要的请求。
response = requests.post(data[0], data=query, headers=headers, timeout=10)
Run Code Online (Sandbox Code Playgroud)
这可行,但是我现在需要指定应该通过其发送http post请求的端口,以允许在网络上进行更严格的数据包筛选。如何实现此端口声明?我已经从数个来源中寻找解决方案,但一无所获。
requests建立在上urllib3,它可以设置连接的源地址;当您设置源地址时,('', port_number)告诉它使用默认主机名,但选择一个特定的端口。
您可以在池管理器上设置这些选项,然后requests通过创建新的传输适配器来告诉您使用其他池管理器:
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
class SourcePortAdapter(HTTPAdapter):
""""Transport adapter" that allows us to set the source port."""
def __init__(self, port, *args, **kwargs):
self._source_port = port
super(SourcePortAdapter, self).__init__(*args, **kwargs)
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(
num_pools=connections, maxsize=maxsize,
block=block, source_address=('', self._source_port))
Run Code Online (Sandbox Code Playgroud)
在会话对象中使用此适配器,以下将所有适配器安装为所有 HTTP和HTTPS连接,并54321用作源端口:
s = requests.Session()
s.mount('http://', SourcePortAdapter(54321))
s.mount('https://', SourcePortAdapter(54321))
Run Code Online (Sandbox Code Playgroud)
您只能设置一个源端口,一次只能建立一个活动连接。如果您需要在端口之间旋转,请注册多个适配器(每个URL一个)或每次重新注册所有安装。
有关该选项的详细信息,请参见create_connection()实用程序功能文档source_address:
如果
source_address设置为if,则(host, port)在连接之前,套接字必须绑定为一个元组作为源地址。主机''或端口0告诉操作系统使用默认值。
| 归档时间: |
|
| 查看次数: |
4781 次 |
| 最近记录: |