【问题标题】:PycURL send DNS traffic through particular interfacePycURL 通过特定接口发送 DNS 流量
【发布时间】:2019-02-06 18:34:33
【问题描述】:

我在盒子上有多个接口,并希望使用 python 强制流量通过特定接口。

This thread 回答了如何为 HTTP 流量执行此操作。但是当我查看 tcpdump 时,DNS 查询不遵守接口设置。 libcurl 使用选项CURLOPT_DNS_INTERFACECURLOPT_DNS_LOCAL_IP4 提供强制DNS 流量通过特定接口的选项

我尝试通过 C 使用相同的,当 libcurl 使用 c-ares 支持构建时,它似乎尊重接口。

但是当从 pycurl 版本中使用相同的选项时,会导致以下错误:

AttributeError: DNS_INTERFACE
AttributeError: DNS_LOCAL_IP4

我正在尝试建议的猴子补丁on this thread。但是根据 cmets,其他人已经报告说它不起作用。谢谢。

[edit] 用 bind 测试了上面提到的猴子补丁,tcpdump 仍然通过不同的接口显示流量。固定格式。

【问题讨论】:

    标签: python curl networking libcurl pycurl


    【解决方案1】:

    发生 AttributeError 是因为 PycURL 仅支持它在 src/module.c 中列出的 curl 选项。可以通过镜像它如何支持 CURLOPT_INTERFACE 来添加对 CURLOPT_DNS_INTERFACE 的支持——通过添加

        insint_c(d, "DNS_INTERFACE", CURLOPT_DNS_INTERFACE);
    

        case CURLOPT_DNS_INTERFACE:
    

    在 src/module.c 和 src/easyopt.c 关于 CURLOPT_INTERFACE 的行之后,我可以构建一个支持 DNS_INTERFACE 的版本。我使用python setup.py install 进行构建(请参阅docs),遇到两个错误,这些错误已通过answermake src/docstrings.c 解决(请参阅GitHub)。

    这里是 docs 中添加了 DNS_INTERFACE 的示例:

    import pycurl
    from StringIO import StringIO
    
    buffer = StringIO()
    c = pycurl.Curl()
    c.setopt(c.URL, 'http://pycurl.io/')
    c.setopt(c.WRITEDATA, buffer)
    c.setopt(c.DNS_INTERFACE, "enp9s0")
    c.perform()
    c.close()
    
    body = buffer.getvalue()
    print(body)
    

    它目前在c.setopt(c.DNS_INTERFACE, "enp9s0") 上给了我pycurl.error: (4, ''),但是这个错误likely 不会发生在你身上,因为你构建了带​​有c-ares 支持的libcurl。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2016-04-14
      • 2011-08-28
      • 2015-09-11
      相关资源
      最近更新 更多