# RDP на Linux (GNOME Remote Desktop)

<p class="callout warning">Этот метод подойдет для GUI Gnome с менеджером **Wayland**: встает "болт-он", работает быстрее и стабильнее аналогов.  
**Однако**, с другими GUI и менеджерами сессий могут возникнуть проблемы - там лучше не экспериментировать с GRDP, а рассмотреть аналоги</p>

### Что нужно знать перед установкой

Перед тем как идти по этому мануалу, вам нужно знать **МИНУСЫ** этого подхода:

1. Подключения будет работать только до того момента, пока работает пользовательская сессия. Если пользователь уйдет в Lock-screen, удаленный доступ пропадет
2. MSTSC.exe (удаленный рабочий стол Windows) не сможет работать с этим решением в связи с отсутствием у последнего механизма NLA (Network Layer Authentification). MObaXTerm - тоже не сможет подключиться, как использует MSTSC.exe под капотом
3. GNOME Remote Desktop НЕ является полноценным сервером RDP, и уж тем более не дружит с Windows-way клиентами. С этим решением в целом работает очень мало какое ПО под Windows, но в списке таких звездочек - Remmina и FreeRDP

Из **плюсов** - скорость и стабильность работы (по слухам, я так и не удосужился проверять).

### Установка

**Шаг 1. Установка GRDP**

```bash
apt update
apt install -y gnome-remote-desktop
```

<p class="callout danger">Все дальнейшие шаги будут выполняться от пользователя **user1** (<span style="text-decoration: underline;">не от root!</span>) и **в GUI** (<span style="text-decoration: underline;">не в терминале!</span>)  
</p>

**Шаг 2. Включаем RDP**

```bash
gsettings set org.gnome.desktop.remote-desktop.rdp enable true
```

**Шаг 3. Создание учетных данных для пользователя**

Для создания пользователя, выполняем команду от имени **того, кто будет заходить на сервер** (<span style="text-decoration: underline;">не root!</span>). Например, для <span style="color: rgb(45, 194, 107);">user1</span>:

```bash
su - user1
# Чтобы пароль не светился и не попадал в history:
read -rp "RDP user: " RDP_USER
read -srp "RDP pass: " RDP_PASS; echo
grdctl rdp set-credentials "$RDP_USER" "$RDP_PASS"
unset RDP_USER RDP_PASS
```

**Шаг 4. Разрешаем подключение**

```bash
grdctl rdp enable
# Убираем view-only-mod (блокировка ввода через RDP)
grdctl rdp disable-view-only
# Автозагрузка
systemctl --user enable --now gnome-remote-desktop
```

**Шаг 5. Заранее открываем порт 3389 (пример с UFW)**

Если порт 3389 будет закрыть, подключения не произойдет. Чтобы открыть его через UFW, выполняем:

```bash
sudo ufw allow 3389/tcp
sudo ufw reload
# Посмотреть список правил можно так:
sudo ufw status
```

Шаг 6. Скорее всего, в логах gnome-remote-desktop при первом запуске вы увидите что-то такое:

```yaml
● gnome-remote-desktop.service - GNOME Remote Desktop
     Loaded: loaded (/usr/lib/systemd/user/gnome-remote-desktop.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2026-01-14 20:30:15 MSK; 3min 8s ago
   Main PID: 31760 (gnome-remote-de)
      Tasks: 4 (limit: 9379)
     Memory: 15.4M
        CPU: 319ms
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/gnome-remote-desktop.service
             └─31760 /usr/libexec/gnome-remote-desktop-daemon

янв 14 20:30:15 home-srv-android systemd[1683]: Starting GNOME Remote Desktop...
янв 14 20:30:15 home-srv-android systemd[1683]: Started GNOME Remote Desktop.
янв 14 20:30:15 home-srv-android gnome-remote-de[31760]: RDP TLS certificate and key not configured properly
янв 14 20:32:50 home-srv-android systemd[1683]: Started GNOME Remote Desktop.
янв 14 20:33:23 home-srv-android systemd[1683]: Started GNOME Remote Desktop.
```

И порт 3389 слушаться не будет, сколько бы вы не перезагружали службу.

Проблема тут вот в этой ошибке:

```python
RDP TLS certificate and key not configured properly
```

И тут есть 2 варианта решения проблемы: использовать самоподписанный или нормальный TLS-сертификат.

#### Решение через self-signed TLS

1\. Генерируем самоподписанный сертификат в <span style="color: rgb(45, 194, 107);">~/.local/share/grd</span>:

```bash
mkdir -p ~/.local/share/grd
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
  -keyout ~/.local/share/grd/rdp.key \
  -out ~/.local/share/grd/rdp.crt \
  -subj "/CN=home-srv-android"
chmod 600 ~/.local/share/grd/rdp.key
```

<p class="callout warning">Важно:  
1. Ключ должен быть без пароля (unencrypted PEM);  
2. Файлы должны быть **читаемы пользователем, который будет подключаться** (иначе демон их не прочтет).</p>

<p class="callout info"><span style="color: rgb(255, 255, 255);">Если у вас есть **свой** TLS-сертификат, просто подложите его в директорию:</span>  
<span style="color: rgb(255, 255, 255);">1. **Сертификат:**</span> <span style="color: rgb(45, 194, 107);">~/.local/share/grd/rdp.crt</span>  
<span style="color: rgb(255, 255, 255);">2. **Приватный ключ:**</span> <span style="color: rgb(45, 194, 107);">~/.local/share/grd/rdp.key  
<span style="color: rgb(255, 255, 255);">Или измените команду ниже</span>  
</span></p>

2\. Привязываем его к GRDP:

```bash
grdctl rdp set-tls-cert ~/.local/share/grd/rdp.crt
grdctl rdp set-tls-key  ~/.local/share/grd/rdp.key
grdctl rdp enable
```

3\. Перезапускаем сервис и проверяем, что он запущен

```bash
# Перезапуск делается от имени ЭТОГО ПОЛЬЗОВАТЕЛЯ, А НЕ ROOT!
systemctl --user restart gnome-remote-desktop
# Проверяем статус
grdctl status
# Проверяем, что порт слушается
sudo ss -ltnp | grep -E ':3389'
```

<p class="callout warning">**ВАЖНОЕ ПРАВИЛО!**  
ВСЕ команды типа <span style="color: rgb(255, 255, 255);">grdctl</span> и <span style="color: rgb(255, 255, 255);">systemctl --user</span> выполняются **<span style="text-decoration: underline;">ТОЛЬКО</span>** от того пользователя, кому они предназначены (<span style="text-decoration: underline;">без sudo</span>). В нашем случае, это <span style="color: rgb(255, 255, 255);">user1</span></p>