Теория: Нам нужно создать отдельный network namespace, развернуть там впн и запустить там gui приложение.

Нужно:

Ограничения:

  • Пока можно запускать приложения только из flatpack (не разобрался как запустить другие)

NameSpace с интернетом

Название namespace: vpn

bash - запуск команд вне нового namespace

bash-vpn - запуск команд в новом namespace

Создание интерфейса в namespace

  1. Создать новый network namespace
bash
ip netns add vpn
  1. Создать виртуальную пару интерфейсов
bash
ip link add veth0 type veth peer name veth1
  1. Привязать один конец интерфейса к namespace
bash
ip link set veth1 netns vpn
  1. Поднять интерфейс в основном namespace
bash
ip link set veth0 up
  1. Настроить IP-адрес и маршрут для veth0
bash
ip addr add 10.0.0.1/24 dev veth0

Настройка сети в namespace

  1. Войти в network namespace
bash
ip netns exec vpn bash
  1. Поднять интерфейс в namespace
bash-vpn
ip link set lo up
ip link set veth1 up
  1. Назначить IP-адрес интерфейсу внутри namespace
bash-vpn
ip addr add 10.0.0.2/24 dev veth1
  1. Настроить маршрут через интерфейс родительского namespace
bash-vpn
ip route add default via 10.0.0.1
  1. Настроить DNS для namespace
bash-vpn
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Настройка NAT (маршрутизация)

  1. Включить IP forwarding
bash
echo 1 > /proc/sys/net/ipv4/ip_forward
  1. Настроить NAT для интерфейса. Заменить eth0 на ваш главный интерфейс с интернетом
bash
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE

Настройка wireguard внутри namespace

Tips:

  • Поле AllowedIPs должно быть 0.0.0.0\0 (для ip6 можно оставить тоже)
  • Основная идея в том чтобы запустить впн внутри namespace
  1. Сначала создайте интерфейс
bash-vpn
sudo ip link add dev wg0 type wireguard
  1. Затем назначьте IP-адрес. CIDR должен быть как в Wireguard conf
bash-vpn
sudo ip addr add 10.0.0.1/24 dev wg0
  1. Добавляем интерфейс в наш namespace
bash-vpn
ip link set wg0 netns vpn
  1. Добавляем конфиг wireguard
bash-vpn
wg setconf wg0 /etc/wireguard/wg0.conf

Если выдает ошибку, то удаляем эту строку из конфига

  1. Запускаем интерфейс
bash-vpn
ip link set wg0 up

Запуск приложений в namespace

Итак. Мы проделали все эти сложные вещи и… Нет. У вас не получиться сразу запустить любое GUI приложение в нашем новом namespace. Если кто-то знает как это починить, то пишите мне на [email protected]. Для запуска приложений нужно установить flatpack и репозиторий flathub. Весь прикол в том что приложения flatpack запускаются в изоляции от системы. И из-за этого (возможно) мы можем запустить их в нашем namespace.

Самым простым способом запустить flatpack приложение это:

  • Открыть bash в нашем namespace
bash
ip netns exec vpn bash
  • Запустить приложение (В данном случае Chromium)
bash-vpn
flatpak run org.chromium.Chromium

Sources: