Sau khi lấy chiếc laptop Lenovo S10-3T chạy Ubuntu Server để tự tạo print server, mình muốn truy cập máy tính này khi đi ra ngoài nhưng ngại không muốn mở port 22 cho SSH trên router vì lý do bảo mật. Do mình cũng đang sử dụng dịch vụ Cloudflare Tunnel cho trang WordPress nên mình muốn tận dụng để truy cập máy tính này luôn. Tuy nhiên, muốn sử dụng Cloudflare Tunnel thì mình cần phải cài thêm một ứng dụng nữa trên máy chủ Ubuntu để có thể truy cập SSH từ giao diện web.
Sau khi tìm hiểu về các phần mềm cung cấp giao diện web cho SSH tốt nhất thì mình phát hiện ra Apache Guacamole, một ứng dụng mã nguồn mở của cung cấp giao diện web để truy cập vào máy tính từ xa, hỗ trợ rất nhiều giao thức như SSH, RDP, Telnet, VNC… nói chung là tất tần tật. Vậy là mình bắt tay vô làm luôn.
Trước khi bắt đầu, mình xin tóm tắc lại những lợi ích khi sử dụng kết hợp Apache Guacamole và Clouflare Tunnel
- Không cần mở port 22 trên router mà vẫn có thể kết nối SSH với máy chủ thông qua giao diện web
- Truy cập máy chủ bằng tên miền mà không cần cấu hình DDNS dù WAN IP có thay đổi
- Vì Cloudflare Tunnel đóng vai trò là reverse proxy nên không sợ bị lộ WAN IP của máy chủ
1. Điều kiện tiên quyết
Để có thể thực hiện các bước bên dưới, cần phải thoả các điều kiện sau:
- Đã có máy chủ đang chạy Ubuntu Server hoặc Debian Linux
- Đã có tên miền, nếu chưa có thể xem cách mua tên miền siêu rẻ giá 1 USD/năm trọn đời
- Đã chuyển tên miền sang Cloudflare quản lý
- Đã cài đặt Docker lên máy Ubuntu
2. Cài đặt Guacamole Docker
Guacamole có thể được sử dụng bằng cách cài đặt trực tiếp từ mã nguồn hoặc bằng Docker. Cá nhân mình thấy cách cài đặt và sử dụng Guacamole bằng Docker đơn giản và dễ quản lý hơn rất nhiều nên mình chọn cách này. Bài viết này mình sẽ sử dụng Docker Guacamole của jwetzell. Để biết thêm chi tiết xin tham khảo tại đường dẫn sau: https://github.com/jwetzell/docker-guacamole
Tạo một mạng cầu nối (network bridge) mới:
$ docker network create <NETWORK-NAME>
# Lưu ý: thay thế <NETWORK-NAME> bằng tên mạng bất kỳ. Ví dụ:
$ docker network create home_network
Chạy Apache Guacamole Docker không kèm tính năng bảo mật 2 lớp bằng lệnh:
$ docker run -d --name guacamole_all --restart always \
-p 8080:8080 \
--network=home-network \
-v ./config:/config \
jwetzell/guacamole
Để dừng Apache Guacamole Docker, thực hiện lệnh sau:
$ docker stop guacamole_all
(Khuyến cáo) Chạy Apache Guacamole Docker với tính năng bảo mật 2 lớp TOTP bằng lệnh:
$ docker run -d --name guacamole_all --restart always \
-p 8080:8080 \
--network=home-network \
-v ./config:/config \
-e "EXTENSIONS=auth-totp" \
jwetzell/guacamole
Khi thêm tính năng bảo mật TOTP thì lúc đăng nhập Apache Guacamole sẽ hiển thị mã QR để quét. Do đó trước khi bật tính năng này vui lòng tải app “Authenticator” trên điện thoại để quét mã QR này.
Vào những lần đăng nhập sau đó, ngoài mật khẩu thì Apache Guacamole cũng sẽ yêu cầu nhập thêm mã OTP từ app “Authenticator”
Lưu ý
Guacamole sử dụng giao diện web để quản lý các kết nối tại địa chỉ:
http://<IP>:8080
# Lưu ý: thay thế <IP> bằng địa chỉ IP của máy chủ
# Lấy địa chỉ IP bằng lệnh: hostname -I
# Ví dụ:
http://192.168.1.2:8080
Nếu cài đặt thành công thì sẽ thấy hiện giao diện như sau:
Tài khoản và mật khẩu mặc định ban đầu là: guacadmin
Lưu ý
Nếu có sử dụng tính năng bảo mật 2 lớp thì sau khi đăng nhập sẽ có thêm phần xác thực tài khoản như sau:
Lúc này mình cần phải sử dụng app “Authenticator” để quét mã QR rồi nhập mã xác thực vào ô bên dưới để đăng nhập.
3. Cấu hình Guacamole
3.1 Thay đổi mật khẩu mặc định
Để bảo mật cho Guacamole, bước đầu tiên là mình thay đổi mật khẩu mặc định bằng cách nhấn vào tên đăng nhập “guacadmin” ở menu trên góc phải
Chọn tiếp “Settings”
Nhấn vào menu “Preferences” và tiến hành thay đổi mật khẩu. Xong nhấn “Update Password” để lưu lại.
3.2 (Khuyến cáo) Vô hiệu hóa user “guacadmin”
Để an toàn hơn, mình sẽ tạo thêm 1 người dùng mới và vô hiệu hóa người dùng “guacadmin” vì đây là user mặc định nên ai cũng có thể đoán ra
Từ menu “User”
Nhấn vào “New User”
Nhập tên và mật khẩu cho người dùng mới, đánh dấu tất cả các ô trong mục “PERMISSIONS” rồi nhấn nút “Save” để lưu lại.
Tiếp tục nhấn vào tên đăng nhập “guacadmin” ở góc phải
Rồi chọn “Logout” để đăng xuất khỏi người dùng “guacadmin”
Sau khi đăng nhập lại với người dùng mới, nhấn vào tên đăng nhập ở góc phải và chọn “Settings”
Từ menu “Users”, chọn tên người dùng “guacadmin”
Đánh dấu vào ô “Login disabled” rồi nhấn nút “Save” để lưu lại.
Sau bước này thì mình sẽ không thể đăng nhập bằng tài khoản “guacadmin” nữa.
3.3 Tạo kết nối SSH đến Ubuntu Server
Chọn “Connections” từ menu Settings
Sau đó nhấn vào nút “New Connection”
- Name: nhập tên kết nối
- Protocol: chọn SSH
Những thông số mình nhập ở trên chỉ là nội dung do mình tự tạo ra để làm bài hướng dẫn này. Bạn có thể thay đổi cho phù hợp với máy của bạn
Lưu ý
- Hostname: nhập địa chỉ IP của máy chủ Ubuntu
- Port: 22
- Username: nhập tên đăng nhập vào Ubuntu
- Password: nhập mật khẩu đăng nhập
Sau đó nhấn nút “Save” để lưu lại
3.4 Thử kết nối đến máy chủ Ubuntu
Nhấn vào tên đăng nhập ở góc phải
Chọn “Home”
Nhấn vào tên kết nối mình đã tạo ở bước trên
Như vậy mình đã kết nối thành công đến máy chủ Ubuntu bằng Guacamole
3.5 Kết nối đến máy tính Windows 10/11 Pro
Trên máy tính Windows 10/11 Pro, nhấn “Search” rồi gõ vào “remote desktop”
Sau đó chọn “Remote desktop settings”
Nhấn vào nút “Off” để bật tính năng điều khiển từ xa lên
Chọn “Confirm” để xác nhận
Sau đó tạo kết nối mới trên Apache Guacamole tương tự như bước tạo kết nối SSH ở trên
- Name: đặt tên cho kết nối
- Protocol: chọn giao thức RDP
- Hostname: nhập IP của máy tính Windows (xem bên dưới để biết cách lấy địa chỉ IP)
- Port: mặc định là 3389
- Username: nhập tên đăng nhập Windows
- Password: nhập mật khẩu đăng nhập
- Security mode: chọn Any
- Ignore server certificate: đánh dấu vào ô chọn
Wake-on-LAN là một tính năng giúp tự động bật máy tính nếu máy đang ở trạng thái tắt hoặc trạng thái ngủ, giúp tiết kiệm điện khi không cần sử dụng máy. Tính năng này chỉ có thể sử dụng cho máy tính kết nối mạng bằng dây cáp mạng (không thể sử dụng với máy tính kết nối mạng không dây, wifi).
Thông thường Windows cho phép sử dụng Wake-on-LAN mà không cần phải cấu hình thêm gì cả. Tuy nhiên ở một số máy thi tính năng này có thể bị vô hiệu hoá. Khi đó mình cần phải cấu hình card mạng để cấp quyền đánh thức máy tính. Ngoài ra, một số bo mạch chủ yêu cầu phải bật tính năng Wake-on-LAN trong BIOS hoặc CMOS thì mới có thể sử dụng được.
Tùy chọn, nếu không cần sử dụng tính năng này thì có thể bỏ qua phần này
- Send WoL packet: đánh dấu chọn
- MAC address of the remote host: nhập địa chỉ MAC của máy tính (xem bên dưới để biết cách lấy địa chỉ MAC)
- Broadcast address for WoL packet: nhập địa chỉ IP của máy (xem bên dưới để biết cách lấy địa chỉ IP)
- UDP port for WoL packet: 9
- Host boot wait time: không nhập (nếu nhập sẽ không thể kết nối được)
Cuối cùng nhấn nút “Save” để lưu lại
Địa chỉ IP và địa chỉ MAC của máy tính Windows có thể được lấy bằng lệnh “ipconfig /all”.
Địa chỉ MAC khi lấy bằng lệnh “ipconfig /all” sẽ có định dạng XX-XX-XX-XX-XX-XX. Khi sao chép vào Apache Guacamole thì phải đổi thành XX:XX:XX:XX:XX:XX
Lưu ý
Nếu sau khi thực hiện các bước trên mà vẫn không thể bật máy tính bằng WoL, có thể thực hiện thêm các bước sau:
$ sudo apt install jq -y
$ wget https://github.com/dhutchison/container-images/raw/master/homebridge/configure_docker_networks_for_wol.sh
$ chmod +x configure_docker_networks_for_wol.sh
$ nano configure_docker_networks_for_wol.sh
# khai báo tên mạng đã tạo ở bước 2
DOCKER_NETWORK=home_network
$ sudo ./configure_docker_networks_for_wol.sh
$ sudo reboot
4. Kết nối bằng tên miền thông qua Cloudflare Tunnel
4.1 Tạo kết nối Tunnel mới trên Cloudflare Zero Trust
Đăng nhập vào Cloudflare Zero Trust tại địa chỉ: https://one.dash.cloudflare.com
Từ menu “Networks”, chọn “Tunnels” và tạo một Tunnel mới
Chọn “Cloudflare” rồi nhấn “Next” để tiếp tục
Đặt tên cho tunnel rồi nhấn “Save Tunnel”
Chọn “Docker” rồi nhấn biểu tượng “Copy” để sao chép.
Kế tiếp mình sẽ đăng nhập vào máy chủ Ubuntu bằng SSH đế tiếp tục cài đặt và cấu hình Cloudflare Docker.
4.2 Cài đặt Cloudflare Docker
Đăng nhập vào máy chủ Ubuntu và dán câu lệnh đã sao chép bên trên vào nhưng khoan hãy nhấn “Enter” để chạy. Mình sẽ bổ sung các thông số sau vào sau phần “docker run” trước khi chạy câu lệnh:
-d --network home_network --restart always
Sau khi thêm vào nó sẽ giống như sau:
$ docker run -d --network home_network --restart always cloudflare/cloudflared:latest tunnel --no-autoupdate run --token oim88i8sduhlijowAxOTY3ZjNmZjY4ZThhNGU4NTNmYmRiNmFhOTIiLCJ0IjoiNmYyYWFkN2EtN2I3NC00YjM5LWFhMWQtYzhkOTA2NmIwMTMxIiwicyI6IlpqUTBNakV4TmpVdE16ZGxOQzAwTVRreUxUazRNbVF0WmpFek9UVTFNbVJrTW1JeCJ9
Nội dung trên do mình tự tạo ra để làm ví dụ. Vui lòng thay thế cho phù hợp máy của bạn.
Lưu ý
Sau đó mình quay lại trang cấu hình Cloudflare Zero Trust
Nếu thấy báo “Connected” như trên tức là mình đã cài đặt đúng trên máy chủ Ubuntu, nhấn vào nút “Next” để tiếp tục.
4.3 Cấu hình tên miền để truy cập vào máy chủ
- Subdomain: nhập vào tên miền phụ. Ví dụ: “home”
- Domain: chọn tên miền
- Type: chọn “HTTP”
- URL: nhập vào “guacamole_all:8080”
Nhấn “Save Tunnel” để lưu lại
Sau bước này thì mình đã có thể truy cập vào Guacamole bằng tên miền tại địa chỉ:
https://home.workleast.com
5. Tăng cường bảo mật bằng Cloudflare Zero Trust
Mặc dù tính năng xác thực 2 lớp TOTP có thể ngăn ngừa việc hacker tìm cách hack mật khẩu rồi đăng nhập trái phép vào Apache Guacamole. Tuy nhiên, hacker vẫn có thể lợi dụng các lỗ hỏng bảo mật của máy chủ web để chiếm quyền điều khiển máy chủ. Nhằm ngăn ngừa rủi ro này, xin tham khảo bài hướng dân tăng cường bảo mật cho trang web nội bộ bằng Cloudflare Zero Trust