使用 curl 指定网络接口

cp2*_*587 5 networking routing curl

出于某些原因,我想编写一个代理服务器,通过其 wifi 接口而不是以太网(这是操作系统级别的默认路由)路由其请求。我知道我可以通过摆弄 os 路由来做到这一点,但我更愿意直接在 curl 中做到这一点。

我已经读到您实际上可以选择套接字将与 --interface 选项一起使用的网络接口,但它似乎对我不起作用:(

我尝试了以下方法:

curl --interface wlp2s0 google.com

但我只收到 ETIMEDOUT 错误..另一方面,如果我这样做

curl --interface enp0s20 google.com

它按预期工作..

有谁知道发生了什么?

Mar*_*iae 7

正如Matt Clark正确指出的那样,ETIMEDOUT意味着您无法访问指定的站点,无论出于何种原因。

但我还要指出您误解了--interface选项的含义。它的意思是:如果我有两个或多个接口,使用我指定,而不是默认的一个”接口的IP地址,但对于路由。,决定哪些接口请求路由通,它是在内核根据您拥有的路由表而不是您的命令来决定:例如,如果路由表指定了默认网关eth0,即使您指定了--interface wlan0curl请求也将通过它路由。

让我们检查一下:我已经设置了两个tcpdump会话,一个在我的以太网设备 ( usb0 ) 上,一个在 wifi 设备 ( wlan0 ) 上;两者都已连接,但路由表在usb0 上有网关。现在,在第三个 shell 中,我发送了两个curl请求,如下所示:

$ date && curl --interface usb0 146.255.36.1/plain
mar 22 nov 2016, 18.44.21, CET
<!-- pageok -->
<!-- managed by puppet -->
<html>
<pre>pageok</pre>
</html>
$ date && curl --interface wlan0 146.255.36.1/plain
mar 22 nov 2016, 18.44.44, CET
<!-- pageok -->
<!-- managed by puppet -->
<html>
<pre>pageok</pre>
</html>
Run Code Online (Sandbox Code Playgroud)

这是我的两个tcpdump会话记录的内容:wifi 上的一个

# tcpdump -i wlan0 -n host 146.255.36.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
Run Code Online (Sandbox Code Playgroud)

和以太网上的

# tcpdump -i usb0 -n host 146.255.36.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on usb0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:44:21.118505 IP 192.168.73.74.52601 > 146.255.36.1.80: Flags [S], seq 2178801514, win 29200, options [mss 1460,sackOK,TS val 10527374 ecr 0,nop,wscale 7], length 0
18:44:21.147291 IP 146.255.36.1.80 > 192.168.73.74.52601: Flags [S.], seq 95036242, ack 2178801515, win 14480, options [mss 1460,nop,nop,TS val 500605800 ecr 10527374,nop,wscale 8], length 0
18:44:21.147322 IP 192.168.73.74.52601 > 146.255.36.1.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 10527381 ecr 500605800], length 0
18:44:21.147375 IP 192.168.73.74.52601 > 146.255.36.1.80: Flags [P.], seq 1:82, ack 1, win 229, options [nop,nop,TS val 10527381 ecr 500605800], length 81: HTTP: GET /plain HTTP/1.1
18:44:21.175829 IP 146.255.36.1.80 > 192.168.73.74.52601: Flags [.], ack 82, win 57, options [nop,nop,TS val 500605829 ecr 10527381], length 0
18:44:21.178222 IP 146.255.36.1.80 > 192.168.73.74.52601: Flags [P.], seq 1:285, ack 82, win 57, options [nop,nop,TS val 500605832 ecr 10527381], length 284: HTTP: HTTP/1.1 200 OK
18:44:21.178236 IP 192.168.73.74.52601 > 146.255.36.1.80: Flags [.], ack 285, win 237, options [nop,nop,TS val 10527389 ecr 500605832], length 0
18:44:21.178321 IP 192.168.73.74.52601 > 146.255.36.1.80: Flags [F.], seq 82, ack 285, win 237, options [nop,nop,TS val 10527389 ecr 500605832], length 0
18:44:21.206618 IP 146.255.36.1.80 > 192.168.73.74.52601: Flags [F.], seq 285, ack 83, win 57, options [nop,nop,TS val 500605860 ecr 10527389], length 0
18:44:21.206642 IP 192.168.73.74.52601 > 146.255.36.1.80: Flags [.], ack 286, win 237, options [nop,nop,TS val 10527396 ecr 500605860], length 0
18:44:44.284057 IP 192.168.73.45.41804 > 146.255.36.1.80: Flags [S], seq 2817430695, win 29200, options [mss 1460,sackOK,TS val 10533165 ecr 0,nop,wscale 7], length 0
18:44:44.313090 IP 146.255.36.1.80 > 192.168.73.45.41804: Flags [S.], seq 3652186052, ack 2817430696, win 14480, options [mss 1460,nop,nop,TS val 500628966 ecr 10533165,nop,wscale 8], length 0
18:44:44.313117 IP 192.168.73.45.41804 > 146.255.36.1.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 10533172 ecr 500628966], length 0
18:44:44.313152 IP 192.168.73.45.41804 > 146.255.36.1.80: Flags [P.], seq 1:82, ack 1, win 229, options [nop,nop,TS val 10533172 ecr 500628966], length 81: HTTP: GET /plain HTTP/1.1
18:44:44.342243 IP 146.255.36.1.80 > 192.168.73.45.41804: Flags [.], ack 82, win 57, options [nop,nop,TS val 500628995 ecr 10533172], length 0
18:44:44.343076 IP 146.255.36.1.80 > 192.168.73.45.41804: Flags [P.], seq 1:285, ack 82, win 57, options [nop,nop,TS val 500628996 ecr 10533172], length 284: HTTP: HTTP/1.1 200 OK
18:44:44.343090 IP 192.168.73.45.41804 > 146.255.36.1.80: Flags [.], ack 285, win 237, options [nop,nop,TS val 10533180 ecr 500628996], length 0
18:44:44.343168 IP 192.168.73.45.41804 > 146.255.36.1.80: Flags [F.], seq 82, ack 285, win 237, options [nop,nop,TS val 10533180 ecr 500628996], length 0
18:44:44.372262 IP 146.255.36.1.80 > 192.168.73.45.41804: Flags [F.], seq 285, ack 83, win 57, options [nop,nop,TS val 500629025 ecr 10533180], length 0
18:44:44.372302 IP 192.168.73.45.41804 > 146.255.36.1.80: Flags [.], ack 286, win 237, options [nop,nop,TS val 10533187 ecr 500629025], length 0
^C
20 packets captured
20 packets received by filter
0 packets dropped by kernel
Run Code Online (Sandbox Code Playgroud)

注意:

  1. 每个请求对应的时间戳,

  2. 不同的 LAN Ip 地址,以太网为 192.168.73.74,wifi 为 192.168.73.45。

  3. 所有的数据包都被检测到的tcpdump的以太网接口会话,不管我选择的--interface

你可能会问:那么--interface选项什么时候有用?当您有两个(或更多)路由表时,每个接口一个,每个都有自己的网关。然后--interface允许您指定使用哪个接口到达curl的目的地。如果您想了解更多关于如何设置策略路由的信息,您可以阅读这里