add linux-isolation-from-direct-internet-connections-based-on-qemu-virtual-machine-manager-with-vsock.gmi

This commit is contained in:
postscriptum 2025-09-25 09:02:19 +03:00
parent 55adcd62b7
commit 53d20e3874
2 changed files with 114 additions and 0 deletions

View file

@ -9,6 +9,7 @@
### Нотатки ### Нотатки
=> linux-isolation-from-direct-internet-connections-based-on-qemu-virtual-machine-manager-with-vsock.gmi 2025-09-25 Ізоляція Linux від прямих Інтернет з'єднань на базі QEMU / Virtual Machine Manager з VSOCK
=> setup-icecast-ezstream-web-radio-on-linux.gmi 2025-09-24 Веб-радіо в Linux: встановлення сервера Icecast та базове налаштування ротації з Ezstream => setup-icecast-ezstream-web-radio-on-linux.gmi 2025-09-24 Веб-радіо в Linux: встановлення сервера Icecast та базове налаштування ротації з Ezstream
=> bypass-js-cookies-anti-bot-on-website-dump-with-wget.gmi 2025-09-18 Копіювання Веб-сайту з обходом анти-бот захисту через wget => bypass-js-cookies-anti-bot-on-website-dump-with-wget.gmi 2025-09-18 Копіювання Веб-сайту з обходом анти-бот захисту через wget
=> setup-anonymous-ftp-server.gmi 2025-09-17 Організація гостьового сервера FTP => setup-anonymous-ftp-server.gmi 2025-09-17 Організація гостьового сервера FTP

View file

