آموزش ایجاد و حذف remote desktop برای vps های لینوکس
برای داشتن remote desktop روی VPS لینوکس دو چیز لازم است: یک محیط دسکتاپ (Xfce یا GNOME) و یک سرویس دسترسی از راه دور (xrdp برای Remote Desktop ویندوز یا TigerVNC برای VNC Viewer). حذف آن برعکس همین است: توقف سرویس، پاک کردن بستهها و برداشتن قانون فایروال.
این آموزش روی AlmaLinux 9 / Rocky Linux 9 و Ubuntu 24.04 LTS نوشته شده و همین دستورها روی Ubuntu 26.04 LTS هم اجرا میشوند؛ CentOS 6، ۷ و ۸ همگی به پایان پشتیبانی رسیدهاند. دقت کنید yum روی EL9 هنوز کار میکند (به dnf لینک شده) و chkconfig هم هنوز نصب است؛ آنچه واقعا رفته نام گروههای قدیمی مثل «KDE (K Desktop Environment)» و «X Window System» است و دسکتاپ سبک از EPEL با نام Xfce میآید. chkconfig vncserver on هم شکست میخورد، چون VNC امروز یونیت قالبی systemd است (vncserver@.service) نه اسکریپت init.
آیا واقعا به محیط گرافیکی روی سرور نیاز دارید؟
مدیریت وبسرور، دیتابیس و فایروال با SSH سادهتر و امنتر است؛ دسکتاپ صدها بسته اضافه، یک سرویس شبکهای باز دیگر و مصرف دائمی RAM و CPU تحمیل میکند و فقط برای نرمافزارهای صرفا گرافیکی توجیه دارد.
پیشنیازها و نصب محیط دسکتاپ
یک سرور با AlmaLinux 9 یا Ubuntu، دسترسی root و کلاینتی روی سیستم خودتان (Remote Desktop Connection ویندوز یا VNC Viewer). GNOME سنگینتر از Xfce است، پس روی سرور مجازی Xfce عاقلانهتر است. سرور مجازی ایران روی زیرساخت VMware با دسترسی کامل مدیریتی، نصب سیستمعامل و اجرای نرمافزار دلخواه را ممکن میکند.
دسکتاپ را همین ابتدا نصب کنید؛ هر دو روش بعدی به آن نیاز دارند. روی AlmaLinux 9 گروه base-x هسته Xorg را میآورد و بدون آن نشست بالا نمیآید:
dnf install -y epel-release
dnf groupinstall -y "Xfce" "base-x"
روی Ubuntu:
apt update
apt install -y xfce4 xfce4-goodies
برای GNOME روی AlmaLinux 9 از dnf group install -y "Server with GUI" و روی Ubuntu از apt install -y ubuntu-desktop-minimal استفاده کنید. نام نشست را از فایلهای موجود بردارید:
ls /usr/share/xsessions/
خروجی چیزی مثل xfce.desktop است و همان نام بدون پسوند را در تنظیمات VNC مینویسید. حالا کاربر معمولی بسازید، چون نباید با root وارد دسکتاپ شوید:
adduser rdpuser
passwd rdpuser
روش اول: xrdp برای اتصال با Remote Desktop ویندوز
کلاینت این روش داخل خود ویندوز هست. روی AlmaLinux 9 حتما xorgxrdp را هم صریح نصب کنید؛ این بسته وابستگی ضعیف است، روی ایمیجهای مینیمال ابری نمیآید و نبودش یعنی خطای connection problem, giving up:
dnf install -y xrdp xorgxrdp
systemctl enable --now xrdp
echo "xfce4-session" > /home/rdpuser/.Xclients
chmod a+x /home/rdpuser/.Xclients
chown rdpuser:rdpuser /home/rdpuser/.Xclients
به نام فایل دقت کنید: روی خانواده RHEL زنجیره startwm.sh و /etc/X11/xinit/Xsession فقط سراغ ~/.Xclients میرود، آن هم با بیت اجرا؛ ~/.xsession قرارداد دبیان است و روی AlmaLinux خوانده نمیشود. روی Ubuntu برعکس:
apt install -y xrdp
adduser xrdp ssl-cert
systemctl enable --now xrdp
echo "startxfce4" > /home/rdpuser/.xsession
chown rdpuser:rdpuser /home/rdpuser/.xsession
مسیر را صریح بنویسید؛ این دستورها با root اجرا میشوند و ~ یعنی /root، پس فایل در خانه اشتباه ساخته میشود و صفحه سیاه میماند. ریاستارت لازم نیست: فایل نشست هنگام لاگین توسط زنجیره Xsession خوانده میشود، نه دیمن xrdp.
xrdp را روی اینترنت باز نگذارید
مقدار پیشفرض port=3389 در /etc/xrdp/xrdp.ini یعنی گوش دادن روی همه اینترفیسها و ufw روی Ubuntu 24.04 پیشفرض غیرفعال است؛ یعنی بلافاصله پس از نصب، یک سرویس RDP رمزعبورمحور هدف حملات brute force است. تونل SSH بهتنهایی این شنونده را محدود نمیکند، پس اول همان خط را عوض کنید:
port=tcp://127.0.0.1:3389
سپس systemctl restart xrdp بزنید و در صورت تمایل ufw deny 3389/tcp را هم اضافه کنید. حالا تونل بزنید و در Remote Desktop Connection ویندوز آدرس 127.0.0.1:3390 را وارد کنید:
ssh -N -L 3390:127.0.0.1:3389 rdpuser@SERVER-IP
پورت محلی عمدا ۳۳۹۰ است: اگر Remote Desktop روی ویندوز خودتان فعال باشد ۳۳۸۹ محلی اشغال است و ssh پیام bind: Address already in use میدهد.
روش دوم: TigerVNC روی AlmaLinux 9
بستههای قدیمی vnc و vnc-server جای خود را به tigervnc-server دادهاند و مدیریت آن با systemd است:
dnf install -y tigervnc-server
su - rdpuser -c vncpasswd
سپس در /etc/tigervnc/vncserver.users نمایشگر را به کاربر نسبت دهید:
:1=rdpuser
در خانه همان کاربر فایل ~/.vnc/config را بسازید؛ دیگر لازم نیست twm & را در xstartup عوض کنید و مقدار session باید با خروجی ls /usr/share/xsessions/ بخواند:
session=xfce
geometry=1280x800
localhost
systemctl enable --now vncserver@:1
پورت VNC برابر است با ۵۹۰۰ بهعلاوه شماره نمایشگر؛ یعنی :1 روی ۵۹۰۱٫ برای خاموش کردن systemctl stop vncserver@:1 را بزنید نه pkill -9 vnc که قفلها را جا میگذارد؛ اگر نمایشگر بالا نیامد، قفلهای جامانده را پاک کنید:
rm -f /tmp/.X1-lock /tmp/.X11-unix/X1
کلمه localhost یعنی VNC فقط روی خود سرور گوش میدهد. رمز VNC هم به هشت کاراکتر محدود است، پس تونل بزنید و در VNC Viewer به 127.0.0.1:5901 وصل شوید:
ssh -N -L 5901:127.0.0.1:5901 rdpuser@SERVER-IP
اگر ناچارید پورت را مستقیم باز کنید، دستکم به IP خودتان محدودش کنید؛ iptables -I INPUT پس از ریبوت پاک میشود، پس سراغ firewalld بروید:
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=YOUR-IP port port=3389 protocol=tcp accept'
firewall-cmd --reload
معادل آن روی Ubuntu ufw allow from YOUR-IP to any port 3389 proto tcp است و در CSF پورت را به TCP_IN در /etc/csf/csf.conf اضافه و csf -r میزنید. ConfigServer از ۳۱ اوت ۲۰۲۵ دیگر فعال نیست و CSF در قالب فورک cpanel/cpanel-csf نگهداری میشود؛ APF هم کنار گذاشته شده. اگر ترجیح میدهید این لایهها را تیم متخصص تنظیم کند، سرور مجازی مدیریتشده ایران با پیکربندی و پشتیبانی فنی کارشناسان آنلاین سرور ارائه میشود.
حذف کامل remote desktop
روی AlmaLinux 9 یا Rocky Linux 9:
systemctl disable --now vncserver@:1
systemctl disable --now xrdp xrdp-sesman
dnf remove -y tigervnc-server xrdp xorgxrdp
dnf group remove -y "Xfce" "base-x"
rm -rf /home/rdpuser/.vnc
rm -f /home/rdpuser/.Xclients
بعد خط :1=rdpuser را از /etc/tigervnc/vncserver.users بردارید تا به شکل rpmsave جا نماند. برای بستههای یتیم هم dnf autoremove را بدون -y بزنید و فهرست را پیش از تایید بخوانید؛ اجرای بیسوال آن میتواند بستههای لازم را هم ببرد. روی Ubuntu:
systemctl disable --now xrdp
apt purge -y xrdp xfce4 xfce4-goodies
apt autoremove --purge
rm -f /home/rdpuser/.xsession
در پایان قانون فایروال را بردارید. rich rule فقط با --remove-rich-rule و همان رشته دقیق حذف میشود؛ --remove-port صرفا --add-port را برمیگرداند و اینجا Warning: NOT_ENABLED میدهد و قانون سر جایش میماند:
firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=YOUR-IP port port=3389 protocol=tcp accept'
firewall-cmd --reload
روی Ubuntu از ufw delete allow from YOUR-IP to any port 3389 proto tcp استفاده کنید و اگر پورت را در CSF باز کرده بودید، ۳۳۸۹ را از TCP_IN حذف و دوباره csf -r بزنید.
خطاهای رایج
صفحه خاکستری یا سیاه: فایل نشست نیست یا در خانه اشتباهی ساخته شده؛ روی AlmaLinux و Rocky باید /home/rdpuser/.Xclients باشد و اجرایی، روی Ubuntu باید /home/rdpuser/.xsession. قطع فوری پس از اتصال: وقتی همان کاربر نشست باز دیگری دارد. Authentication required در Ubuntu: کار polkit است و با یک قانون در /etc/polkit-1/rules.d/ حل میشود. Connection refused: یعنی شنوندهای در دسترس نیست؛ سرویس بالا نیامده (با systemctl status xrdp ببینید) یا فقط روی localhost گوش میدهد و باید تونل بزنید. اگر بهجای رد شدن، اتصال timeout بگیرد، فایروال بستهها را drop میکند.
جمعبندی
دسکتاپ سبک نصب کنید، سرویس را با systemd مدیریت کنید، شنونده را روی ۱۲۷٫۰٫۰٫۱ ببندید و از تونل SSH وصل شوید. برای پروژهای که دائم به محیط گرافیکی نیاز دارد، سرور اختصاصی ایران تمام منابع سختافزاری را کاملا اختصاصی در اختیارتان میگذارد.