3

По некоторым причинам я хочу закодировать прокси-сервер, который направляет свои запросы через его интерфейс Wi-Fi вместо Ethernet (который является маршрутом по умолчанию на уровне ОС). Я знаю, что мог бы сделать это, поигравшись с маршрутами os, но я бы предпочел сделать это прямо в curl, например.

Я читал, что вы на самом деле можете выбрать сетевой интерфейс, который сокет будет использовать с опцией --interface, но он мне не подходит :(

Я попробовал следующее:

curl --interface wlp2s0 google.com

Но я получаю только ошибки ETIMEDOUT .. С другой стороны, если я сделаю

curl --interface enp0s20 google.com

работает как положено ..

Кто-нибудь знает, что происходит?

1 ответ1

3

Как правильно указал Мэтт Кларк, ETIMEDOUT означает, что вы не смогли попасть на указанный сайт по любой причине.

Но позвольте мне также отметить, что вы неверно истолковали значение параметра --interface. Это означает следующее: если у меня есть два или более интерфейса, используйте IP-адрес интерфейса, который я указываю, а не адрес по умолчанию ". Но что касается маршрутизации, то есть решения, по какому интерфейсу направляется запрос, именно ядро решает, а не ваша команда, в соответствии с вашей таблицей маршрутизации: если в таблице маршрутизации указан шлюз по умолчанию над eth0, например, запрос curl будет перенаправлен через него, даже если вы указали --interface wlan0.

Давайте проверим это: я настроил две сессии tcpdump , одну на моем устройстве Ethernet (usb0), одну на устройстве wifi (wlan0); оба подключены, но у таблицы маршрутизации есть шлюз через usb0. Теперь в третьей оболочке я отправляю два запроса 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>

и это то, что мои две сессии tcpdump записывают: один на Wi-Fi

# 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

и тот, на Ethernet

# 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

Обратите внимание:

  1. Отметки времени, соответствующие каждому запросу,

  2. различные IP-адреса локальной сети, 192.168.73.74 для Ethernet и 192.168.73.45 для Wi-Fi.

  3. То, что все пакеты обнаруживаются сеансом tcpdump на интерфейсе Ethernet, независимо от моего выбора --interface.

Вы можете спросить: так когда полезна опция --interface ? Когда у вас есть две (или более) таблицы маршрутизации, по одной на каждый интерфейс, каждая со своим собственным шлюзом. Затем --interface позволяет вам указать, какой интерфейс используется для достижения цели curl . Если вы хотите узнать больше о том, как настроить политику маршрутизации, вы можете прочитать здесь .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .