Код: Выделить всё
~$ curl --interface wlp0s20f3 https://ifconfig.co/
~$ curl https://ifconfig.co/
< /code>
или, с моим собственным кодом Python: < /p>
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, b'wlp0s20f3')
s.connect(("api.ipify.org", 80))
s.sendall(b'GET / HTTP/1.1\r\nHost: api.ipify.org\r\nAccept: text/html\r\n\r\n')
data = s.recv(1024)
data.print
Так что все эти утверждения о SO_Bindtodevice нельзя использовать обычные пользователи просто неправильные, или на свежем воздухе, я не буду что -то, что я не буду что -то, что я не буду что -то, что я не буду что -то, что я не буду что -то, что я не буду что -то, я не буду что -то не запускать? Документация сбивает с толку по этому вопросу: с одной стороны, на странице MAN говорится: < /p>
-Интерфейс
выполнить операцию, используя указанный интерфейс. Вы можете ввести имя интерфейса, IP -адрес или имя хоста. < /P>
< /blockquote>
in linux эта опция может использоваться для указания устройства VRF (виртуальная маршрутизация и перенаправление), но тогда двоичный файл /blockte wation < /prind < /prind < /prind < /prind < /prind < /prind. Подразумевает, что до тех пор, пока не указан VRF, опция может использоваться непривилегированным пользователем.
Но с другой стороны, код SO_BindtoDevice и его комментарии прочитан следующим образом:
Код: Выделить всё
#ifdef SO_BINDTODEVICE
if(iface) {
/*
* This binds the local socket to a particular interface. This will
* force even requests to other local interfaces to go out the external
* interface. Only bind to the interface when specified as interface,
* not just as a hostname or ip address.
*
* The interface might be a VRF, eg: vrf-blue, which means it cannot be
* converted to an IP address and would fail Curl_if2ip. Simply try to
* use it straight away.
*/
if(setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE,
iface, (curl_socklen_t)strlen(iface) + 1) == 0) {
/* This is often "errno 1, error: Operation not permitted" if you are
* not running as root or another suitable privileged user. If it
* succeeds it means the parameter was a valid interface and not an IP
* address. Return immediately.
*/
if(!host_input) {
infof(data, "socket successfully bound to interface '%s'", iface);
return CURLE_OK;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... ndtodevice
Мобильная версия