# Обмеження вихідних з'єднань на Інтернет з ufw *`ufw` - це фронтенд утиліта командного рядка для спрощеного керування правилами `iptables`; зручна своєю простотою а також тим, що зберігає правила перманентно між системними сесіями.* Як відомо, стандартна конфігурація правил `ufw` блокує виключно вхідний трафік: ``` bash # ufw status verbose Status: active ... Default: deny (incoming), allow (outgoing), disabled (routed) ... ``` Тут, статус `allow (outgoing)` передбачає вихідні з'єднання, що може бути чутливим питанням у випадках, коли сервер має взаємодіяти виключно з мережами [Yggdrasil](https://devzone.org.ua/post/yggdrasil-mereza-z-detsentralizovanym-routynhom) / [Mycelium](https://devzone.org.ua/post/vstanovlennia-routera-merezi-mycelium-v-linux), але його софт реалізує інтерактивний API (наприклад ActivitiPub, BitTorrent / PEX, SMTP, деякі реалізації FTP, тощо) і таким чином, можливі зовнішні звернення в Інтернет через вхідні запити з локальних мереж. Найпростішим рішенням є блокування усіх вихідних з'єднань поряд з `deny (incoming)` та використання явних правил по білому списку, зокрема для DNS, NTP, apt, git, тощо: ``` bash ufw default deny outgoing ``` Після цього, дозволимо вихід на усі адреси Yggdrasil / Mycelium по відповідному діапазону: ``` bash ufw allow out to 0200::/7 ufw allow out to 0400::/7 ``` * можна явно задати порт, наприклад `... port 80 proto tcp` Для підключення оверлейних мереж вище до публічних вузлів: ``` bash ufw allow out to xx.xx.xx.xx port xxxx proto tcp ... ``` ## DNS Далі, дивимось адреси DNS для системного резольвера (наприклад в `/etc/systemd/resolved.conf`), та додаємо їх до списку; для Cloudflare - це буде `1.1.1.1:53`: ``` bash ufw allow out to 1.1.1.1 port 53 proto udp ``` або просто дозволяємо всі можливі: ``` bash ufw allow out to any port 53 proto udp ``` Якщо використовується [локальний DNS для Yggdrasil](https://yggdrasil-network.github.io/services.html#dns) або Mycelium, цей крок можна пропустити, адже вище ми вже дозволили усі вихідні з'єднання на ці мережі. ## NTP Важливо дозволити синхронізацію годинника: ``` bash ufw allow out 123/udp ``` ## apt Для системних оновлень, найпростіше підключити локальні дзеркала або проксі, для Yggdrasil це: ``` /etc/apt/apt.conf.d/proxy.conf #/etc/apt/apt.conf.d/proxy.conf Acquire::http::Proxy "http://[xxx:xxxx:xxxx:xxxx::xxxx]:xxxx"; Acquire::https::Proxy "http://[xxx:xxxx:xxxx:xxxx::xxxx]:xxxx"; ``` Для команди `extrepo` на прикладі додавання репозиторію LibreWolf: ``` bash https_proxy=http://[xxx:xxxx:xxxx:xxxx::xxxx]:xxxx/ extrepo enable librewolf ``` * або/і `http_proxy` ## Git ``` bash git config --global http.proxy http://[xxx:xxxx:xxxx:xxxx::xxxx]:xxxx ``` * або/і `https.proxy` Додаючи програмне забезпечення через сторонні проксі, важливо розуміти, що ви отримуєте через них й ключі. Відповідно, маєте усвідомлювати, що такий спосіб отримання системних оновлень може бути потенційно небезпечним і краще користуватись окремими джерелами або власним сервером (у даному випадку - локальним) ## LXC В деяких рішеннях контейнеризації, через подібні правила, можуть виникнути проблеми комунікації з гостьовими системами. На прикладі LXC, я описував ситуацію [тут](http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:yggdrasil_in_lxc#дополнительно): ``` bash systemctl status lxc-net ``` Якщо бачимо "_Error sending DHCP packet to 10.0.3.133: Operation not permitted_", додаємо відповідні виключення: ``` bash ufw allow in on lxcbr0 ufw allow out on lxcbr0 ``` після чого рестартимо сервіс: ``` bash systemctl restart lxc-net.service ``` ## QEMU / KVM / virt-manager ``` bash ufw allow in on virbr0 ufw allow out on virbr0 ``` Замість `on virbr0` можна вказати конкретний локальний IP машини, або діапазон (якщо цей діапазон закріплено саме за віртуальним бріджем) ``` bash ufw allow out from 192.168.122.0/24 ``` Якщо використовується [обмеження вихідного трафіку на окремий інтерфейс](https://devzone.org.ua/post/blokuvannia-priamykh-zyednan-na-internet-okrim-iak-cherez-tunel-openvpn-z-ufw) (наприклад VPN на `tun0`) і стандартну політику `route` встановлено як `deny`, то потрібно додати виключення: ``` bash ufw route allow in on virbr0 out on tun0 ``` * де `tun0` - ваш інтерфейс ## Дивіться також * [Ізоляція Linux від прямих Інтернет з'єднань на базі QEMU / Virtual Machine Manager з VSOCK](https://devzone.org.ua/post/izoliatsiia-linux-vid-priamykh-internet-zyednan-na-bazi-qemu-virtual-machine-manager-i-vsock)