Удалённый доступ: RustDesk vs Apache Guacamole — что выбрать и как настроить на FreeBSD

Автор: Raven2000 , 20 апреля 2026
Guacamole

Если раньше ответ на вопрос удалённого доступа был прост — поднять VPN, — то сегодня провайдеры и корпоративные файрволы научились детектировать WireGuard по handshake, IKEv2 по сигнатурам, а OpenVPN — по поведению трафика. Рвут соединение, режут скорость, блокируют на уровне протокола, а не IP. Нужны другие инструменты. Разберём два современных решения и покажем, как поднять оба в jail на FreeBSD 15 с Bastille.


Почему VPN больше не панацея

Классическая связка «VPN + RDP» работала, пока провайдеры не научились различать трафик. Сегодня у неё три системных недостатка:

  • Весь трафик клиента идёт через сервер — нагрузка на канал растёт кратно числу пользователей

  • Блокировка протокола, а не IP — даже нестандартные порты детектируются по handshake и поведению сессии

  • Мобильные устройства — постоянно включённый VPN разряжает батарею и конфликтует с корпоративными MDM-политиками

VPN сегодня — узкоспециализированный инструмент для объединения сетей site-to-site, а не для ежедневного удалённого администрирования.


Сравнение инструментов

КритерийApache GuacamoleRustDesk (self-hosted)VPN + RDP
Клиент у пользователяТолько браузерАгент на каждом ПКVPN-клиент + RDP
Агент на сервереНе нуженНужен на каждом хостеНе нужен
Открытые портыHTTPS 443TCP/UDP 21115–21117VPN-порт
Обход DPIОтлично (HTTPS)Хорошо (свой протокол)Плохо
Скорость графикиСредняя (браузер)Высокая (нативный клиент)Высокая
FreeBSD JailДаДаДа
ПротоколыRDP, SSH, VNCСобственныйRDP, SSH
Старт без БДДа (user-mapping.xml)Да

Архитектура: оба сервиса в jail

Мы помещаем и Guacamole, и RustDesk в отдельные jail — это наш стандарт: изоляция, снапшоты, минимальный периметр атаки. Снаружи торчит только один порт — 443, который обслуживает Caddy в отдельном jail-реверс-прокси.

Интернет
    │
  vtnet0 (внешний IP)
    │
  PF (только 443 + RustDesk порты)
    │
  ┌────────────────────────────────────┐
  │  bastille0 (10.0.0.0/24)          │
  │                                    │
  │  caddy     10.0.0.10  :443        │
  │  guac      10.0.0.11  :8080       │
  │  rustdesk  10.0.0.12  :21115+     │
  └────────────────────────────────────┘

Caddy — наш выбор вместо Nginx: автоматически получает и обновляет TLS-сертификаты Let's Encrypt, конфиг в 3 строки, нет отдельного модуля для WebSocket — всё работает из коробки.


Шаг 1: Создание jail

bastille create caddy    15.0-RELEASE 10.0.0.10
bastille create guac     15.0-RELEASE 10.0.0.11
bastille create rustdesk 15.0-RELEASE 10.0.0.12

Шаг 2: Apache Guacamole в jail

Установка

bastille pkg guac install guacamole-server guacamole-client tomcat11

bastille sysrc guac guacd_enable="YES"
bastille sysrc guac tomcat11_enable="YES"

bastille service guac guacd start
bastille service guac tomcat11 start

guacd — прокси-демон на C, Tomcat поднимает веб-приложение на Java. Оба живут внутри jail и не видны снаружи.

Настройка user-mapping.xml (быстрый старт без БД)

Заходим в jail и создаём конфиг пользователей:

bastille console guac
vi /usr/local/etc/guacamole-client/user-mapping.xml
<user-mapping>
    <authorize username="admin" password="yourpassword">

        <!-- SSH подключение к серверу -->
        nection name="server01-ssh">
            <protocol>ssh</protocol>
            <param name="hostname">192.168.1.10</param>
            <param name="port">22</param>
            <param name="username">root</param>
        </connection>

        <!-- RDP к Windows-машине -->
        nection name="win-desktop">
            <protocol>rdp</protocol>
            <param name="hostname">192.168.1.20</param>
            <param name="port">3389</param>
            <param name="username">Administrator</param>
            <param name="ignore-cert">true</param>
        </connection>

    </authorize>
</user-mapping>

Когда пользователей станет больше трёх — переедем на MariaDB с ролями и 2FA. Это тема отдельной статьи.

guacamole.properties

vi /usr/local/etc/guacamole-client/guacamole.properties
guacd-hostname: localhost
guacd-port:     4822
user-mapping:   /usr/local/etc/guacamole-client/user-mapping.xml

Перезапускаем Tomcat — Guacamole доступен на http://10.0.0.11:8080/guacamole/ внутри bastille-сети.


Шаг 3: RustDesk Server в jail

bastille pkg rustdesk install rustdesk-server

bastille sysrc rustdesk hbbs_enable="YES"
bastille sysrc rustdesk hbbr_enable="YES"

bastille service rustdesk hbbs start
bastille service rustdesk hbbr start

Получаем публичный ключ для клиентов:

bastille console rustdesk
cat /var/db/rustdesk-server/id_ed25519.pub

Этот ключ вводится в клиенте RustDesk: Настройки → Сеть → ID/Relay Server — указываешь внешний IP и ключ. После этого клиент работает только через твой сервер.


Шаг 4: Caddy как реверс-прокси

Установка

bastille pkg caddy install caddy
bastille sysrc caddy caddy_enable="YES"

Caddyfile

Caddy сам получит сертификат Let's Encrypt при первом запуске — никаких certbot, никаких cron-задач:

bastille console caddy
vi /usr/local/etc/caddy/Caddyfile

guac.yourdomain.ru {
    redir / /guacamole/ 308
    reverse_proxy 10.0.0.11:8080 {
        flush_interval -1
    }
}

flush_interval -1 — критически важная опция для Guacamole: отключает буферизацию, иначе WebSocket-туннель работает с задержками.

bastille service caddy caddy start

Шаг 5: PF — открываем только нужное

vi /etc/pf.conf
ext_if="vtnet0"

set block-policy return
scrub in on $ext_if all fragment reassemble
set skip on lo

table <jails> persist
nat on $ext_if from <jails> to any -> ($ext_if:0)
rdr-anchor "rdr/*"

block in all
pass out quick keep state
antispoof for $ext_if inet

# SSH на хост
pass in inet proto tcp from any to any port 22 flags S/SA keep state

# Caddy — единая точка входа для Guacamole
pass in inet proto tcp from any to any port 443 flags S/SA keep state

# RustDesk — собственный протокол
pass in inet proto tcp from any to any port {21115 21116 21117 21118 21119} flags S/SA keep state
pass in inet proto udp from any to any port 21116 keep state

Проброс через Bastille:

# Caddy принимает снаружи
bastille rdr caddy tcp 443 443

# RustDesk relay порты
bastille rdr rustdesk tcp 21115 21115
bastille rdr rustdesk tcp 21116 21116
bastille rdr rustdesk tcp 21117 21117
bastille rdr rustdesk udp 21116 21116

Управление — шпаргалка

ЗадачаКоманда
Войти в jailbastille console guac
Логи Tomcatbastille console guactail -f /var/log/tomcat11/catalina.out
Снапшот перед изменениямиbastille zfs guac snapshot pre_update
Откатитьсяbastille zfs guac rollback pre_update
Рестарт Guacamolebastille service guac tomcat11 restart
Рестарт RustDeskbastille service rustdesk hbbs restart

Когда что выбирать

Apache Guacamole — выбор для администрирования серверной инфраструктуры. Ты открываешь только HTTPS 443 через Caddy, не ставишь агентов на серверы и получаешь единую точку входа ко всем хостам через браузер. Работает с любого устройства — хоть с телефона.

RustDesk — выбор для поддержки пользовательских рабочих мест с GUI, там где важна скорость отклика и простота для клиента. Свой сервер в jail даёт полный контроль над данными без зависимости от публичной инфраструктуры.

Оба решения без проблем проходят через корпоративные файрволы там, где VPN уже заблокирован — и оба живут на FreeBSD в jail, как и должно быть.


📌 Нужна помощь с настройкой Guacamole или RustDesk под вашу инфраструктуру? Пишите.

🔹 Telegram: UNIX_RUS
🔹 VK: vk.com/cio_ignatiev

Комментарии