为了账号安全,请及时绑定邮箱和手机立即绑定

Monkey 修补套接字库以使用特定的网络接口

Monkey 修补套接字库以使用特定的网络接口

牧羊人nacy 2021-07-27 16:53:24
我一直在尝试使用requests库向网站发出请求,但使用不同的网络接口。以下是我尝试使用但没有奏效的答案列表。这个答案描述了如何实现我想要的,但它使用pycurl. 我可以使用,pycurl但我已经了解了这种猴子修补程序,并想尝试一下。这个另一个答案起初似乎有效,因为它不会引发任何错误。但是,我使用 Wireshark 监控了我的网络流量,并且数据包是从我的默认接口发送的。我试图set_src_addr在答案作者定义的函数内打印消息,但消息没有显示出来。因此,我认为它正在修补一个从未被调用的函数。我收到了 HTTP 200 响应,这不应该发生,因为我已将套接字绑定到 127.0.0.1。import socketreal_create_conn = socket.create_connectiondef set_src_addr(*args):    address, timeout = args[0], args[1]    source_address = ('127.0.0.1', 0)    return real_create_conn(address, timeout, source_address)socket.create_connection = set_src_addrimport requestsr = requests.get('http://www.google.com')r<Response [200]>我也试过这个答案。使用这种方法我可以得到两种错误:import socket                  true_socket = socket.socket    def bound_socket(*a, **k):         sock = true_socket(*a, **k)    sock.bind(('127.0.0.1', 0))    return sock                socket.socket = bound_socket   import requests这将不允许我创建套接字并引发此错误。我还尝试对这个答案进行修改,如下所示:import requests                           import socket                             true_socket = socket.socket               def bound_socket(*a, **k):                    sock = true_socket(*a, **k)               sock.bind(('192.168.0.10', 0))            print(sock)                               return sock                           socket.socket = bound_socket              r = requests.get('https://www.google.com')         这也不起作用并引发此错误。我有以下问题:我想让每个进程通过特定的网络接口发送请求。我认为由于线程共享全局内存(包括库),我应该更改我的代码以使用进程。现在,我想在某处应用猴子补丁解决方案,使每个进程可以使用不同的接口进行通信。我错过了什么吗?这是解决这个问题的最佳方法吗?编辑: 我也想知道不同的进程是否有可能拥有同一个库的不同版本。如果它们是共享的,我如何在 Python 中拥有不同版本的库(每个进程一个)?
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

我遇到了类似的问题,我希望一些 localhost 流量不是来自 127.0.0.1(我正在通过 localhost 测试 https 连接)


这就是我使用 python 核心库ssl和http.client(cf docs ) 的方式,因为它看起来比我使用该requests库在网上找到的解决方案更清晰。


    import http.client as http

    import ssl


    dst= 'sever.infsec.local' # dns record was added to OS

    src = ('127.0.0.2',0) # 0 -> select available port 


    context = ssl.SSLContext()

    context.load_default_certs() # loads OS certifcate context


    request = http.HTTPSConnection(dst, 443, context=context,

                                   source_address=src)


    request.connect()


    request.request("GET", '/', json.dumps(request_data))

    response = request.getresponse()


查看完整回答
反对 回复 2021-08-03
  • 3 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信