Tailscale và vấn đề của nó
Tailscale là một trong những công cụ mình thấy hào phóng nhất trên thị trường: mạng riêng ảo (VPN mesh), hỗ trợ nhiều thiết bị (3 user, 100 devices với free plan), hoàn toàn miễn phí — và không cần VPS để vận hành. Too good to be true tbh.

Có thật như vậy không? Hiển nhiên là không.

Mặc dù Tailscale cho phép khả năng tạo lập direct connection trực tiếp trong một số điều kiện thuận lợi (các thiết bị cùng mạng LAN, có thể thực hiện NAT traversal,...), tuy nhiên hầu hết trường hợp traffic của bạn trong tailnet sẽ phải đi qua các DERP server - relay server thuộc sở hữu của Tailscale - để vượt qua multi-layer NAT hoặc firewall.

Vấn đề nằm ở đây: các DERP server chỉ được triển khai ở một số quốc gia, và nếu bạn ở Việt Nam, nhiều khả năng bạn sẽ bị route qua Singapore hoặc thậm chí xa hơn. Kết quả là latency cao, và nếu bạn dùng RDP hay bất kỳ giao thức remote desktop nào qua đó — trải nghiệm sẽ khá... thú vị 💀.
Tìm hiểu thêm về Tailscale và lý do bạn nên dùng nó: JUST. F**king. Use. Tailscale.
Giải pháp: Peer Relay
Để giảm latency, có một vài hướng tiếp cận phổ biến:
- Self-host Tailscale thông qua các project nguồn mở như Headscale. Lúc này DERP server sẽ được đặt trực tiếp trên VPS self-host Headscale.

- Self-host DERP server sử dụng các project nguồn mở như
derper:
Cả hai giải pháp đều khả thi, nhưng overhead thiết lập tương đối lớn — bạn phải quản lý thêm certificate, cấu hình DNS và các dịch vụ đi kèm.
Gần đây, Tailscale đã ra mắt tính năng cho phép người dùng có thể relay traffic trực tiếp qua một thiết bị nằm trong tailnet, thay vì phải tìm kiếm DERP server phù hợp: Peer Relay. Nếu bạn đã có sẵn một VPS ở vị trí phù hợp (ví dụ trong lãnh thổ Việt Nam), đây là cách đơn giản và dễ thiết lập nhất để giảm latency mà không cần thay đổi toàn bộ setup.
Tìm hiểu thêm về Peer Relay và bài toán nó giải quyết ở đây.
Chẳng phải điểm mạnh của Tailscale là không cần VPS hay các máy chủ Cloud hay sao? - Đúng, tuy nhiên nếu dùng 100% free thì phải chấp nhận đánh đổi bằng latency cao trong trường hợp vị trí của mình không ở gần các DERP server (ví dụ Singapore). Một VPS nhỏ để relay traffic vẫn là khoản đầu tư đáng giá nếu bạn thường xuyên thực hiện kết nối từ xa vào thiết bị.
Thiết lập Peer Relay
Bước 1: Cấu hình VPS
Bước này sẽ cấu hình như bình thường như khi bạn join 1 thiết bị vào trong Tailnet:
# install Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
# join Tailnet
tailscale up
# verify you have logged in successfully
tailscale status

Bước 2: Thiết lập VPS để hoạt động như một relay
Sau khi đã join thành công, cấu hình VPS để lắng nghe kết nối relay trên một cổng cố định:
tailscale down
tailscale set --relay-server-port=40000
tailscale up

Hãy đảm bảo port này không bị chặn, just to make sure.
Tại bước này, chúng ta đã đi được một nửa chặng đường rồi (j/k) :D
Bước 3: Thiết lập ACL để đảm bảo traffic thông suốt
Không rõ đây có phải là một các setup thông minh hay không, tuy nhiên mình thấy cách setup này khá là tường minh. Nếu các bạn có cách setup hay hơn, hãy chia sẻ cho mình biết :D
Trước khi bắt đầu thiết lập, chúng ta sẽ đặt ra một vài quy ước:
- Các thiết bị được phép relay kết nối qua VPS peer relay sẽ thuộc tag
trungtqt-devices - Peer relay sẽ thuộc tag
peer-relay trungtqt-devicescó thể các thiết bị trong mạng và các thiết bị thuộc tagpeer-relaytùy ý (để có thể relay traffic qua)peer-relaycó thể gọi đến tất cả các thiết bị (hoặc chỉ đơn giản làtrungtqt-devices)
Truy cập vào https://login.tailscale.com/admin/acls/file để tiến hành thiết lập ACL:

ACL trong Tailscale hoạt động theo nguyên tắc deny-by-default, mặc định sẽ chặn mọi kết nối trừ khi có luật tường minh cho phép kết nối được đi qua.
Trước tiên sẽ thiết lập mục tagOwners để tạo các tag cần thiết (trungtqt-devices và peer-relay):

Ở đây mình sẽ để owner của các tag này đều là autogroup:owner - tức là chủ sở hữu của Tailnet (là mình luôn).
"tagOwners": {
"tag:peer-relay": ["autogroup:owner"],
"tag:trungtqt-devices": ["autogroup:owner"]
}
Tiếp theo mình sẽ setup ACL để cho phép kết nối được thông suốt. Trong thẻ grants (trong trường hợp không có, các bạn chủ động thêm key này, key này là key con của global object):

// Grants all device to route their traffic through Peer Relay
{
// Devices that can be accessed through the peer relay
"src": ["tag:trungtqt-devices"],
"dst": ["tag:peer-relay"], // Devices functioning as peer relays for the src devices
"app": {
"tailscale.com/cap/relay": [],
},
},
Ở đây mình thiết lập cho các thiết bị có tag trungtqt-devices đều có thể route traffic qua relay này. Tuy nhiên về sau mình phát hiện ra một mình grant này là không đủ, mình sẽ cần phải thiết lập thêm luật để các thiết bị thuộc tag này có thể liên lạc với máy relay thì mới có thể route traffic qua được.
Tiếp theo, mình thiết lập sao cho Peer Relay có thể kết nối đến các máy thuộc trungtqt-devices - mục đích nhằm trả traffic về sau khi đã relay:
{
"src": ["tag:peer-relay"],
"dst": ["tag:trungtqt-devices"],
"ip": ["*"],
},
Sau đó mình sẽ đảm bảo các thiết bị thuộc tag trungtqt-devices có thể kết nối với nhau một cách bình thường:
{
"src": ["tag:trungtqt-devices"],
"dst": ["tag:trungtqt-devices"],
"ip": ["*"],
},
Đến lúc này chúng ta đã xong với ACL, các bạn save file và quay trở lại màn hình Machine:

Trước tiên, tiến hành xác định thiết bị bạn sử dụng làm Peer Relay, xem chi tiết về thiết bị đó:

Click Machine settings -> Edit ACL tags:

Lúc này tiến hành add tags peer-relay đã tạo từ trước và save.
Tương tự với các thiết bị bạn mong muốn được route qua peer relay, bạn tiến hành add tag trungtqt-devices vào là có thể routing một cách bình thường được rồi.
Profit
Before:

After:

