بلاگ/راه‌اندازی دسکتاپ گرافیکی (VNC) روی سرور مجازی و اختصاصی: نصب، اتصال امن و اجرا به‌صورت سرویس
به‌روز شده

راه‌اندازی دسکتاپ گرافیکی (VNC) روی سرور مجازی و اختصاصی: نصب، اتصال امن و اجرا به‌صورت سرویس

1405/08/220 بازدید
راه‌اندازی دسکتاپ گرافیکی (VNC) روی سرور مجازی و اختصاصی: نصب، اتصال امن و اجرا به‌صورت سرویس

راه‌اندازی دسکتاپ گرافیکی (VNC) روی سرور مجازی و اختصاصی: نصب، اتصال امن و اجرا به‌صورت سرویس

راه‌اندازی دسکتاپ گرافیکی VNC روی سرور مجازی و اختصاصی

سرور لینوکسی به‌طور پیش‌فرض محیط گرافیکی ندارد و همه‌چیز از طریق ترمینال انجام می‌شود. اما بعضی کارها، مثل تست یک مرورگر، اجرای یک نرم‌افزار قدیمی با رابط گرافیکی، یا باز کردن یک فایل که فقط با یک ابزار دسکتاپی خوانده می‌شود، بدون دسکتاپ گرافیکی سخت‌اند. راه‌اندازی دسکتاپ گرافیکی روی سرور مجازی با VNC همین مشکل را حل می‌کند، بدون این‌که سیستم‌عامل سرور را عوض کنید.

دسکتاپ گرافیکی روی سرور یعنی چه؟

VNC یک پروتکل اشتراک صفحه است: یک سرور VNC روی لینوکس یک محیط گرافیکی مجازی می‌سازد و همان صفحه را برای یک برنامهٔ کلاینت روی کامپیوتر شما پخش می‌کند. چیزی شبیه Remote Desktop ویندوز، با این تفاوت که روی لینوکس باید هم محیط دسکتاپ (مثلا Xfce) و هم سرور VNC را خودتان نصب کنید؛ هیچ‌کدام پیش‌فرض سیستم نیست.

برای این کار دو چیز لازم است: یک محیط دسکتاپ سبک مثل Xfce که منابع کمی مصرف می‌کند و روی یک VPS با ۱-۲ گیگ رم هم راحت بالا می‌آید، و یک سرور VNC مثل TightVNC که همان دسکتاپ را روی شبکه در دسترس می‌گذارد.

نصب Xfce و TightVNC

روی اوبونتو یا دبیان، نصب با چند دستور apt تمام می‌شود:

sudo apt update
sudo apt install xfce4 xfce4-goodies tightvncserver -y

نصب کامل Xfce چند دقیقه طول می‌کشد چون کلی پکیج وابسته دارد. اگر فقط به یک دسکتاپ خیلی سبک نیاز دارید و می‌خواهید نصب سریع‌تر باشد، xfce4 به‌تنهایی (بدون xfce4-goodies) هم کار می‌کند، فقط چند ابزار جانبی مثل مدیر فایل گرافیکی و تم‌های اضافه را کم دارید.

محیط دسکتاپ Xfce باز شده روی یک پنجره ترمینال VNC

روی سرورهای CentOS/Rocky به‌جای apt از dnf install epel-release و بعد dnf groupinstall "Xfce" استفاده می‌شود؛ نام پکیج‌ها فرق دارد اما منطق همان است.

اولین اجرا و تنظیم Xfce به‌عنوان دسکتاپ پیش‌فرض

برای اولین بار دستور زیر را اجرا کنید تا رمز VNC تنظیم شود و یک session تستی بالا بیاید:

vncserver

یک رمز بین ۶ تا ۸ کاراکتر می‌پرسد؛ همین رمز برای اتصال از کلاینت لازم است، جدا از رمز کاربر لینوکس. بعد از آن session را با vncserver -kill :1 ببندید و فایل راه‌اندازی را ویرایش کنید تا به‌جای دسکتاپ پیش‌فرض، Xfce بالا بیاید:

nano ~/.vnc/xstartup

محتوای فایل را به این شکل بنویسید:

#!/bin/sh
xrdb $HOME/.Xresources
startxfce4 &

و اجرایی‌اش کنید:

chmod +x ~/.vnc/xstartup
vncserver :1 -geometry 1280x800 -depth 24

عدد بعد از : شماره display است؛ پورت واقعی آن 5900 + همین عدد است، یعنی display 1 روی پورت 5901 گوش می‌دهد.

اتصال امن: چرا تونل SSH، نه باز کردن پورت VNC

خود پروتکل VNC رمزنگاری قوی ندارد و رمز را هم می‌شود با brute force زد، پس باز گذاشتن پورت 5901 رو به اینترنت ریسک امنیتی دارد. راه درست این است که فقط پورت 22 (SSH) باز بماند و اتصال VNC از داخل یک تونل SSH رد شود:

روش اتصالپورت باز رو به اینترنتریسک
باز کردن مستقیم پورت 59015901 علاوه بر 22قابل اسکن و brute force از هر جای اینترنت
تونل SSH (روش توصیه‌شده)فقط 22ترافیک VNC درون همان اتصال رمزنگاری‌شدهٔ SSH است، پورت VNC از بیرون دیده نمی‌شود

از کامپیوتر خودتان این دستور را بزنید:

