我在包装盒上有多个接口,并希望使用python强制通过特定接口的流量。
This thread回答了如何针对HTTP流量执行此操作。但是当我看tcpdump时,DNS查询不支持接口设置。 libcurl提供了使用选项CURLOPT_DNS_INTERFACE和CURLOPT_DNS_LOCAL_IP4
来强制通过特定接口进行DNS流量的选项。我尝试通过C使用相同的命令,并且在使用c-ares支持构建libcurl时,它似乎尊重接口。
但是当pycurl版本使用相同的选项时,会导致以下错误:
AttributeError: DNS_INTERFACE
AttributeError: DNS_LOCAL_IP4
我正在尝试建议on this thread进行猴子修补。但是根据评论,其他人已经报告说它不起作用。谢谢。
[edit] 使用绑定测试了上面提到的猴子补丁,tcpdump仍然显示通过不同接口的流量。固定格式。
答案 0 :(得分:1)
发生AttributeError,因为PycURL仅支持src / module.c中列出的curl选项。可以通过镜像支持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),遇到了两个错误,这些错误已通过此answer和make 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)
它目前在pycurl.error: (4, '')
上给了我c.setopt(c.DNS_INTERFACE, "enp9s0")
,但是由于您在c-ares支持下构建了libcurl,因此您不会发生likely这个错误。