Câu chuyện sử dụng VPN

Tôi thỉnh thoảng có nhu cầu sử dụng mạng VPN. Trong khi nhiều bạn dùng VPN để vượt qua bức tường chặn các trang web mà chính phủ không mong muốn thì mục đích dùng VPN của tôi lại nhằm phục vụ cho IoT, tạo đường truy cập các máy tính nhúng (BeagleBone, Raspberry Pi) từ xa qua Internet, phục vụ cho công việc.

Các máy tính nhúng của tôi hay được đặt trong một mạng LAN mà router của nó tôi không được can thiệp, nên không thể cấu hình port forward để truy cập trực tiếp từ ngoài Internet được.

No-VPN

Bằng cách thiết lập VPN, tôi sẽ có một mạng LAN ảo giữa laptop của tôi đang ở một quán nước dọc đường và máy tính nhúng đang đặt ở một căn phòng nào đó.

With-VPN

Mặc dù trên thị trường đã có nhiều giải pháp VPN, nhưng những giải pháp VPN "hay nghe tên" như OpenVPN, PPTP, IPSec thì có quá trình cài đặt, kết nối phức tạp. Sự phức tạp này đến từ việc chúng đòi hỏi sử dụng các chứng chỉ số (X.509 certificate). Mà đụng đến chứng chỉ số là đụng đến việc có nhiều file để cấu hình, phải có bước kí chữ kí số, chứng chỉ số của mình phải được kí bởi một nhà cung cấp chứng thực số (Certificate Authority) có uy tín, không thì kết nối vào mạng VPN sẽ bị từ chối. Chưa kể, các giải pháp này hay bị ca thán vì tốc độ chậm chạp. Các dịch vụ VPN ở dạng cloud service thì không có phần mềm client dành cho máy tính nhúng nên tôi chưa có điều kiện thử.

Hai năm trước, nhu cầu sử dụng VPN của tôi đến từ việc nhóm AgriConnect chúng tôi xây dựng phòng thí nghiệm trồng nấm ứng dụng IoT. Phần mềm điều khiển trung tâm được cho chạy trên một board BeagleBone Black đặt ngay tại nhà trồng nấm. Chúng tôi thì cần truy cập vào BeagleBone để xem thông số môi trường của nhà trồng nấm, đồng thời đặt lịch điều khiển các thiết bị. Thời gian đầu chưa được sử dụng đường mạng riêng nên chúng tôi phải tìm đến phương án VPN để có thể truy cập từ xa. Giải pháp VPN đầu tiên mà chúng tôi dùng là LogMeIn Hamachi. Dùng được một thời gian thì phát hiện phần mềm client dành cho Windows của Hamachi kém ổn định quá, thế là nghiên cứu tìm giải pháp VPN khác. Giải pháp sau đó tôi tìm được là SoftEther VPN. Đây là một phần mềm VPN còn khá mới, mã nguồn mở, và cho phép đăng nhập bằng password chứ không nhất thiết phải dùng certificate. Trớ trêu là phần mềm này chủ yếu nhắm đến cung cấp cho những người chống chính quyền cộng sản TQ có phương tiện vượt tường lửa Internet của TQ. Cũng phải mất kha khá thời gian để biết cách setup trên server, vì tài liệu được tổ chức, đặt tựa đề theo kiểu rất khó tra cứu. Đã vậy tài liệu chỉ hướng dẫn chi tiết về phần mềm có giao diện chạy trên Windows, trong khi bản dành cho Linux, chỉ có giao diện dòng lệnh thì hướng dẫn rất sơ sài, chỉ có liệt kê, giải thích từng tên gọi trong cấu hình, chứ không hướng dẫn làm gì trước, làm gi sau.

Trong quá trình mò mẫm cài đặt SoftEther VPN, tôi thậm chí còn đóng góp sửa lỗi cho dự án. Như vậy hóa ra mình đã góp một phần giúp những người chống Cộng.

sau khi thử nghiệm SoftEther VPN thành công thì nhà nấm của chúng tôi được di dời đến địa điểm mới, có mạng riêng, nên nhu cầu VPN không còn nữa. Tôi đã định viết thành tài liệu hướng dẫn cách setup SoftEther VPN này, công bố rộng rãi, để giới thiệu SoftEther VPN đến nhiều người hơn, nhưng chưa có thời gian. Bản hướng dẫn sơ lược thì cũng đã có, dưới dạng tài liệu nội bộ của AgriConnect (bản này viết ngắn gọn, không có giải thích, không có dẫn dắt nên không hợp với đại chúng để mà tung ra).

