LINUX.ORG.RU
решено ФорумAdmin

Не удаётся изолировать трафик tixati в namespace от WireGuard

 , ,


0

1

Штудирую статью: Using WireGuard For Specific Apps on Linux

Английский знаю плохо, поэтому штудировал весь день и может чего не понял. Вот решил отдельный тред открыть. Изучил, есть результат и конкретный вопрос, думаю имею моральное право на это)

Сделал всё по первому сценарию:

Disable Selectively: In this scenario, we want to send almost all of our traffic through a WireGuard tunnel, but selectively disable it for one or two specific applications that we don’t want to use the tunnel.

У меня получается запустить изолированный в namespace клиент tixati:

sudo ip netns exec pvt-net1 sudo -u $USER tixati

Средствами KDE я просто импортировал в систему конфиг файл с ключом для wireguard, и у меня в сетевых подключениях появилось соединение, которое я включаю, когда нужен vpn. При этом созданный namespace успешно игнорирует его и у него остаётся основной ip.

Но если я поднимаю wireguard соединение через консоль, используя wireguard-tools:

# Включить и выключить wireguard:
sudo wg-quick up wg0
sudo wg-quick down wg0

То он начинает действовать и на основное пространство и на pvt-net1 namespace, где как бы его быть не должно.

Что делал не совсем по приведённой инструкции:

Я делал всё по инструкции, кроме того, что не настраивал конфиг wireguard как там написано, потому что в инструкции рассматривается вариант настройки и клиента и сервера, а у меня конфиг от провайдера впн просто, и я его вписал в /etc/wireguard/wg0.conf. Он работает, но проникает в моё изолированное от него пространство «pvt-net1».

Как это исправить? Так понимаю или что-то в конфиге нужно править или в правилах namespace «pvt-net1».

Но почему тогда импортированный через KDE ключ работает для основной системы а namespace «pvt-net1» его успешно игнорирует?

Ещё насчёт /etc/wireguard/wg0.conf
в статье Address = 10.0.0.1/32 а у меня Address = 10.8.0.21/24 Если его изменить то при включённом wg даже пинги не проходят всё крашится.

в статье Endpoint = 203.0.113.2:51822 как я понял это сервер, у меня там url моего провайдер впн. Остальные настройки не критичны вроде.

Ещё вопросы:

  1. У меня такое ощущение, что не все правила, которые я успешно выполнил сохранились. Смотрю: sudo iptables-save или iptables -nvL --line-numbers. Там заметно меньше строк, чем я вводил правил. Принудительное сохранение iptables-save -f /etc/iptables/iptables.rules зачем вообще нужно?

  2. В ходе инструкции приводился ещё какой-то скрипт, я его сначала сделал и исполнил: sudo nft -f ~/4cli/nft-rules , но последние две инструкции счёт избыточными и добавлять в него не стал. Он кажется необязателен и служит для какого-то удобства в чём-то другом? Поясните пож-та.

P.S. Если честно я так и не понял механизма как wireguard в основном пространстве будет работать, а в изолированном дополнительном - нет. Видимо в этом кроется причина. Но меня категорически сбивает с толку, что тупо импортированный вариант как-раз таки работает как надо. Но я хочу а) разобраться, б) рулить wg из консоли.

Конспект выполненных команд: https://hastebin.com/share/wokifunuwa.sql

P.S. Я тут перезагрузился и немало так офигел.

Cannot open network namespace "pvt-net1": No such file or directory

Пропало после ребута. Как же так? Я не удалял разумеется.

P.P.S. снова всё добавил, перезагрузился - опять namespace в 314zду провалилось. Его что вручную каждый раз поднимать надо, не запоминается??? ЧЯДНТ?

Загуглил:

Network namespaces in Linux are ephemeral by nature and are typically associated with running processes. When a system reboots, any network namespaces that were created and not explicitly made persistent will be lost, as the processes associated with them are terminated.

В инструкции не было ни слова про это… Почему так сделано? Удивлён. Ну ок, а где в manjaro их лучше и правильнее записать чтобы при загрузке создавались?

★★★

Последнее исправление: hikikomori (всего исправлений: 6)

Уже новый вопрос появился…

Вернул в Manjaro /etc/rc.local и убрал скрипт namespace туда. Работает. Я правильно сделал?

Однако tixati у меня раньше стартовал из скрипта, который сначала делал бекап, потом запускал tixati. Но он стартует через автозапуск KDE systemsettings. То есть этопользовательский скрипт, я не могу там ничего от имени sudo запустить. А мне надо:

sudo ip netns exec pvt-net1 sudo -u $USER /usr/bin/tixati &

А бэкап БД должен отрабатывать до запуска tixati. ну не пихать же всё это в /etc/rc.local. Можно ли как-то выполнить эту строку без ввода пароля?

Или как правильно будет организовать запуск.

UPD: Я пока добавил в /etc/rc.local строку запуска скрипта бэкапа: ../tixati/takeshot.sh И ниже запуск tixati, но он почему-то не сработал:

ip netns exec pvt-net1 sudo -u hikikomori /usr/bin/tixati

Удивился.

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

