آموزش کار با VNC

VNC یا Virtual Network Computing یک پروتکل دسترسی گرافیکی از راه دور است که تصویر خام صفحه سرور را برای شما می‌فرستد و در مقابل، حرکت موس و کلیدهای شما را به سرور برمی‌گرداند. نسخه پایه این پروتکل رمزنگاری ندارد، بنابراین هرگز نباید پورت آن را مستقیم روی اینترنت باز بگذارید؛ راه درست این است که سرویس را به 127.0.0.1 محدود کنید و از یک تونل SSH عبور کنید.

VNC دقیقا چه کاری انجام می‌دهد؟

پروتکل زیربنایی VNC نامش RFB است، سرنام Remote Framebuffer. منطق کارش ساده است: سرور محتوای بافر تصویر — همان چیزی که روی صفحه رسم شده — را به شکل مستطیل‌های پیکسلی برای کلاینت می‌فرستد و کلاینت رویدادهای ورودی را پس می‌فرستد. چون هیچ فرضی درباره سیستم‌عامل در کار نیست، VNC روی لینوکس، ویندوز، مک و حتی کنسول مجازی‌سازها کار می‌کند. هزینه این سادگی هم مشخص است: چون پیکسل جابه‌جا می‌شود نه دستور رسم، پهنای باند بیشتری می‌خورد و کندتر از RDP حس می‌شود؛ برای اینکه بدانید خط سرورتان واقعاً چه ظرفیتی دارد، تست سرعت شبکه سرور را روی همان ماشین بگیرید. در عمل، بیشتر کسانی که سراغ VNC می‌آیند یک سرور مجازی لینوکسی بدون میز کار گرافیکی دارند؛ چون روی چنین سرویسی دسترسی روت کامل در اختیارتان است، می‌توانید بسته‌های دسکتاپ و خود سرور VNC را خودتان نصب کنید.

تفاوت با RDP و SSH

  • RDP پروتکل بومی ویندوز است؛ به‌جای پیکسل، دستورهای رسم و منابع جانبی مثل کلیپ‌بورد را منتقل می‌کند، جلسه مستقل می‌سازد و در پیاده‌سازی مایکروسافت روی TLS سوار می‌شود. اگر سرورتان ویندوز است، RDP گزینه طبیعی شماست نه VNC. هرچند ویندوز سرور تا وقتی نقش Remote Desktop Services روی آن نصب نشده باشد فقط دو نشست هم‌زمان می‌پذیرد و پر شدن این ظرفیت به خطای The terminal server has exceeded the maximum number of allowed connections ختم می‌شود.
  • SSH متنی است، رمزنگاری‌شده و با احراز هویت کلیدی. برای بیشتر کارهای مدیریت سرور همین کافی است و از هر راه گرافیکی سبک‌تر و امن‌تر عمل می‌کند. اگر هنوز با آن کار نکرده‌اید، راهنمای اتصال به SSH لینوکس نقطه شروع درستی است.
  • VNC وقتی معنا پیدا می‌کند که واقعا محیط گرافیکی لازم دارید، یا باید دقیقا همان صفحه‌ای را ببینید که کاربر دیگری روبه‌رویش نشسته است.

چرا VNC خام ناامن است

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

نتیجه عملی روشن است: پورت‌های 5900 به بالا هدف همیشگی اسکنرهای خودکارند و سرویس VNC که مستقیم روی IP عمومی گوش بدهد خیلی زود پیدا می‌شود. بستن این محدوده روی فایروال سرور هم لازم است؛ روش کار در راهنمای نصب و کانفیگ فایروال CSF آمده است. تونل SSH یا محدودکردن به localhost اختیاری نیست، بخشی از راه‌اندازی است.

پیش‌نیازها

  • دسترسی SSH با یک کاربر عادی که sudo دارد. جلسه VNC را با کاربر root اجرا نکنید.
  • یک محیط گرافیکی سبک روی سرور، مثل Xfce. نصب‌های مینیمال هیچ دسکتاپی ندارند و بدون آن فقط صفحه خاکستری می‌بینید. روی یک سرور مجازی ایران انتخاب دسکتاپ سبک به‌جای نسخه کامل GNOME تفاوت محسوسی در مصرف رم می‌سازد.
  • یک ویور به‌روز روی سیستم خودتان: TigerVNC Viewer، Remmina یا RealVNC Viewer. آموزش‌های قدیمی معمولا TightVNC را پیشنهاد می‌کنند؛ آن هم هنوز کار می‌کند، اما TigerVNC فعال‌تر نگه‌داری می‌شود و از انواع امنیتی مبتنی بر TLS پشتیبانی دارد.

راه‌اندازی جلسه روی سرور لینوکسی

بسته سرور را نصب کنید. روی خانواده رد هت (AlmaLinux، Rocky) با sudo dnf install tigervnc-server و روی اوبونتو و دبیان با sudo apt install tigervnc-standalone-server tigervnc-common.

سپس با کاربر عادی خودتان رمز جلسه را بسازید: vncpasswd. این رمز جدا از رمز حساب سیستم است و نباید همان رمز پنل یا SSH باشد. بعد فایل ~/.vnc/config را بسازید و دسکتاپ، رزولوشن و محدودیت شنود را در آن مشخص کنید، مثلا سه خط session=xfce و geometry=1280x800 و localhost.