ssh -L 5901:127.0.0.1:5901 user@server-ip

این دستور پورت 5901 روی کامپیوتر شما را به پورت 5901 روی سرور وصل می‌کند، از داخل همان اتصال SSH. بعد در برنامهٔ VNC Viewer آدرس 127.0.0.1:5901 را وارد کنید، نه آی‌پی سرور. فایروال سرور هم باید فقط 22، 80 و 443 را باز نگه دارد؛ راهنمای راه‌اندازی فایروال nftables روی سرور لینوکس مراحل بستن بقیهٔ پورت‌ها را نشان می‌دهد. اگر هنوز با کلید SSH وارد نشده‌اید، قبل از این مرحله این راهنما را هم ببینید.

اجرای VNC به‌عنوان سرویس systemd

با روش بالا، بعد از هر ری‌استارت سرور باید دوباره دستی vncserver را اجرا کنید. برای این‌که دسکتاپ گرافیکی همیشه در دسترس باشد، بهتر است VNC را یک سرویس systemd کنید. یک فایل در مسیر /etc/systemd/system/vncserver@.service بسازید:

[Unit]
Description=TightVNC server on display %i
After=network.target

[Service]
Type=forking
User=vncuser
PAMName=login
PIDFile=/home/vncuser/.vnc/%H%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :%i
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target

User=vncuser را با نام کاربر واقعی خودتان عوض کنید. بعد سرویس را برای display شماره 1 فعال کنید:

sudo systemctl daemon-reload
sudo systemctl enable --now vncserver@1.service
sudo systemctl status vncserver@1.service

از این به بعد VNC با هر بوت سرور بالا می‌آید و اگر session کرش کند، ExecStartPre قبل از شروع دوباره آن را تمیز می‌کند. اگر نگران مصرف منابع این سرویس هستید، محدود کردن مصرف CPU و RAM سرویس‌ها با systemd و cgroups نشان می‌دهد چطور برای همین سرویس یک سقف مصرف بگذارید.

نکته: این با VNC کنسول رزکیو پنل فرق دارد

اگر قبلا یک گزینهٔ «VNC Console» در پنل مدیریت سرور دیده‌اید، آن یک قابلیت جداست؛ برای وصل شدن به کنسول سرور وقتی شبکه یا SSH از کار افتاده استفاده می‌شود، نه برای یک دسکتاپ گرافیکی کامل برای کار روزانه. جزئیات آن در Rescue Mode و کنسول VNC روی سرور ابری آمده. چیزی که در این مطلب نصب کردیم، یک محیط Xfce کامل است که از طریق تونل SSH به آن وصل می‌شوید، نه کنسول اضطراری پنل.

سرور مجازی یا سرور اختصاصی، کدام برای این کار بهتر است؟

برای یک دسکتاپ گرافیکی با یک session فعال، یک سرور مجازی با ۲ گیگ رم کافی است؛ اگر چند کاربر هم‌زمان session گرافیکی جدا می‌خواهند یا برنامه‌های سنگین‌تر مثل IDE و مرورگرهای پرمصرف باز می‌کنید، منابع ثابت یک سرور اختصاصی راحت‌تر جواب می‌دهد. اگر هنوز بین این دو مطمئن نیستید، مراحل خرید و راه‌اندازی سرور مجازی نقطهٔ شروع خوبی است.

جمع‌بندی

نصب Xfce و TightVNC چند دستور بیشتر نیست؛ نکته‌های مهم، تنظیم xstartup برای بالا آمدن Xfce، رد کردن اتصال از تونل SSH به‌جای باز گذاشتن پورت VNC، و تعریف آن به‌عنوان سرویس systemd برای ماندگاری بعد از ری‌استارت است. با همین سه مرحله یک دسکتاپ گرافیکی همیشه آماده روی سرور دارید.

برای شروع سریع با یک سرور مجازی آریانت این راه‌اندازی در چند دقیقه تمام می‌شود؛ برای کاری که منابع ثابت و بیشتری می‌خواهد، سرور اختصاصی آریانت گزینهٔ بهتری است.

سؤالات متداول

آیا می‌توانم به‌جای Xfce از دسکتاپ‌های سنگین‌تر مثل GNOME استفاده کنم؟ می‌شود، اما GNOME رم و CPU بیشتری می‌خواهد و روی یک VPS با منابع محدود کند می‌شود. Xfce برای اتصال از راه دور روی سرور، انتخاب رایج‌تری است.

چرا بعد از اتصال VNC صفحه خاکستری یا خالی می‌بینم؟ معمولا یعنی فایل ~/.vnc/xstartup هنوز Xfce را اجرا نمی‌کند یا اجرایی نیست. خطوط فایل را دوباره چک کنید و با chmod +x مطمئن شوید قابل اجراست.

آیا لازم است برای هر کاربر یک display جدا بسازم؟ اگر چند کاربر هم‌زمان session گرافیکی جدا می‌خواهند، بله؛ هرکدام با شماره display متفاوت (مثلا :1، :2) و سرویس systemd جدا (vncserver@2.service) اجرا می‌شوند.

آیا این روش روی سرور اختصاصی هم همین‌قدر ساده است؟ بله، دستورهای نصب و تنظیم یکسان‌اند؛ تفاوت فقط در منابع در دسترس است، نه در مراحل نصب Xfce، TightVNC یا سرویس systemd.