Теория: Нам нужно создать отдельный network namespace, развернуть там впн и запустить там gui приложение.
Нужно:
- wireguard-tools
- flatpack
Ограничения:
- Пока можно запускать приложения только из flatpack (не разобрался как запустить другие)
NameSpace с интернетом
Название namespace: vpn
bash
- запуск команд вне нового namespace
bash-vpn
- запуск команд в новом namespace
Создание интерфейса в namespace
- Создать новый network namespace
ip netns add vpn
- Создать виртуальную пару интерфейсов
ip link add veth0 type veth peer name veth1
- Привязать один конец интерфейса к namespace
ip link set veth1 netns vpn
- Поднять интерфейс в основном namespace
ip link set veth0 up
- Настроить IP-адрес и маршрут для veth0
ip addr add 10.0.0.1/24 dev veth0
Настройка сети в namespace
- Войти в network namespace
ip netns exec vpn bash
- Поднять интерфейс в namespace
ip link set lo up
ip link set veth1 up
- Назначить IP-адрес интерфейсу внутри namespace
ip addr add 10.0.0.2/24 dev veth1
- Настроить маршрут через интерфейс родительского namespace
ip route add default via 10.0.0.1
- Настроить DNS для namespace
echo "nameserver 8.8.8.8" > /etc/resolv.conf
Настройка NAT (маршрутизация)
- Включить IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
- Настроить NAT для интерфейса. Заменить eth0 на ваш главный интерфейс с интернетом
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
- Сначала создайте интерфейс
sudo ip link add dev wg0 type wireguard
- Затем назначьте IP-адрес. CIDR должен быть как в Wireguard conf
sudo ip addr add 10.0.0.1/24 dev wg0
- Добавляем интерфейс в наш namespace
ip link set wg0 netns vpn
- Добавляем конфиг wireguard
wg setconf wg0 /etc/wireguard/wg0.conf
Если выдает ошибку, то удаляем эту строку из конфига
- Запускаем интерфейс
ip link set wg0 up
Запуск приложений в namespace
Итак. Мы проделали все эти сложные вещи и… Нет. У вас не получиться сразу запустить любое GUI приложение в нашем новом namespace. Если кто-то знает как это починить, то пишите мне на [email protected]. Для запуска приложений нужно установить flatpack и репозиторий flathub. Весь прикол в том что приложения flatpack запускаются в изоляции от системы. И из-за этого (возможно) мы можем запустить их в нашем namespace.
Самым простым способом запустить flatpack приложение это:
- Открыть bash в нашем namespace
ip netns exec vpn bash
- Запустить приложение (В данном случае Chromium)
flatpak run org.chromium.Chromium
Sources:
- ChatGPT 4o
- https://www.wireguard.com/netns/