Может ли обычный, непривилегированный пользователь использовать опцию сокета SO_BINDTODEVICE?Linux

Ответить
Anonymous
 Может ли обычный, непривилегированный пользователь использовать опцию сокета SO_BINDTODEVICE?

Сообщение Anonymous »

Я ищу в реализации системы, которая позволяет пользователям, у которых есть VPN -соединение, настроенное на их локальной машине, чтобы выбрать, какие запросы в Интернете отправляются через VPN, а какие нет. Я хочу, чтобы что-то, что было простым в использовании, может использоваться обычными, не привилегированными пользователями, и не требует сценариев, использования iptables / nftables или пространств сетевых имен. Я продолжаю сталкиваться с идеей использования SO_BINDTODEVICE, чтобы заставить подключения к использованию конкретного сетевого интерфейса, например, если прокси -сервер HTTP или SOCKS может быть связан с физическим интерфейсом машины, то пользователь может выбрать, чтобы обойти VPN, проходя через прокси, или использовать VPN, не предполагаемое. Чтобы иметь возможность использовать so_bindtodevice . С одной стороны, я видел множество уверенных утверждений, которые запускаются только как корень или, которые были предоставлены CAP_NET_RAW , могут использовать SO_BINDTODEVICE (например, здесь, здесь, здесь, здесь, и здесь, но с другой стороны, я использовал его без проблем в качестве обычного пользователя (без каких -либо судо или возможностей предоставления трюки). Например, в системе с физическим интерфейсом wlp0s20f3 и интерфейса Wireguard wg0 , настроенный (через сетевые управления и инструменты Wireguard) для маршрутизации всего трафика через wg0 , я получаю:

Код: Выделить всё

~$ 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
Запуск этого показывает, что соединение, обходящее VPN (тогда как с удаленной линией setSockopt , соединение проходит через VPN, как и ожидалось).
Так что все эти утверждения о 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»