---
title: "Cách cài đặt và thiết lập cấu hình VNC trên Ubuntu 20.04"
description: "Cách cài đặt và thiết lập cấu hình VNC trên Ubuntu 20.04"
url: https://cloudfly.vn/techblog/cach-cai-dat-va-thiet-lap-cau-hinh-vnc-tren-ubuntu-2004
image: https://media.cloudfly.vn/posts/techblog_093I9Rt.png
---

# Cách cài đặt và thiết lập cấu hình VNC trên Ubuntu 20.04

## Giới thiệu

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.

## Điều kiện tiên quyết

Để hoàn thành hướng dẫn này, bạn sẽ cần:

* Một máy chủ Ubuntu 20.04 với non-root administrative user và tường lửa được thiết lập cấu hình bằng UFW. Để thiết lập điều này, hãy làm theo hướng dẫn thiết lập máy chủ ban đầu của chúng tôi cho Ubuntu 20.04.
* Một máy tính cục bộ có cài đặt máy khách VNC. Máy khách VNC mà bạn sử dụng phải hỗ trợ các kết nối qua SSH tunnel:
1. Trên Windows, bạn có thể sử dụng TightVNC, RealVNC hoặc UltraVNC.
2. Trên macOS, bạn có thể sử dụng chương trình Chia sẻ màn hình tích hợp sẵn hoặc có thể sử dụng ứng dụng đa nền tảng như RealVNC.
3. Trên Linux, bạn có thể chọn từ nhiều tùy chọn, bao gồm `vinagre`, `krdc`, RealVNC hoặc TightVNC.

## Bước 1 — Cài đặt Desktop Environment và VNC Server

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:
```command
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:
```command
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:
```command
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:
```command
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:
```
[secondary_label Output]
You 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.
```
[secondary_label Output]
Would 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`:
```command
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.

## Bước 2 — Thiết lập cấu hình Máy chủ VNC

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:
```command
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:
```
[secondary_label Output]
Killing Xtightvnc process ID <^>17648<^>
```

Trước khi bạn sửa đổi tệp `xstartup`, hãy sao lưu bản gốc:
```command
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`:
```command
nano ~/.vnc/xstartup
```

Sau đó thêm các dòng sau vào tệp:
```nginx
[label ~/.vnc/xstartup]
#!/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:
```command
chmod +x ~/.vnc/xstartup
```

Sau đó khởi động lại máy chủ VNC:
```command
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:
```
[secondary_label Output]
New '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ước 3 — Kết nối An toàn với Máy tính để bàn VNC

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:
```command
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.

<$>[note]
**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…**:

![description image](https://media.cloudfly.vn/posts/vnc_putty_topbar_arrow.png)

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:

![description image](https://media.cloudfly.vn/posts/vnc_putty_reconf_local.png)

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:

![description image](https://media.cloudfly.vn/posts/vnc_xfce.png)

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:

![description image](https://media.cloudfly.vn/posts/vnc_files.png)

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ước 4 — Chạy VNC dưới dạng System 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`:
```command
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:
```nginx
[label /etc/systemd/system/vncserver@.service]
[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:
```command
sudo systemctl daemon-reload
```

Kích hoạt tệp đơn vị:
```command
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:
```command
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:
```command
sudo systemctl start vncserver@1
```

Bạn có thể xác minh rằng nó đã bắt đầu bằng lệnh này:
```command
sudo systemctl status vncserver@1
```

Nếu nó bắt đầu đúng cách, đầu ra sẽ như thế này:
```
[secondary_label 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:
```command
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.

## Kết luậ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.