Bẵng đi một thời gian thì nhu cầu sử dụng VPN lại quay lại. Gần đây tôi tham gia vào dự án SUSI.AI Smart Speaker, tạo dựng phần mềm trợ lý ảo (virtual assistant) mã nguồn mở, chạy trên máy tính nhúng Raspberry Pi. Nó sẽ giống Google Home, nhưng là mã nguồn mở nên ai cũng có quyền lấy về, tự làm mạch, tự cài phần mềm lên mà xài. Một trong những việc cần làm là viết một script để tạo ra file ảnh hệ điều hành, trong đó có cài sẵn phần mềm SUSI.AI, để người dùng tải về cấy vào thẻ nhớ và sử dụng với board Raspberry Pi của họ.

Vì script này chạy rất lâu, mà tôi thường hay di chuyển, nên tôi cần chạy script này trên một server, để tôi có thể truy cập từ xa, theo dõi quá trình chạy của script. Ban đầu tôi thuê server của Scaleway để chạy, nhưng server của họ bị một số bug, script không chạy được, nên trong lúc vừa debug, tôi vừa phải xoay qua phương án cho chạy trên Raspberry Pi của tôi, nghĩa là phải thiết lập VPN cho nó để tôi có thể truy cập từ xa.

Lần này thì tôi không muốn dùng SoftEther nữa. Trong lúc thử nghiệm SoftEther, tôi vẫn còn sự bứt rứt không hài lòng. Vốn là người sử dụng Linux lâu năm nên tôi rất ưng ý SSH và cặp khóa SSH. Phương thức xác minh bằng SSH key như thế này vừa đỡ công sức gõ mật khẩu, tránh lộ mật khẩu, mà lại không vướng mắc chuyện CA, chữ kí số như phương thức dùng chứng chỉ số (X509 certificate). Thế nhưng phương thức đăng nhập của SoftEther lại hoặc dùng mật khẩu, hoặc dùng chứng chỉ số, chứ không có cặp khóa như SSH. Tôi vẫn ước ao có một giải pháp VPN cho dùng cặp key như SSH. Cho đến một ngày, tôi phát hiện ra WireGuard.

WireGuard là giải pháp VPN mã nguồn mở, rất mới, và dùng phương thức xác minh y chang SSH, với cặp khóa công khai-riêng, chẳng phải đụng đến mớ chứng chỉ số phiền phức. Chưa hết, WireGuard được cấu trúc theo kiểu mà phần lớn code của nó chạy trong kernel space của Linux, giúp nó có được tốc độ, hiệu năng cao so với các giải pháp VPN khác. Cách cấu hình của nó cũng rất gọn nhẹ, chỉ cần 1 file theo format .ini với 8 dòng (cho client). So với WireGuard thì SoftEther rất rườm rà, phải tạo nhiều lớp: Virtual NIC, Virtual Hub, User, Group, Password . File cấu hình của SoftEther thì không theo format phổ biến (ini, JSON hay YAML, TOML...) mà tự chế format riêng nên không ai dám tự viết file, sợ mắc lỗi. Đây là ví dụ file cấu hình của WireGuard:

[Interface]
PrivateKey = qIN2P8eUhWm2jzu8KIJ4hBb+rt3LT8mJxCuxOcc+l1s=
Address = 192.168.4.2/24
ListenPort = 51820

[Peer]
PublicKey = ZSvxiPwxxvWBeJqzWDWHInDpCY0sTpADcb2A4jom13o=
Endpoint = my_public_server:51820
AllowedIPs = 192.168.4.0/24

Mặc dù đơn giản, nhưng WireGuard vẫn còn bị hụt ở chuyện tài liệu. Tôi cũng phải tìm tài liệu ở nhiều nơi, so sánh qua lại mới mò ra được cấu hình phù hợp cho mô hình mình mong muốn. Thế nên, trong bài sau, tôi sẽ viết một hướng dẫn ngắn về WireGuard.