@ -0,0 +1,113 @@
# Ізоляція Linux від прямих Інтернет з'єднань на базі QEMU / Virtual Machine Manager з VSOCK
В матеріалі наведено приклад ізоляції віртуальної операційної системи Linux (та відповідно - усіх її програм) від вхідних та вихідних з'єднань в Інтернет, без додаткових правил в iptables. Зв'язок передбачається виключно засобами локальної мережі Yggdrasil з використанням технології VSOCK (https://man7.org/linux/man-pages/man7/vsock.7.html), а Інтернет-інтерфейс - буде відсутній як такий.
Кому потрібен доступ в Інтернет, це можна зробити окремо - засобами локальних проксі DNS та дзеркал репозиторіїв. Тобто, така система не буде "сліпою" та з певними доопрацюваннями буде здатна оновлюватись і взаємодіяти зі світом, але робити це без витоків через дірки софту та пропущені опції в конфігах.
Нижче розглядається налаштування засобами GUI Virtual Machine Manager (https://virt-manager.org), що зручно для десктоп образів. Користувачі CLI, зокрема системні адміністратори - можуть цей допис не читати.
## VSOCK
З документації: технологія VSOCK - забезпечує взаємодію між віртуальними машинами та вузлом, на якому вони виконуються. Це адресне сімейство використовується гостьовими агентами та службами супервізора, яким потрібен канал зв'язку, що не залежить від налаштувань мережі віртуальної машини.
Тобто ми вимикаємо усі мережеві інтерфейси, а для підключення до Yggdrasil - будемо використовувати локальний сокет VSOCK, який розшарено з хосту на гостьову систему (або системи) для побудови його локального дерева маршрутизації.
## Yggdrasil
Так як конфігурація передбачає взаємодію виключно з мережею Yggdrasil, нам потрібно спочатку зібрати версію роутера, яка має підтримку протоколу VSOCK. Я віднайшов форк:
=> https://github.com/nagy/yggdrasil-go/tree/vsock
можливо, він втратить свою актуальність з часом або ж буде включений до апстріму в рамках PR#1223
=> https://github.com/yggdrasil-network/yggdrasil-go/pull/1223
Як на хості, так і на гостьовій системах, збирається наступним чином:
``` bash
git clone https://github.com/nagy/yggdrasil-go.git
cd yggdrasil-go
git checkout vsock
./build
# опціонально встановлюється за призначенням
# install yggdrasil /usr/local/bin/yggdrasil
# install yggdrasilctl /usr/local/bin/yggdrasilctl
```
* тут передбачається, що у вас вже встановлена актуальна версія Go:
=> install-latest-golang-version-on-debian-linux.gmi
Налаштування модифікованого роутера майже нічим не відрізняється від базового, за тим лише виключенням, що на хост машині (де запускаються гостьові віртуалки) потрібно додати прослуховування сокету:
``` /etc/yggdrasil.conf
#/etc/yggdrasil.conf
Listen: [vsock://host:1234]
```
* host - лишаємо саме таким (або можна вказати як ID "2"), порт можете вказати довільний
Перед продовженням, важливо перезапустити роутер Yggdrasil, оскільки потрібно, щоб він забіндився на вказаному інтерфейсі "vsock://host:1234"
## Virtual Machine Manager
Тут вже може бути встановлено операційну систему, тому перед тим як продовжити, запустимо її та встановимо такий само форк Yggdrasil за інструкцією вище.
Після встановлення роутера, Інтернет більше не потрібен, вимикаємо гостьову систему та повертаємось до налаштувань VM. Сторінка налаштувань (Show virtual hardware details) знаходиться там де значок лампи у вікні образу
=> linux-isolation-from-direct-internet-connections-based-on-qemu-virtual-machine-manager-with-vsock/1.png Virtual Machine Manager: Show virtual hardware details
звідки знаходимо NAT (або Route) інтерфейс і видаляємо через контекстне меню "Remove hardware" правим кліком миші; видаляємо всі "девайси" зі значком дво-направленої стрілки, що мають відношення до мережі
=> linux-isolation-from-direct-internet-connections-based-on-qemu-virtual-machine-manager-with-vsock/2.png Virtual Machine Manager: Remove hardware
В низу вікна, натискаємо кнопку "Add hardware"
=> linux-isolation-from-direct-internet-connections-based-on-qemu-virtual-machine-manager-with-vsock/3.png Virtual Machine Manager: Add hardware
шукаємо там "VirtIO VSOCK" та додаємо його до конфігурації з відміченою галкою "Guest CID: Auto"
=> linux-isolation-from-direct-internet-connections-based-on-qemu-virtual-machine-manager-with-vsock/4.png Virtual Machine Manager: VirtIO VSOCK
Тепер можна запустити гостьову систему кнопкою "Power on the virtual machine" і перемкнутись на режим перегляду:
=> linux-isolation-from-direct-internet-connections-based-on-qemu-virtual-machine-manager-with-vsock/5.png Virtual Machine Manager: Power on the virtual machine / Show the graphical console
### Наступні дії виконуються в середині гостьової машини!
Після завантаження, вже має бути відсутній Інтернет - так і треба, але якщо у вас Yggdrasil автоматично запускається з systemd, його інтерфейс (стандартно tun0) має бути активним:
``` bash
ifconfig
# lo
# tun0 - Yggdrasil
```
* тут взагалі я оголошую IfName як "yggdrasil" явно, замість стандартного "auto", щоб випадково не переплутати з динамічними VPN що також ймовірно буде на "tun*"
Нагадаю, форк роутера з підтримкою VSOCK для гостьової системи ми вже встановили раніше, тож додамо наш батьківський "vsock://host:1234" але цього разу не в "Listen" а в "Peers":
``` /etc/yggdrasil.conf
#/etc/yggdrasil.conf
Peers: [vsock://host:1234]
```
* якщо у вас там якісь інші сторонні конекти, можна їх закоментувати - вони все одно більше не працюватимуть.
Перезапускаємо сервіс Yggdrasil та перевіряємо підключення до сокету:
``` bash
sudo yggdrasilctl getpeers
```
вивід має бути приблизно таким:
``` bash
URI State Dir IP Address Uptime RTT RX TX Down Up Pr Cost Last Error
vsock://host:1234 Up Out 200:xxxx:.. 2m59s 1.61ms 1.8KB 0.6KB - - 0 1 -
```
Оверлейний пір батьківського хосту підключено, а отже тепер можна підключатись до всіх вузлів мережі Yggdrasil, без наявності Інтернет в гостьовій системі. Тобто можна безпечно качати торенти з увімкненими DHT, PEX, якщо ви десь в ЄС або просто приватно сьорфити локальну мережу без жодних додаткових налаштувань софта типу PAC для Firefox:
=> safe-yggdrasil-websites-browsing-with-yggstack.gmi Безпечний перегляд сайтів Yggdrasil з Yggstack
Про те, як налаштувати локальний DNS і репозиторії, щоб зробити систему здатною до оновлень (через локальні проксі) - згодом. Стосовно DNS, я частково описував свою конфігурацію в матеріалі:
=> my-alfis-dns-preset-on-yggdrasil-mycelium-router.gmi Мій пресет Alfis DNS на роутері Yggdrasil / Mycelium
звідки можна взяти приклади, замінивши Інтернет резольвери на локальні:
=> https://yggdrasil-network.github.io/services.html#dns
Взагалі думки такі, що було б не погано мати готовий образ системи, що адаптований для роботи виключно засобами певних локальних мереж. Але це вже інша історія.