LINUX.ORG.RU
ФорумAdmin

Разные сетевые интерфейсы для разных пользователей

 


2

2

Как?

Комп имеет два подключения к сети. Как сделать чтобы разные пользователи подключались через разные интерфейсы? Еще точнее - выделить одному из пользователей интерфейс отличный от того что использует система по дефолту. Реально?

★★★★★

Да можно.

-A OUTPUT -m owner --uid-owner 1003  -j MARK --set-mark 3
Ну тобишь маркируешь его трафик (только он приложения от себя должен запускать). Ну а дальше ip rule, и другая таблица маршрутизации.

pyatak123
()
Ответ на: комментарий от pyatak123

Ну тобишь маркируешь его трафик (только он приложения от себя должен запускать).

Ага. Тут все понятно. Спасибо!

Ну а дальше ip rule, и другая таблица маршрутизации.

А тут ни слова не понял. Можно для нубов - где про это почитать? Куда писать эти таблицы и как заворачивть трафик.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Можно для нубов - где про это почитать?

man ip-route
man ip-rule

Куда писать эти таблицы и как заворачивть трафик.

Выглядит примерно так. Добавляешь в произвольную (300) таблицу маршрут по умолчанию. И добавляешь правило согласно которому отмеченные (3) пакеты отправляются в таблицу (300) Вместо номера таблицы можно задать имя, подробности в man ip-route.

Это пример, в работе не проверял:

ip route add default via <gateway> dev <interface> table 300
ip rule add fwmark 3 table 300

surefire ★★★
()
Ответ на: комментарий от pyatak123

-A OUTPUT -m owner --uid-owner 1003 -j MARK --set-mark 3

Очень кривая конструкция ( еще и nat нужно )

zolden предложил более прямую вещь

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от zolden

Да штука классная вроде и простая но я не догоняю...

Вот я создаю ns:

ip netns add LEFT
Добавляю lo:
ip netns exec LEFT ip link set dev lo up
И вроде все ништяк:
 ip netns exec LEFT ifconfig
lo        Link encap:Локальная петля (Loopback)  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:336 (336.0 B)  TX bytes:336 (336.0 B)
Локалхост пингуется.

Дальше мне надо мой wlan0 засунуть в ns LEFT и вот тут смысл вот этого я не вкурил даже после man'а:

ip link add name ve0a type veth peer name ve0b
Что такое ve0a? А ve0b? Один создается, а откуда взялася другой?

Почему тип veth? Мне что туда ставить, vwlan? Он его не понимает.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Я почему сказал что тебе надо продумать детали и потом рассказать - потому что мне самому интересно, как пользователя целиком запихать в отдельный namespace.
Видимо vel и pyatak123 это как-то сразу поняли (и скорее всего каждый по своему).
И тоже не поделились, вот ведь какие шалунишки

Думаю, router должен точно знать прокатит или нет

Не очень понимаю что за схему ты реализовываешь, в твоём случае для добавления должно быть достаточно

ip link set dev wlan0 netns LEFT

zolden ★★★★★
()
Ответ на: комментарий от zolden

Не очень понимаю что за схему ты реализовываешь, в твоём случае для добавления должно быть достаточно

# ip link set dev wlan1 netns LEFT
RTNETLINK answers: Invalid argument

Я так понимаю - так нельзя. Нужно сначала создать копию интерфейса.

Я еще в этот мануал смотрю: https://lwn.net/Articles/580893/

Suntechnic ★★★★★
() автор топика
Последнее исправление: Suntechnic (всего исправлений: 1)
Ответ на: комментарий от Suntechnic

Даже точнее так - нужно создать интерфей виртуальный который будет связан с интерфейсом в корневом пространстве 1.

Я так понял что должно быть нечто вроде:

