Virtual Network Computing, hay VNC, là một hệ thống kết nối cho phép bạn sử dụng bàn phím và chuột để tương tác với môi trường màn hình đồ họa trên máy chủ từ xa. Nó giúp việc quản lý tệp, phần mềm và cài đặt trên máy chủ từ xa trở nên dễ dàng hơn đối với những người dùng chưa quen với dòng lệnh.
Trong hướng dẫn này, bạn sẽ thiết lập máy chủ VNC với TightVNC trên máy chủ Ubuntu 20.04 và kết nối với máy chủ đó một cách an toàn thông qua SSH tunnel. Sau đó, bạn sẽ sử dụng chương trình máy khách VNC trên máy cục bộ của mình để tương tác với máy chủ của mình thông qua môi trường máy tính để bàn đồ họa.
Để hoàn thành hướng dẫn này, bạn sẽ cần:
vinagre
, krdc
, RealVNC hoặc TightVNC.Theo mặc định, máy chủ Ubuntu 20.04 không đi kèm với môi trường máy tính để bàn đồ họa hoặc máy chủ VNC được cài đặt, vì vậy bạn sẽ bắt đầu bằng cách cài đặt chúng.
Bạn có nhiều tùy chọn khi nói đến máy chủ VNC và môi trường máy tính để bàn mà bạn chọn. Trong hướng dẫn này, bạn sẽ cài đặt các gói cho môi trường máy tính để bàn Xfce mới nhất và gói TightVNC có sẵn từ kho lưu trữ chính thức của Ubuntu. Cả Xfce và TightVNC đều nổi tiếng là nhẹ và nhanh, điều này sẽ giúp đảm bảo rằng kết nối VNC sẽ mượt mà và ổn định ngay cả trên các kết nối internet chậm hơn.
Sau khi kết nối với máy chủ của bạn bằng SSH, hãy cập nhật danh sách các gói của bạn:
- sudo apt update
Bây giờ hãy cài đặt Xfce cùng với gói xfce4-goodies
, gói này có một vài cải tiến cho môi trường máy tính để bàn:
- sudo apt install xfce4 xfce4-goodies
Trong khi cài đặt, bạn có thể được nhắc chọn display manager mặc định cho Xfce. Display manager là một chương trình cho phép bạn chọn và đăng nhập vào môi trường máy tính để bàn thông qua giao diện đồ họa. Bạn sẽ chỉ sử dụng Xfce khi kết nối với ứng dụng khách VNC và trong các phiên Xfce này, bạn đã đăng nhập với tư cách là non-root Ubuntu user của mình. Vì vậy, với mục đích của hướng dẫn này, lựa chọn display manager của bạn không phù hợp. Chọn một trong hai và nhấn ENTER
.
Sau khi quá trình cài đặt hoàn tất, hãy cài đặt máy chủ TightVNC:
- sudo apt install tightvncserver
Tiếp theo, chạy lệnh vncserver
để đặt mật khẩu truy cập VNC, tạo các tệp cấu hình ban đầu và khởi động phiên bản máy chủ VNC:
- vncserver
Bạn sẽ được nhắc nhập và xác minh mật khẩu để truy cập máy của mình từ xa:
OutputYou will require a password to access your desktops.
Password:
Verify:
Mật khẩu phải dài từ sáu đến tám ký tự. Mật khẩu dài hơn 8 ký tự sẽ tự động bị cắt bớt.
Sau khi xác minh mật khẩu, bạn sẽ có tùy chọn tạo mật khẩu chỉ xem (view-only). Người dùng đăng nhập bằng mật khẩu chỉ xem sẽ không thể kiểm soát phiên bản VNC bằng chuột hoặc bàn phím của họ. Đây là một tùy chọn hữu ích nếu bạn muốn chứng minh điều gì đó cho người khác sử dụng máy chủ VNC của mình, nhưng điều này không bắt buộc.
Sau đó, quá trình tạo các tệp cấu hình mặc định cần thiết và thông tin kết nối cho máy chủ. Ngoài ra, nó khởi chạy phiên bản máy chủ mặc định trên cổng 5901
. Cổng này được gọi là cổng hiển thị và được VNC gọi là :1
. VNC có thể khởi chạy nhiều phiên bản trên các cổng hiển thị khác, với :2
đề cập đến cổng 5902
, :3
đề cập đến 5903
, v.v.
OutputWould you like to enter a view-only password (y/n)? n
xauth: file /home/sammy/.Xauthority does not exist
New 'X' desktop is your_hostname:1
Creating default startup script /home/sammy/.vnc/xstartup
Starting applications specified in /home/sammy/.vnc/xstartup
Log file is /home/sammy/.vnc/your_hostname:1.log
Lưu ý rằng nếu bạn muốn thay đổi mật khẩu hoặc thêm mật khẩu chỉ xem, bạn có thể thực hiện bằng lệnh vncpasswd
:
- vncpasswd
Tại thời điểm này, máy chủ VNC đã được cài đặt và đang chạy. Bây giờ, hãy thiết lập cấu hình nó để khởi chạy Xfce và cấp cho chúng ta quyền truy cập vào máy chủ thông qua giao diện đồ họa.
Máy chủ VNC cần biết lệnh nào sẽ thực thi khi nó khởi động. Cụ thể, VNC cần biết nó sẽ kết nối với môi trường máy tính đồ họa nào.
Các lệnh mà máy chủ VNC chạy khi khởi động nằm trong tệp cấu hình có tên xstartup
trong thư mục .vnc
trong thư mục chính của bạn. Tập lệnh khởi động được tạo khi bạn chạy lệnh vncserver
ở bước trước, nhưng bạn sẽ tạo tập lệnh của riêng mình để khởi chạy màn hình nền Xfce.
Vì bạn sẽ thay đổi cách cấu hình máy chủ VNC, trước tiên hãy dừng phiên bản máy chủ VNC đang chạy trên cổng 5901
bằng lệnh sau:
- vncserver -kill :1
Đầu ra sẽ trông như thế này, mặc dù bạn sẽ thấy một PID khác:
OutputKilling Xtightvnc process ID 17648
Trước khi bạn sửa đổi tệp xstartup
, hãy sao lưu bản gốc:
- mv ~/.vnc/xstartup ~/.vnc/xstartup.bak
Bây giờ hãy tạo một tệp xstartup
mới và mở tệp đó trong trình soạn thảo văn bản, chẳng hạn như nano
:
- nano ~/.vnc/xstartup
Sau đó thêm các dòng sau vào tệp:
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &
Dòng đầu tiên là một shebang. Trong các tệp văn bản thuần có thể thực thi được trên nền tảng nix, một shebang cho hệ thống biết trình thông dịch nào sẽ chuyển tệp đó tới để thực thi. Trong trường hợp này, bạn đang chuyển tệp tới trình thông dịch Bash. Điều này sẽ cho phép mỗi dòng kế tiếp được thực thi dưới dạng các lệnh theo thứ tự.
Lệnh đầu tiên trong tệp, xrdb $HOME/.Xresources
, yêu cầu VNC’s GUI framework đọc tệp .Xresources
của người dùng máy chủ. .Xresources
là nơi người dùng có thể thực hiện các thay đổi đối với một số cài đặt nhất định của màn hình đồ họa, chẳng hạn như màu của thiết bị đầu cuối, chủ đề con trỏ và kết xuất phông chữ. Lệnh thứ hai yêu cầu máy chủ khởi chạy Xfce. Bất cứ khi nào bạn khởi động hoặc khởi động lại máy chủ VNC, các lệnh này sẽ tự động thực thi.
Lưu và đóng tệp sau khi thêm những dòng này. Nếu bạn đã sử dụng nano
, hãy làm như vậy bằng cách nhấn CTRL + X
, Y
, rồi ENTER
.
Để đảm bảo rằng máy chủ VNC sẽ có thể sử dụng tệp khởi động mới này đúng cách, bạn cần làm cho nó có thể thực thi được:
- chmod +x ~/.vnc/xstartup
Sau đó khởi động lại máy chủ VNC:
- vncserver -localhost
Lưu ý rằng lần này lệnh bao gồm tùy chọn -localhost
, liên kết máy chủ VNC với giao diện loopback của máy chủ của bạn. Điều này sẽ khiến VNC chỉ cho phép các kết nối bắt nguồn từ máy chủ mà nó được cài đặt.
Trong bước tiếp theo, bạn sẽ thiết lập một SSH tunnel giữa máy cục bộ và máy chủ của mình, về cơ bản là lừa VNC nghĩ rằng kết nối từ máy cục bộ của bạn bắt nguồn từ máy chủ của bạn. Chiến lược này sẽ thêm một lớp bảo mật bổ sung xung quanh VNC, vì những người dùng duy nhất có thể truy cập nó là những người đã có quyền truy cập SSH vào máy chủ của bạn.
Bạn sẽ thấy đầu ra tương tự như sau:
OutputNew 'X' desktop is your_hostname:1
Starting applications specified in /home/sammy/.vnc/xstartup
Log file is /home/sammy/.vnc/your_hostname:1.log
Với cấu hình sẵn có, bạn đã sẵn sàng kết nối với máy chủ VNC từ máy cục bộ của mình.
Bản thân VNC không sử dụng các giao thức bảo mật khi kết nối. Để kết nối an toàn với máy chủ của bạn, bạn sẽ thiết lập một SSH tunnel và sau đó yêu cầu máy khách VNC của bạn kết nối bằng tunnel đó thay vì tạo kết nối trực tiếp.
Tạo kết nối SSH trên máy tính cục bộ của bạn để chuyển tiếp an toàn tới kết nối máy chủ cục bộ cho VNC. Bạn có thể thực hiện việc này thông qua thiết bị đầu cuối trên Linux hoặc macOS bằng lệnh ssh
sau:
- ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip
Đây là ý nghĩa của các tùy chọn lệnh ssh
này:
-L 59000:localhost:5901
: Công tắc -L
chỉ định rằng cổng đã cho trên máy tính cục bộ (59000
) sẽ được chuyển tiếp đến máy chủ đã cho và cổng trên máy chủ đích (localhost:5901
, nghĩa là cổng 5901
trên máy chủ đích , được định nghĩa là your_server_ip
). Lưu ý rằng cổng cục bộ mà bạn chỉ định hơi tùy ý; miễn là cổng chưa bị ràng buộc với dịch vụ khác, bạn có thể sử dụng nó làm cổng chuyển tiếp cho tunnel của mình.-C
: Cờ này cho phép nén có thể giúp giảm thiểu mức tiêu thụ tài nguyên và tăng tốc mọi thứ.-N
: Tùy chọn này cho ssh
biết rằng bạn không muốn thực hiện bất kỳ lệnh từ xa nào. Cài đặt này hữu ích khi bạn chỉ muốn chuyển tiếp cổng.-l sammy your_server_ip
: Công tắc -l
cho phép bạn chỉ định người dùng mà bạn muốn đăng nhập khi bạn kết nối với máy chủ. Đảm bảo thay thế sammy
và your_server_ip
bằng tên của non-root user và địa chỉ IP của máy chủ của bạn.Lưu ý: Lệnh này thiết lập một SSH tunnel chuyển tiếp thông tin từ cổng 5901
trên máy chủ VNC của bạn sang cổng 59000
trên máy cục bộ của bạn thông qua cổng 22
trên mỗi máy, cổng mặc định cho SSH. Giả sử bạn đã làm theo điều kiện tiên quyết Hướng dẫn thiết lập máy chủ ban đầu cho Ubuntu 20.04, bạn sẽ thêm quy tắc UFW để cho phép kết nối đến máy chủ của mình qua OpenSSH.
Điều này an toàn hơn là chỉ mở tường lửa máy chủ của bạn để cho phép kết nối với cổng 5901
, vì điều đó sẽ cho phép mọi người truy cập máy chủ của bạn qua VNC. Bằng cách kết nối qua SSH tunnel, bạn đang giới hạn quyền truy cập VNC vào các máy đã có quyền truy cập SSH vào máy chủ.
Nếu bạn đang sử dụng PuTTY để kết nối với máy chủ của mình, bạn có thể tạo SSH tunnel bằng cách nhấp chuột phải vào thanh trên cùng của cửa sổ đầu cuối, sau đó nhấp vào tùy chọn Change Settings…:
Tìm nhánh Connection trong menu ở phía bên trái của cửa sổ PuTTY Reconfiguration. Mở rộng nhánh SSH và nhấp vào Tunnels. Trên màn hình Options controlling SSH port forwarding, nhập 59000
làm Source Port và localhost:5901
làm Destination, như sau:
Sau đó nhấp vào nút Add, rồi nhấp vào nút Apply để triển khai tunnel.
Khi đường hầm đang chạy, hãy sử dụng máy khách VNC để kết nối với localhost:59000
. Bạn sẽ được nhắc xác thực bằng mật khẩu bạn đã đặt ở Bước 1.
Khi bạn đã kết nối, bạn sẽ thấy màn hình nền Xfce mặc định. Nó sẽ trông giống như thế này:
Bạn có thể truy cập các tệp trong thư mục chính của mình bằng trình quản lý tệp hoặc từ dòng lệnh, như được thấy ở đây:
Nhấn CTRL+C
trong thiết bị đầu cuối cục bộ của bạn để dừng SSH tunnel và quay lại lời nhắc của bạn. Điều này cũng sẽ ngắt kết nối phiên VNC của bạn.
Bây giờ bạn có thể thiết lập cấu hình máy chủ VNC của mình để chạy dưới dạng systemd service.
Bằng cách thiết lập máy chủ VNC để chạy như một systemd service, bạn có thể bắt đầu, dừng và khởi động lại nó khi cần, giống như bất kỳ dịch vụ nào khác. Bạn cũng có thể sử dụng các lệnh quản lý của systemd để đảm bảo rằng VNC khởi động khi máy chủ của bạn khởi động.
Đầu tiên, tạo một tệp đơn vị mới có tên /etc/systemd/system/vncserver@.service
:
- sudo nano /etc/systemd/system/vncserver@.service
Biểu tượng @
ở cuối tên sẽ cho phép chúng ta chuyển vào đối số mà bạn có thể sử dụng trong cấu hình dịch vụ. Bạn sẽ sử dụng cổng này để chỉ định cổng hiển thị VNC mà bạn muốn sử dụng khi quản lý dịch vụ.
Thêm các dòng sau vào tệp. Đảm bảo thay đổi giá trị của User, Group, WorkingDirectory, và username trong giá trị của PIDFILE để khớp với username của bạn:
[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target
[Service]
Type=forking
User=sammy
Group=sammy
WorkingDirectory=/home/sammy
PIDFile=/home/sammy/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :%i
ExecStop=/usr/bin/vncserver -kill :%i
[Install]
WantedBy=multi-user.target
Lệnh ExecStartPre
dừng VNC nếu nó đang chạy. Lệnh ExecStart
khởi động VNC và đặt độ sâu màu thành màu 24 bit với độ phân giải 1280x800. Bạn cũng có thể sửa đổi các tùy chọn khởi động này để đáp ứng nhu cầu của mình. Ngoài ra, lưu ý rằng lệnh ExecStart
lại bao gồm tùy chọn -localhost
.
Lưu và đóng tập tin.
Tiếp theo, làm cho hệ thống nhận biết tệp đơn vị mới:
- sudo systemctl daemon-reload
Kích hoạt tệp đơn vị:
- sudo systemctl enable vncserver@1.service
Số 1
sau ký hiệu @
biểu thị số hiển thị mà dịch vụ sẽ xuất hiện, trong trường hợp này là số mặc định :1
như đã thảo luận trong Bước 2.
Dừng phiên bản hiện tại của máy chủ VNC nếu nó vẫn đang chạy:
- vncserver -kill :1
Sau đó khởi động nó như bạn sẽ khởi động bất kỳ dịch vụ systemd nào khác:
- sudo systemctl start vncserver@1
Bạn có thể xác minh rằng nó đã bắt đầu bằng lệnh này:
- sudo systemctl status vncserver@1
Nếu nó bắt đầu đúng cách, đầu ra sẽ như thế này:
Output● vncserver@1.service - Start TightVNC server at startup
Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-05-07 17:23:50 UTC; 6s ago
Process: 39768 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2)
Process: 39772 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :1 (code=exited, status=0/SUCCESS)
Main PID: 39795 (Xtightvnc)
...
Máy chủ VNC của bạn hiện đã sẵn sàng để sử dụng bất cứ khi nào máy chủ của bạn khởi động và bạn có thể quản lý nó bằng các lệnh systemctl
giống như bất kỳ dịch vụ systemd nào khác.
Tuy nhiên, sẽ không có bất kỳ sự khác biệt nào về phía khách hàng. Để kết nối lại, hãy bắt đầu lại SSH tunnel của bạn:
- ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip
Sau đó, tạo kết nối mới bằng phần mềm máy khách VNC của bạn tới localhost:59000
để kết nối với máy chủ của bạn.
Bây giờ bạn đã có một máy chủ VNC được bảo mật và đang chạy trên máy chủ Ubuntu 20.04 của mình. Giờ đây, bạn sẽ có thể quản lý các tệp, phần mềm và cài đặt của mình bằng giao diện đồ họa thân thiện với người dùng và bạn sẽ có thể chạy phần mềm đồ họa như trình duyệt web từ xa.