В /etc/rc.local ещё не загрузились иксы, tixati отказывается стартовать оттуда. А из обычного автозапуска я не могу запустить её в namespace, потому что там не работает sudo. Как же быть, взаимоисключающие параграфы…

Пришлось закостылить:

/etc/sudoers.d/10-installer
%wheel ALL=(ALL) ALL
hikikomori ALL = NOPASSWD: /usr/bin/ip netns exec pvt-net1

Но как правильно сделать-то?

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

upd. чёрт, почему-то сломался sudo. откатил 10-installer обратно. Всё равно через автозапуск он ещё не работает и всё равно требуется ввод пароля. Пора спать. Йя усталь.

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

%wheel ALL=(ALL) ALL
hikikomori ALL = NOPASSWD: /usr/bin/ip netns exec pvt-net1

Ничего в формате не смущает?

Попробуй так:

hikikomori ALL=(ALL) NOPASSWD: /usr/bin/ip netns exec pvt-net1

Пробелы в нужных местах и (ALL) ВАЖНЫ! Формат можешь в man sudoers глянуть

Pinkbyte ★★★★★
()

По поводу того как задуманы и работают network namespace есть хорошый перевод статей на хабре

А если вкратце - то тебе надо через systemctl edit написать override для юнитов тех служб, которые ты хочешь запускать в Network Namespace. В systemd 242 и выше появился некий атрибут NetworkNamespacePath, теперь оно видимо проще, но я по-привычке костыляю с переопределением строки запуска (надо бы переучиться)

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte
# /etc/sudoers.d/10-installer
%wheel ALL=(ALL) ALL
hikikomori ALL=(ALL) NOPASSWD:/usr/bin/ip netns exec pvt-net1
$ /usr/bin/ip netns exec pvt-net1 bash
setting the network namespace "pvt-net1" failed: Operation not permitted

Не получается, не поддаётся. (с) Kuplinov Play

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

Спасибо почитаю статью. Но namespace для меня новая тема, я очень долго буду разбираться самостоятельно и не факт что пойму. Ты не мог бы прямыми примерами что зачем и как?

У меня остались две главные проблемы - как запустить автоматически при загрузке, чтобы в скрипте не спрашивался sudo.

и новая проблема с нежелательным побочным эффектом появилась, довольно кардинальная, почти что шлющая на*ер вообще все эти пространства, настолько она проблема.

Напишу о ней отдельную тему, может хоть прочитает кто.

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

По поводу того как задуманы и работают network namespace есть хорошый перевод статей на хабре

Так я это читал, последнюю часть, когда впервые попробовал, но не получилось. Там совершенно не рассматривались вопросы маршрутизации, из-за чего я не смог ничего настроить и мне помогла только другая статья.

Помимо этого:

ip netns add pvt-net1
ip -n pvt-net1 link set lo up
# добавить пару veth: "to-pvt-net1" в корневом namespace и "from-pvt-net1" в namespace "pvt-net1":
ip link add to-pvt-net1 type veth peer name from-pvt-net1 netns pvt-net1
# Назначить IP и стартануть интерфейс "to-pvt-net1":
ip address add 10.99.99.4/31 dev to-pvt-net1
ip link set to-pvt-net1 up
# Назначить IP и стартануть интерфейс "from-pvt-net1" в namespace "pvt-net1":
ip -n pvt-net1 address add 10.99.99.5/31 dev from-pvt-net1
ip -n pvt-net1 link set from-pvt-net1 up

Надо ещё:

# Необходимо добавить default роутинг в namespace, используя 10.99.99.4 как gateway.
ip -n pvt-net1 route add default via 10.99.99.4
# Избежать использования wireguard при маршрутизации любых пакетов в корневом namespace, которые происходят из  pvt-net1 namespace:
ip rule add from 10.99.99.5 table main priority 99
# включить пересылку пакетов IPv4 в корневом namespace:
sysctl -w net.ipv4.conf.all.forwarding=1
# Добавить правила - разрешить траффик из/в интерфейс "to-pvt-net1":
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 10.99.99.5 -j ACCEPT

# Настроить маскировку (aka SNAT) в корневом namespace для соединений инициированных из других namespace.
# Настроить DNS в созданных namespace
iptables -t nat -A POSTROUTING -s 10.99.99.5 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.99.99.5
iptables -A FORWARD -d 10.99.99.5 -p tcp --dport 8080 -j ACCEPT

Вот такое у меня заработало. Но ещё осталось две больших проблемы.

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

Ты не мог бы прямыми примерами что зачем и как?

«Раскажите мне про квантовую физику в двух словах, чтобы я понял». Это так не работает. Да, network namespace - это не квантовая физика по уровню сложности, но если ты вообще не знаком с тем, как работает сетевой стек в Linux, то просто примеры тебе это понять не помогут - только запутают.

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

Всеобьемлющей статье конкретно под твой случай не будет. Учись декомпозировать задачи на части и применять нужные части статей к своему случаю. И не стесняйся отлаживать промежуточные вещи с помощью tcpdump на разных участках виртуальной сети (так, ты например сможешь понять что где-то у тебя не хватает NAT-а или разрешающего правила в файрволле)

Pinkbyte ★★★★★
()