# ip link add name vwlan1 type vwlan peer name wlan1
Т.е. создаем виртуальный интерфейс vwlan1 который связан с wlan1. Тип vwlan - но так ругается на тип. Если сделать
# ip link add name vwlan1 type veth peer name wlan1
- говорит что файл существует :(

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Походу это PID любого процесса запущеного в этом ns.

Я запустил там bash: ip netns exec LEFT bash

(какой-то нахрен лютый костыль - это так каждый раз делать?)

Теперь в соседнем терминале:

# ip netns pids LEFT
15696

# iw phy phy4 set netns 15696

# ip netns exec LEFT iw list
Wiphy phy4
	max # scan SSIDs: 4
	max scan IEs length: 2257 bytes
	Coverage class: 0 (up to 0m)
	Device supports RSN-IBSS.
...
Отлично. Теперь у меня в LEFT есть phy4. Ну и чо дальше?

Suntechnic ★★★★★
() автор топика
Последнее исправление: Suntechnic (всего исправлений: 1)
Ответ на: комментарий от Suntechnic

Дальше мне надо мой wlan0 засунуть в ns LEFT и вот тут смысл вот этого я не вкурил даже после man'а:

ip link add name ve0a type veth peer name ve0b

netspace создаётся изолированным. Представь его как отдельный комп. Чтобы он мог выйти в сеть, нужно соединить его линком с основным компом

Приведённая выше команда создаст этот линк. Появятся 2 сетевых интерфейса - ve0a и ve0b. Дальше один из них настраиваешь в основной системе, другой прокидываешь в namespace и настраиваешь там

ip address add 10.10.10.1/24 dev ve0a
ip link set dev ve0a up
ip link set dev ve0b netns LEFT
ip netns exec LEFT bash
# уже в netspace LEFT:
ip address add 10.10.10.2/24 dev ve0b
ip link set dev ve0b up
ip route add default via 10.10.10.1 dev ve0b

После этого всё равно придётся настраивать форвардинг и нат/маскарад, т.к. для ядра этот трафик будет «чужим»

iptables -P FORWARD DROP
iptables -I FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 10.10.10.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 ! -d 10.10.10.0/24 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от router

Но раз есть лишний интерфейс, то вместо создания виртуального линка ( ip link add ... ) я бы использовал его

router ★★★★★
()
Ответ на: комментарий от Suntechnic
# ip link set dev wlan1 netns LEFT
RTNETLINK answers: Invalid argument

Скорее всего, интерфейс уже используется ( поднят, назначен адрес ). Останови его и должно получиться:

2: eth4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:e0:81:c6:79:75 brd ff:ff:ff:ff:ff:ff
ip netns add test
ip l set eth4 netns test
router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)

Кстати, а зачем возникла такая необходимость?

Может быть проще поднять для пользователей отдельные виртуалки KVM? libvirt позволит явно привязывать их к интерфейсу

router ★★★★★
()
Ответ на: комментарий от router

Спасибо за разъяснение ситуации с виртуальными интерфейсами! Теперь понятно.

Скорее всего, интерфейс уже используется ( поднят, назначен адрес ). Останови его и должно получиться

Ах, вот оно в чем дело. Просто отключение не помогло. А «остановить» это как? Если я просто сделаю ifconfig wlan1 down он же пропадет и что тогда я буду добавлять? Хотя я попробовал для надежности - так и есть. Тоже пишет Invalid argument, но это и логично - никакого wlan1 более нет!

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от router

Ну я раньше так и делал, только на попсовом VB. Но сейчас я работаю за ноутом и он значительно слабее. Пускать на нем виртуалку которая нужно только для того чтобы один единственный браузер запущенный от другого пользователя ходил в сеть через другой интерфейс как-то неэкономно.

Добавлю, на всякий случай, что на этом интерфейсе должны быть Tor и privoxy между ним и браузером, а то вдруг Tor можно напряму в интерфейс ткнуть носом, а я тут NS'ы изобретаю.

Suntechnic ★★★★★
() автор топика
Последнее исправление: Suntechnic (всего исправлений: 1)
Ответ на: комментарий от router

Чего-то я совсем запутался:

# ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:24:54:a7:5e:24  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:19 

lo        Link encap:Локальная петля (Loopback)  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:366 errors:0 dropped:0 overruns:0 frame:0
          TX packets:366 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:28196 (28.1 KB)  TX bytes:28196 (28.1 KB)

wlan0     Link encap:Ethernet  HWaddr e8:39:df:08:f8:16  
          inet addr:192.168.13.11  Bcast:192.168.13.255  Mask:255.255.255.0
          inet6 addr: fe80::ea39:dfff:fe08:f816/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:71655 errors:0 dropped:0 overruns:0 frame:0
          TX packets:44594 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:64340584 (64.3 MB)  TX bytes:11095944 (11.0 MB)
