Обмеження вихідних з'єднань на Інтернет з ufw


ufw - це фронтенд утиліта командного рядка для спрощеного керування правилами iptables; зручна своєю простотою а також тим, що зберігає правила перманентно між системними сесіями.


Як відомо, стандартна конфігурація правил ufw блокує виключно вхідний трафік:


# ufw status verbose
Status: active
...
Default: deny (incoming), allow (outgoing), disabled (routed)
...

Тут, статус `allow (outgoing)` передбачає вихідні з'єднання, що може бути чутливим питанням у випадках, коли сервер має взаємодіяти виключно з мережами Yggdrasil / Mycelium, але його софт реалізує інтерактивний API (наприклад ActivitiPub, BitTorrent / PEX, SMTP, деякі реалізації FTP, тощо) і таким чином, можливі зовнішні звернення в Інтернет через вхідні запити з локальних мереж.


Найпростішим рішенням є блокування усіх вихідних з'єднань поряд з `deny (incoming)` та використання явних правил по білому списку, зокрема для DNS, NTP, apt, git, тощо:


ufw default deny outgoing

Після цього, дозволимо вихід на усі адреси Yggdrasil / Mycelium по відповідному діапазону:


ufw allow out to 0200::/7
ufw allow out to 0400::/7

Для підключення оверлейних мереж вище до публічних вузлів:


ufw allow out to xx.xx.xx.xx port xxxx proto tcp
...

DNS


Далі, дивимось адреси DNS для системного резольвера (наприклад в /etc/systemd/resolved.conf), та додаємо їх до списку; для Cloudflare - це буде 1.1.1.1:53:


ufw allow out to 1.1.1.1 port 53 proto udp

або просто дозволяємо всі можливі:


ufw allow out to any port 53 proto udp

Якщо використовується локальний DNS для Yggdrasil (yggdrasil-network.github.io/services.html#dns) або Mycelium, цей крок можна пропустити, адже вище ми вже дозволили усі вихідні з'єднання на ці мережі.


NTP


Важливо дозволити синхронізацію годинника:


ufw allow out 123/udp

apt


Для системних оновлень, найпростіше підключити локальні дзеркала або проксі, для Yggdrasil це:


Acquire::http::Proxy "http://[xxx:xxxx:xxxx:xxxx::xxxx]:xxxx";
Acquire::https::Proxy "http://[xxx:xxxx:xxxx:xxxx::xxxx]:xxxx";

Для команди `extrepo` на прикладі додавання репозиторію LibreWolf:


https_proxy=http://[xxx:xxxx:xxxx:xxxx::xxxx]:xxxx/ extrepo enable librewolf

Git


git config --global http.proxy http://[xxx:xxxx:xxxx:xxxx::xxxx]:xxxx

Додаючи програмне забезпечення через сторонні проксі, важливо розуміти, що ви отримуєте через них й ключі. Відповідно, маєте усвідомлювати, що такий спосіб отримання системних оновлень може бути потенційно небезпечним і краще користуватись окремими джерелами або власним сервером (у даному випадку - локальним)


Composer


export http_proxy="http://host:port"
export https_proxy="http://host:port"

LXC


В деяких рішеннях контейнеризації, через подібні правила, можуть виникнути проблеми комунікації з гостьовими системами. На прикладі LXC, я описував ситуацію тут:

http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:yggdrasil_in_lxc#дополнительно


systemctl status lxc-net

Якщо бачимо "_Error sending DHCP packet to 10.0.3.133: Operation not permitted_", додаємо відповідні виключення:


ufw allow in on lxcbr0
ufw allow out on lxcbr0

після чого рестартимо сервіс:


systemctl restart lxc-net.service

QEMU / KVM / virt-manager


ufw allow in on virbr0
ufw allow out on virbr0

Замість `on virbr0` можна вказати конкретний локальний IP машини, або діапазон (якщо цей діапазон закріплено саме за віртуальним бріджем)


ufw allow out from 192.168.122.0/24

Якщо використовується обмеження вихідного трафіку на окремий інтерфейс (наприклад VPN на `tun0`) і стандартну політику `route` встановлено як `deny`, то потрібно додати виключення:


ufw route allow in on virbr0 out on tun0

Дивіться також


Блокування прямих з'єднань на Інтернет окрім як через тунель OpenVPN з ufw

Ізоляція Linux від прямих Інтернет з'єднань на базі QEMU / Virtual Machine Manager з VSOCK

Yggdrasil - мережа з децентралізованою маршрутизацією



/uk/