带有curl --interface或CURLOPT_INTERFACE的SO_BINDTODEVICE

时间:2016-05-13 00:59:52

标签: php linux curl networking

以非root用户身份运行此命令:

  

curl --interface tun0 http://google.com -v

     

SO_BINDTODEVICE tun0失败,错误1:不允许操作;   会做常规绑定

在php中设置curl_setopt($ch, CURLOPT_INTERFACE "tun0")也不起作用。但是,

  

ping -I tun0 google.com

工作正常,所以这只是curl的一个问题。它甚至适用于root的curl,但它确实适用于非root用户。

我有一个openpvn接口tun0,但lo接口也是如此。

这种情况发生在多个系统上,因此--interface选项只是在curl中打破了,还是我应该以其他方式使用它?我是否应该为curl启用特殊功能才能使用界面?

1 个答案:

答案 0 :(得分:2)

我认为您没有正确解释详细信息。

curl的--interface选项要求它将套接字的本地端绑定到特定的IP /网络接口。

使用正常bind()调用绑定套接字。

另外到bind()调用,linux提供了SO_BINDTODEVICE setsockopt选项,它是一种更好,更完整的绑定接口。然而,这个调用需要root访问才能工作,大多数libcurl使用应用程序都没有,然后它将在详细输出中使用上面提到的文本失败。

因此,套接字的本地绑定甚至可以与存在的消息一起工作。它只是没有达到SO_BINDTODEVICE级别。