LINUX.ORG.RU

Как пустить трафик приложения через определённый сетевой интерфейс?

 , , ,


4

5

Есть 2 интерфейса:

# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether d8:bb:c1:95:4d:c7 brd ff:ff:ff:ff:ff:ff
3: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1400 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 3
    link/ppp
Надо, чтобы всё ходило по дефолту через eno1, а ppp0 засунуть в namespace так, чтобы потом можно было сделать, например
ip netns exec <ns> ssh
Любые другие способы приветствуются.

С конкретным приложением — не знаю.

Есть простой способ с отдельным пользователем. Сделать две таблицы маршрутизации, одну использовать по умолчанию, а для второй написать в ip rule правило, использовать вторую таблицу для определённых пользователей.

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

У меня pptp, а не openvpn. На подобное натыкался, надо как-то в общем случае, чтобы можно было сделать скрипт типа

interface_to_namespace.sh ppp0 ns
и всё работало с любым интерфейсом без лишних телодвижений.

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

Есть простой способ с отдельным пользователем. Сделать две таблицы маршрутизации, одну использовать по умолчанию, а для второй написать в ip rule правило, использовать вторую таблицу для определённых пользователей.

А можно подробнее?

crutch_master ★★★★★
() автор топика
  1. Перекинуить интерфейс в новое netns элементарно, ip link set ppp0 netns <ns>. Как удобнее управлять этим линком – зависит от вашей системы.

  2. Еще есть вариант нужные процессы помещать в цгруппу, траффик которой маркируется и роутится иначе, чем весь остальной.

А лучше всего – не костылить то, что уже накостылено и держать каждое приложение в контейнере. Получите оба пункта в готовом виде.

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

Перекинуить интерфейс в новое netns элементарно, ip link set ppp0 netns <ns>

После этого мой ppp0 превращается в тыкву без роутинга и адреса.

А лучше всего – не костылить то, что уже накостылено и держать каждое приложение в контейнере.

ssh клиент в контейнере?

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

man ssh


-b bind_address
Use bind_address on the local machine as the source address of the connection. Only useful on systems with more than one address.

А это случаем не то что ищите?

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

Хз. Если поменяю роутинг, ssh в vnp'овской подсети адрес найдёт? Я что-то думаю, что нет.

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

Как-то так. Две таблицы маршрутизации, в одной адрес по умолчанию с eno1, во второй — pppo0

ip route add default via 192.168.0.1 
ip route add default via 10.0.0.1 table 2
ip rule add uidrange 1000-1000 lookup 2

Всё. Теперь пользователь c uid 1000 будет использовать таблицу марширутизации 2, а там по умолчанию путь по адресу ppp0.

Эти настройки можно прозрачно настроить с systemd-networkd, в конфиге man 5 systemd.network использовать секцию [RoutingPolicyRule]. В секции [DHCP] тоже можно указать Table, чтобы полученные пути прописывались в нужную таблицу.

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

Разумеется, надо линк настроить руками(скриптом) или автоматически(systemd-networkd? NM?).

И как этот ppp0 создается? Может, cразу создавать netns unshare --net=</path> и все настраивать в нем?

ssh клиент в контейнере?

Да. А что?

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

Еще один, еще более простой вариант. В принципе, даже рут не нужен:

slirp4netns -c --netns-type=path </path/to/netns> --outbound-addr=ppp0 tap0

i586 ★★★★★
()
Ответ на: комментарий от ValdikSS
# ip link add vrf0 type vrf
Error: VRF table id is missing.
//Ок
# ip link add vrf0 type vrf table 1
# ip link set eno1 vrf vrf0
# ip vrf exec vrf0 curl "google.com"
curl: (6) Could not resolve host: google.com

Я так понимаю, хрен оно так будет рабоать, мне надо сделать сначала, чтобы по дефолту все работало не через ppp0

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

Не работает:

# ip route add default via 192.168.1.109
# ip route add default via 192.168.150.25 table 2 //ppp0 address
# ip rule add uidrange 1000-1000 lookup 2
# curl linux.org.ru
curl: (7) Failed to connect to linux.org.ru port 80: Нет маршрута до узла
# ip route show default
default via 192.168.1.109 dev eno1 
default dev ppp0 proto static scope link metric 50 
default via 192.168.1.1 dev eno1 proto dhcp metric 20100

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

чтобы по дефолту все работало не через ppp0

В таком случае не устанавливайте маршрут по умолчанию.

ValdikSS ★★★★★
()
Ответ на: комментарий от crutch_master
# ip route add default via 192.168.1.109
# ip route add default via 192.168.150.25 table 2 //ppp0 address

Здесь точно правильные адреса? Это должны быть не адреса на локальном интерфейсе. Там же 192.168.1.1?

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