Вот пожалуйста 3 интерфейса. Делаем:
root@alex-laptop /h/alex# ip netns add LEFT
root@alex-laptop /h/alex# ip netns exec LEFT ip link set dev lo up
root@alex-laptop /h/alex# ip link set eth0 netns LEFT
root@alex-laptop /h/alex#
Никаких ошибок. lo поднялся, eth0 добавился... Добавился?

А вот и нет:

root@alex-laptop /h/alex# ip netns exec LEFT ifconfig
lo        Link encap:Локальная петля (Loopback)  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@alex-laptop /h/alex#
Однака в корневом неймспейсе его теперь тоже нет:
root@alex-laptop /h/alex# ifconfig 
lo        Link encap:Локальная петля (Loopback)  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:366 errors:0 dropped:0 overruns:0 frame:0
          TX packets:366 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:28196 (28.1 KB)  TX bytes:28196 (28.1 KB)

wlan0     Link encap:Ethernet  HWaddr e8:39:df:08:f8:16  
          inet addr:192.168.13.11  Bcast:192.168.13.255  Mask:255.255.255.0
          inet6 addr: fe80::ea39:dfff:fe08:f816/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:72089 errors:0 dropped:0 overruns:0 frame:0
          TX packets:44799 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:64456535 (64.4 MB)  TX bytes:11130231 (11.1 MB)

root@alex-laptop /h/alex#
Как так?
root@alex-laptop /h/alex# ip netns exec LEFT ip link set dev eth0 up
root@alex-laptop /h/alex# ip netns exec LEFT ifconfig
eth0      Link encap:Ethernet  HWaddr 00:24:54:a7:5e:24  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:19 

lo        Link encap:Локальная петля (Loopback)  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Ах, его надо было явно поднять? А чего же с wlan так не выходит?

Suntechnic ★★★★★
() автор топика
Последнее исправление: Suntechnic (всего исправлений: 1)
Ответ на: комментарий от Suntechnic

Погуглил. Это для обычных интерфейсов всё просто. А для wifi - всё через жопу

установи rfkill, выполни

rfkill list
ну или
iw list | head
получишь ДРУГОЕ имя wifi интерфейса. Хз что за бред. У меня название интерфейса в ОС - «wlan0», в выводе rfkill - «phy0»

После этого запускаешь какой-нибудь процесс в новом netspace и получаешь в нём идентификатор

ip netns exec LEFT bash
echo $$

Вне netspace'ов ( «в обычной системе» ) выполняешь

iw phy phy0 set netns $NS_PID

где NS_PID - то, что вывела команда «echo $$» в твоём netspace LEFT. Т.е. для iw phy указывать нужно не название netspace'а, а PID любого процесса, запущенного в этом netspace'е

http://superuser.com/questions/653996/how-to-move-wireless-connection-to-othe...

router ★★★★★
()
Ответ на: комментарий от Suntechnic

Если я просто сделаю ifconfig wlan1 down он же пропадет и что тогда я буду добавлять? Хотя я попробовал для надежности - так и есть. Тоже пишет Invalid argument, но это и логично - никакого wlan1 более нет!

Ты бы хоть man ifconfig почитал. Я давно на автомате пишу «ifconfig -a», если приходится его использовать

ifconfig -a

А вообще пора привыкнуть к мысли, что в linux ifconfig уже 10 лет назад устарел, отстал от развития сетевой подсистемы ядра, а потом его и вовсе заменили на тонкий wrapper ( обёртку ), который дёргает iproute2. сама эта обёртка ifconfig оставлена только для совместимости, а по-хорошему нужно использовать утилиту ip из пакета iproute2

ip link list
ip l l
router ★★★★★
()
Ответ на: комментарий от router

Ну да, я ж про это писал тут: Разные сетевые интерфейсы для разных пользователей (комментарий) и тут: Разные сетевые интерфейсы для разных пользователей (комментарий)

wlanX'ы они же вертуальные как бы, а phyX'ы типа реальные железяки как я понял.

