PycURL通过特定接口发送DNS流量

问题描述 投票:1回答:1

我在盒子上有多个接口,并希望使用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。但根据评论,其他人已经报告说它不起作用。谢谢。

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

python curl networking libcurl pycurl
1个回答
1
投票

由于PycURL仅支持在src / module.c中列出的curl选项,因此会发生AttributeError。可以通过镜像它支持CURLOPT_INTERFACE的方式来添加对CURLOPT_DNS_INTERFACE的支持 - 通过添加

    insint_c(d, "DNS_INTERFACE", CURLOPT_DNS_INTERFACE);

    case CURLOPT_DNS_INTERFACE:

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

这里添加了带有DNS_INTERFACE的docs示例:

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)

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

© www.soinside.com 2019 - 2024. All rights reserved.