Khắc phục tình trạng VPN WireGuard bị treo

Trước đây tôi có viết bài Dựng mạng VPN với WireGuard . Sau một thời gian sử dụng, để ý thấy do các máy con (client) của tôi thỉnh thoảng xảy ra tình trạng treo WireGuard: từ các máy khác không ping đến nó được. Vì vậy tôi lại tiếp tuc đề tài WireGuard này, giới thiệu một cách khắc phục.

Trước tiên, xin nêu vài nguyên nhân khiến VPN WireGuard bị treo:

  • WireGuard của năm 2018 (lúc tôi viết bài trên) được nạp lên hệ thống dưới dạng DKMS. Như ta đã biết, khác với các giải pháp VPN thông thường, WireGuard chạy dưới dạng một driver/module của nhân Linux. Nhưng khi được phân phối ở dạng DKMS, mỗi lần máy được nâng cấp nhân mới thì module này phải trải qua quá trình build lại từ mã nguồn bên ngoài. Điều này đôi khi gây ra tình trạng, phiên bản cũ vẫn còn lơ lửng trong RAM và phiên bản mới chưa thế chân vào được, thế là WireGuard bị treo. Từ Linux 5.6 trở đi thì WireGuard đã được tích hợp vào nhân, không còn ở dạng DKMS nữa nên tình trạng này không còn.

  • Network interface của WireGuard (ví dụ wg0) được khởi tạo khi máy vẫn chưa thực sự kết nối với Internet (sai thứ tự), việc kết nối với server VPN không thành công, khiến việc cấu hình không hoàn tất. Hoặc khi đang chạy ngon bỗng dưng Internet bị rớt, mất luôn mối kết nối với server. Điều này hay xảy ra với các máy con (client) vì các máy này không được đảm bảo luôn có Internet, thậm chí là không phải lúc nào cũng có điện.

...

Viết hàm thêm cho PostgreSQL: Chú voi bay

Vừa rồi tôi đã viết bài Dùng Python viết hàm xử lý dữ liệu dưới tầng database cho PostgreSQL. Sau khi chơi với Python một chút, tôi tự hỏi, có thể tăng tốc độ thực thi thêm nữa không. Thế nên hôm nay tôi nghịch thêm vài cách khác nhau, để gắn thêm tên lửa vào đít chú voi PostgreSQL.

Dumbo Picture credit: Walt Disney

Bây giờ tôi sẽ chuyển đổi code kia sang Cython và Rust.

...

Mát máy sau khi chuyển từ InfluxDB sang TimescaleDB

Làm việc trong lĩnh vực IoT (Internet of Things) nên tôi khá cần một hệ quản trị cơ sở dữ liệu chuyên dụng cho kiểu dữ liệu time-series (chuỗi thời gian), để lưu trữ dữ liệu do các thiết bị giám sát gửi lên.

Mặc dù IoT dựa trên những cơ sở công nghệ đã được phát triển từ lâu, thậm chí hệ CSDL time-series cũng không phải là khái niệm mới, nhưng mỗi nhà có một nhu cầu, nên mãi cho tới hồi đầu năm nay (2020), vẫn chưa có một hệ cơ sở dữ liệu nào thỏa mãn ý của tôi cả (khi viết bài này thì đã tìm được cái ưng ý).

Vậy nhu cầu của tôi khác với các đơn vị khác như thế nào? Đó là:

...

Một số mẹo cho việc phát triển ứng dụng hệ thống nhúng

Trong quá trình phát triển ứng dụng cho hệ thống nhúng, do sự hạn chế của thiết bị, đôi khi có những việc lắt nhắt làm tốn mớ thời gian. Sau đây mình liệt kê một số mẹo để đi tắt, giúp tiết kiệm thời gian cho công việc. Các hướng dẫn này chỉ dành cho hệ điều hành Linux (như Ubuntu).

1. Chia sẻ Internet từ laptop cho máy tính nhúng

Đây là tình huống mà bạn đang phát triển ứng dụng cho máy tính mini (NUC, Raspberry Pi, Beagle Bone...) và chủ yếu dùng mạng dây (chưa setup wifi hoặc máy đó không có card wifi). Đôi lúc bạn cần phải xách nó đi đâu đó (để trình diễn demo, để cài đặt lại chẳng hạn) mà chỗ đó không có router để cấp mạng, bạn có thể chia sẻ Internet từ laptop (laptop đang kết nối Internet qua wifi) cho nó. Để cho ngắn gọn, mình sẽ gọi máy tính nhúng là RPi trong bài này.

Nguyên lý của việc này là biến laptop của bạn thành một thiết bị router mạng đơn sơ, tạo một mạng con với RPi, do laptop của bạn quản lý.

...

Áp dụng quy trình hiện đại khi làm phần mềm cho hệ thống nhúng

Đi qua đi lại một vài đơn vị làm phần mềm nhúng, IoT Việt Nam, mình thấy không hài lòng lắm về cách làm việc hơi cũ. Mình thấy nhiều bạn làm điện tử có thể lập trình được, những vẫn còn một khoảng trống dài về phương pháp làm việc giữa những người này và những người thuần về phần mềm. Thế nên mình viết bài này, hi vọng kéo những người làm phần mềm nhúng tiến lên vài bước cho gần với chuẩn.

Lưu ý: Những cách làm sau đây, ban đầu sẽ gây thiệt thòi vì vẽ ra quá nhiều chuyện để làm, nhưng về lâu dài thì có lợi cho việc tiếp tục phát triển sản phẩm.

1. Chia nhỏ phần mềm thành những gói gần như độc lập

Lấy ví dụ về một hoạt động kiểm nghiệm ý tưởng thiết kế phần mềm tại AgriConnect.