Но что с этим phyX делать дальше уже внутри NS я не понял (((

Да и как это автоматизировать? Это букет костылей какой-то. Вот я и пытался напрямую я добавить wlan.

Такая классная идея этих NS и как всегда невозможно по человечески воспользоваться.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от router

А вообще пора привыкнуть к мысли, что в linux ifconfig уже 10 лет назад устарел

ХЗ. Привык. Я как-бы не часто вожусь с системой. Самое сложное что мне приходится делать по работе именно с системой, это подоткнуться по ssh и посмотреть сколько мест на диске осталось, да задачи в cron добавить, и то я делаю это или через webUI или прямо в файл конфигурации вписываю...

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Но что с этим phyX делать дальше уже внутри NS я не понял (((

сам читать пробовал? ifconfig запускай с ключом -a. А лучше используй iproute2

Да и как это автоматизировать? Это букет костылей какой-то. Вот я и пытался напрямую я добавить wlan.

Проще простого - используй виртуалки, там всё автоматизировано. Или читай документацию и исходники. Наверняка это можно сделать, но никому не нужно, т.к. все используют виртуалки %)

router ★★★★★
()
Ответ на: комментарий от router

Скрипт, который создаст и настроит namespace, пишется на коленке минут за 5.

Скрипт в котором надо использовать sed или awk для получения данных из вывода недопрограмм не способных отдать raw я не использовать не писать не хочу. Ну вот такое отношение у меня к этому.

Если не найду как переместить wlan в NS без плясок с бубном вокруг запущенного в NS процесса - вернусь в VB.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от router

Вобщем изучил тему, и теперь я знаю почему всякие wlan нельзя добавить в ns. От этого правда не легче соврешенно. Вобщем для любых виртуальных интерфейсов, к коим wlan'ы и относятся, путь только один - перемещать в ns физическую железку на которой этот интерфейс поднят. Связано это с тем что на одной железке можно поднять N>1 интерфейсов и если один окажется в одном ns, а другой в другом станет совсем грустно.

При этом виртуальные интерфейсы следуют за железякой. Т.е:

root@alex-laptop /h/alex# ip netns add LEFT
root@alex-laptop /h/alex# ip netns exec LEFT ip link set dev lo up
root@alex-laptop /h/alex# ip netns exec LEFT service tor start
 * Starting tor daemon...                                                                                                                                                                               [ OK ] 
root@alex-laptop /h/alex# iw list | grep Wiphy
Wiphy phy3
Wiphy phy0
root@alex-laptop /h/alex# ip netns pids LEFT
21011
root@alex-laptop /h/alex# iw phy phy3 set netns 21011
root@alex-laptop /h/alex# ip netns exec LEFT ip l l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
7: wlan1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DORMANT group default qlen 1000
    link/ether 00:1e:58:ad:c1:08 brd ff:ff:ff:ff:ff:ff
Только вот даже если wlan1 был законекчен к сети какой-то, то коннект обрывается. Из nm-applet интерфейс исчезает.
root@alex-laptop /h/alex# ip netns exec LEFT iwconfig
lo        no wireless extensions.

wlan1     IEEE 802.11bgn  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
Стыдно спрашивать, но - как его-то теперь подключить к сети?

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic
# ip netns exec LEFT iwconfig wlan1 essid alex-network-2 key c1466a015ab709b97ba2905c61ce9c271b72fe3aae10757d87b0f6996fe44196 mode managed
Error for wireless request "Set Encode" (8B2A) :
    SET failed on device wlan1 ; Invalid argument.
Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Пускать на нем виртуалку которая нужно только для того чтобы один единственный браузер запущенный от другого пользователя ходил в сеть через другой интерфейс как-то неэкономно

Контейнер пусти.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ну тоже вариант, но вот это решение с ns выглядит уж очень заманчиво красивым - минимум лишнего. Хотелось бы добить по возможности.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от expelled

Пользователи работают одновременно?

Ну вообще предпалогалось что да. Но сейчас я думаю что и пользователь мне не нужен отдельный. Собственно отдельный пользователь был, для того чтобы дать ему отдельный выход в сеть. Сейчас понятно, что можно отдельные приложения пустить через другой if. По сути (я выше писал) суть задачи - выпустить Tor-трафик через другое подключение к интернету.

Совсем уже хорошо бы было, выпустить обычный трафик через if1, Tor трафик через if2, и трафик сопутствующий Tor через if3. Так как у меня 4 подключения к сети - могу позволить.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

С ними возьни больше. Хотя учитывая сколько я с этим провозился... Оно же изначально выглядело проще.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от expelled

Если бы наркотики и оружие... можно бы было попроще все сделать. Не - произведения Толстого в сеть выкладывать собрался и конституцию РФ.

Suntechnic ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.