برای اجرای دستی: vncserver -localhost yes :1. شماره نمایش مستقیما به پورت ترجمه می‌شود؛ :1 یعنی پورت 5901، :2 یعنی 5902 و همین‌طور ادامه دارد. برای اجرای دائمی روی خانواده رد هت، در فایل /etc/tigervnc/vncserver.users خطی مثل :1=username اضافه کنید و بعد sudo systemctl enable --now vncserver@:1 را بزنید. توجه کنید که این فایل و آن یونیت بخشی از بسته‌بندی رد هت هستند؛ روی اوبونتو و دبیان چنین فایلی وجود ندارد و باید یونیت systemd را خودتان در /etc/systemd/system/ بنویسید.

اگر در راهنمایی به ویرایش /etc/sysconfig/vncservers برخوردید، آن مطلب مربوط به CentOS نسخه ۶ و ۷ است. آن فایل در توزیع‌های امروزی دیگر خوانده نمی‌شود و خود آن نسخه‌ها هم به پایان پشتیبانی رسیده‌اند و نباید روی سرور تازه نصبشان کنید.

اتصال از راه تونل SSH

روی سیستم خودتان تونل را باز کنید: ssh -L 5901:127.0.0.1:5901 -N user@server-ip. سوییچ -N یعنی هیچ دستوری اجرا نشود و فقط تونل برقرار بماند. حالا در ویور به‌جای IP سرور، آدرس localhost:5901 را وارد کنید. ترافیک از داخل SSH عبور می‌کند و ضعف رمزنگاری VNC دیگر موضوعیت ندارد.

کاربران ویندوز لازم نیست دنبال ابزار جانبی بگردند؛ کلاینت OpenSSH از ویندوز ۱۰ به بعد همراه خود سیستم‌عامل عرضه می‌شود و همان دستور در PowerShell کار می‌کند. اگر سرورتان خارج از ایران است، مثلا یک سرور ابری آلمان، تاخیر شبکه در VNC خیلی محسوس‌تر از SSH خودش را نشان می‌دهد؛ کاهش رزولوشن و عمق رنگ در تنظیمات ویور کمک زیادی می‌کند.

بررسی اینکه درست کار می‌کند

با vncserver -list ببینید کدام نمایش‌ها فعال‌اند و مهم‌تر از آن با ss -ltnp | grep 590 بررسی کنید که سرویس روی 127.0.0.1:5901 شنود می‌کند نه 0.0.0.0:5901. آزمون قطعی این است: بدون تونل، مستقیم به IP عمومی و پورت 5901 وصل شوید؛ اگر اتصال برقرار شد پیکربندی شما ناامن است. در فایروال هم پورت VNC را باز نکنید و فهرست فعلی را با sudo firewall-cmd --list-ports یا sudo ufw status مرور کنید.

وقتی VNC دیگر به کارتان نمی‌آید

مهم‌ترین نکته‌ای که آموزش‌های قدیمی جابه‌جا می‌گویند همین است: سرویس VNC داخل سیستم‌عامل فقط تا وقتی کار می‌کند که سیستم‌عامل بالا آمده و شبکه‌اش سالم باشد. اگر sshd را خراب کردید، قانون فایروال اشتباهی گذاشتید، خطی در /etc/fstab جلوی بوت را گرفت یا رمز کاربر مدیر را گم کردید، هیچ سرویسی داخل سرور به دادتان نمی‌رسد.

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

خطاهای رایج

  • صفحه خاکستری با یک ضربدر: جلسه بالا آمده اما دسکتاپی اجرا نشده. بسته دسکتاپ و فایل ~/.vnc/xstartup را بررسی کنید؛ علت دقیق معمولا در لاگ .log داخل ~/.vnc/ نوشته شده است.
  • Connection refused: سرویس اجرا نشده یا شماره نمایش را اشتباه گرفته‌اید. یادتان باشد :1 برابر 5901 است.
  • خطای احراز هویت: فایل ~/.vnc/passwd متعلق به کاربری نیست که سرویس با آن اجرا می‌شود، یا رمز بیش از هشت کاراکتر بوده و بخش اضافه‌اش نادیده گرفته شده.
  • تونل وصل است ولی تصویری نمی‌آید: مقصد -L باید 127.0.0.1 از دید خود سرور باشد، نه IP عمومی آن.
  • دنبال VNC در گنوم می‌گردید: در نسخه‌های جدید گنوم، قابلیت داخلی اشتراک‌گذاری صفحه به‌جای VNC از RDP استفاده می‌کند. اگر VNC می‌خواهید، باید سرویس مستقلی مثل TigerVNC راه بیندازید.

اگر ترجیح می‌دهید این پیکربندی‌ها را خودتان دنبال نکنید، سرویس‌های مدیریت‌شده گزینه‌ای هستند که در آن‌ها نصب و عیب‌یابی نرم‌افزارها به عهده تیم فنی گذاشته می‌شود و شما فقط سراغ کار خودتان می‌روید.