Lại tản mạn về vai trò của Linux

Nghe đồn giới IoT muốn ứng dụng Bluetooth LE nhưng gặp khó.

Quay đi quay lại thì mình thấy thư viện về Bluetooth có độ hoàn thiện nhất là BlueZ. Khó ở đây là thư viện này được tạo ra với mục đích dành cho viết ứng dụng Linux, vì nó dùng event loop của GLib ở trỏng. GLib là một trong những thành phần lõi của bộ GTK, bộ toolkit dành cho lập trình giao diện đồ họa của Linux. Đã thế nó còn dùng D-Bus nữa chứ. D-Bus là một đường giao tiếp chung, cho phép các ứng dụng desktop giao tiếp với nhau. Sau đây là ví dụ về ứng dụng của D-Bus: Vào thời mà Yahoo Messenger còn phổ biến, dân Linux thường chat Yahoo bằng một phần mềm "nhiều trong một" tên là Pidgin (ngoài Yahoo ra, còn có thể chat cùng lúc với Google Hangout, Facebook Messenger). Phần mềm này có khả năng thú vị là nhận biết khi nào máy bạn đang có mạng, rớt mạng để hiện chỉ thị tương ứng (trạng thái màu xám, các avatar bạn bè bị phủ màu xám). Khi có mạng trở lại thì phần mềm này sẽ tự đổi trạng thái, tự đăng nhập vào các dịch vụ chat và cập nhật danh sách bạn bè. Để nhận biết tình trạng mạng, nó không chơi trò cơ bắp là liên tục kết nối đại vào server nào đấy. Thay vì vậy nó trao đổi với một phần mềm khác tên là NetworkManager. Khi rớt mạng hoặc có mạng, NetworkManager sẽ thông báo trên đường D-Bus và các phần mềm khác "đăng ký" vào D-Bus sẽ nhận được tin.

Đối với những người cần dùng thiết bị USB-3G (như cục D-Com 3G của Viettel chẳng hạn), trên Linux cũng có một phần mềm tên là ModemManager, chạy ngầm để khai thác thiết bị này, ví dụ như chọn sóng của nhà mạng nào, nhập username, password để quay số vào nhà mạng đó, bật sang chế độ data, gửi tin nhắn SMS v.v. ModemManager cũng cho phép giao tiếp qua D-Bus. Chẳng hạn khi cắm thiết bị vào thì danh mục của Network Manager sẽ xuất hiện mục để kết nối mạng 3G, hoặc bạn có thể viết ứng dụng riêng để gửi tin nhắn SMS, lấy các danh bạ lưu trong SIM, tất cả bằng việc giao tiếp với ModemManager qua D-Bus.

...

Python và cách tiết kiệm dung lượng cho phần mềm nhúng

Khi tôi bắt đầu bước chân vào mảng IoT đầu năm 2016, tôi bắt đầu lân la tiếp xúc với cộng đồng làm IoT Việt Nam (trên Facebook là chính). Ở Việt Nam, lực lượng tech làm IoT đa phần là dân điện tử đi lên, thế nên tôi hay gặp những câu hỏi như "nên dùng ngôn ngữ nào để lập trình nhúng" từ những bạn sinh viên mới. Tôi cũng ngạc nhiên khi thấy các bạn kháo nhau dùng NodeJS, theo phong trào.

Nếu cần dùng các ngôn ngữ biên dịch như C++, Go thì không nói. Nhưng nếu dùng ngôn ngữ thông dịch thì Python nên được dùng hơn NodeJS/JavaScript. Một khía cạnh nên tính đến là độ lớn file cần lưu trữ. Các board máy tính nhúng chạy Linux thường dùng thẻ nhớ, hoặc bộ nhớ flash trong (còn có cách gọi khác là NAND Flash, SPI Flash, eMMC) để thay thế ổ cứng (HDD) nên có dung lượng khiêm tốn. Nếu cách lưu trữ không phù hợp, có khi thư viện đã ngốn hết không gian lưu trữ đáng lẽ phải dành cho chương trình và dữ liệu (data).

Thứ nhất, cách quản lý các gói thư viện phụ thuộc của NodeJS cực kỳ tốn dung lượng, với sự trùng lắp các file thư viện.

node_modules

...

Dựng mạng VPN với WireGuard

Tiếp nối bài trước, Câu chuyện sử dụng VPN, tôi xin mô tả cách dựng một mạng VPN cho mục đích cá nhân bằng phần mềm WireGuard.

Mục đích sử dụng mạng VPN của tôi chỉ là để truy cập từ xa vào các thiết bị IoT của tôi nên mô hình VPN của tôi chỉ phù hợp với nhu cầu đó. Nếu bạn cần dùng VPN cho mục đích khác, ví dụ để vượt tường lửa, truy cập vào website bị chặn, thì bạn không nên trông đợi gì vào bài viết này.

Trước khi bắt tay vào việc, ta cần mường tượng sơ đồ mạng sẽ như thế nào:

...

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 đó.


A forgotten GUI tool for flashing SD card and USB drives

Working in IoT or with embedded computer, you won't less than 1 time need to write an OS image file to a SD card (so that you can install new OS to your device later).

For the tool to write image file, many websites often recommend Etcher, which is an Electron-based app. For Windows and Mac, that is fine. But for Linux, it sounds ridiculous to recommend such a tool. Not only does Linux already have GNOME Disks, which is most of time pre-installed, but also is it native, and hence, being lighter, running faster, having visual look consistent with other applications.

Here is the photo of GNOME Disks writing image file to my SD card. The SD card appears with USB drive icon because I'm using a 3G USB dongle as card reader, after my laptop's built-in SD reader has been broken.

GNOME-Disks writing SD card