【问题标题】:Python Requests, how to specify port for outgoing traffic?Python请求,如何为传出流量指定端口?
【发布时间】:2017-11-09 13:14:13
【问题描述】:

我正在开展一个项目,我们希望为防火墙上的传入流量分配白名单数据包过滤器,并且我们正在使用带有请求库的 python 脚本向该网络之外的某些服务器发出一些 https 请求。目前脚本使用临时端口连接到服务器,但我们希望通过特定端口发出这些 https 请求。这将允许我们为这些端口创建严格的白名单。

如何指定发送请求的请求库的端口?脚本当前正在使用以下类型的代码来发送必要的请求。

response = requests.post(data[0], data=query, headers=headers, timeout=10)

这可行,但我现在需要指定发送 http post 请求的端口,以允许在网络上进行更严格的数据包过滤。这个口岸申报怎么实现?我已经从多个来源搜索过这个问题的解决方案,但一无所获。

【问题讨论】:

  • 你不能在标准套接字上这样做。端口由您的操作系统选择。
  • @KlausD.:是的,您可以在标准套接字上这样做。 默认是把它留给操作系统。
  • @KlausD.:诀窍在于如何告诉请求使用特定端口而不是默认端口。
  • 虽然这可能是对的。它不会在防火墙上增加任何安全性。
  • @KlausD.:当然是。然后,您可以将传出连接限制在非常特定的本地端口和目标 IP 地址。

标签: python linux python-requests port firewall


【解决方案1】:

requests 建立在urllib3 之上,它提供了为连接设置源地址的能力;当您将源地址设置为 ('', port_number) 时,您会告诉它使用默认主机名但选择特定端口。

您可以在pool manager 上设置这些选项,并通过创建一个新的transport adapter 来告诉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))

在会话对象中使用此适配器,以下为所有 HTTP 和 HTTPS 连接安装适配器,使用54321 作为源端口:

s = requests.Session()
s.mount('http://', SourcePortAdapter(54321))
s.mount('https://', SourcePortAdapter(54321))

您只能设置一个源端口,将您一次限制为一个活动连接。如果您需要在端口之间轮换,请注册多个适配器(每个 URL 一个)或每次重新注册 catch-all 挂载。

有关source_address 选项的详细信息,请参阅create_connection() utility function documentation

如果设置了source_address,它必须是(host, port) 的元组,以便套接字在建立连接之前绑定为源地址。主机'' 或端口0 告诉操作系统使用默认值。

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 2019-06-05
    • 2018-09-23
    • 2011-02-06
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    相关资源
    最近更新 更多