mirror of
https://codeberg.org/postscriptum/gemlog.git
synced 2026-02-19 06:22:41 +00:00
113 lines
No EOL
10 KiB
Text
113 lines
No EOL
10 KiB
Text
# Ізоляція 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
|
||
|
||
Взагалі думки такі, що було б не погано мати готовий образ системи, що адаптований для роботи виключно засобами певних локальних мереж. Але це вже інша історія. |