⚡ Hướng dẫn thực hành

SSH từ Mac mini vào Android qua Tailscale & chạy curl

Cả hai máy join cùng một tailnet. Mục tiêu: SSH từ Mac mini vào điện thoại Android rồi chạy lệnh — không cần root.

Có cần root không?KHÔNG.

Android không có sẵn SSH server, và Tailscale cũng không biến Android thành SSH server được (Tailscale SSH server chỉ chạy trên Linux). Giải pháp: cài Termux — chạy hoàn toàn trong userspace, không đụng tới root. Root chỉ cần nếu bạn muốn dùng port 22 mặc định (xem mục 5).

🖥️ Mac mini
ssh client
🔒 Tailnet
100.x.x.x
📱 Android
Termux sshd :8022

1 Setup phía Android (Termux)

⚠️

Cài Termux từ F-Droid hoặc GitHub — KHÔNG dùng bản trên Google Play (đã cũ và lỗi, không cập nhật package được).

Cài SSH server + curl

# cập nhật repo và package
pkg update && pkg upgrade
pkg install openssh curl

Bật SSH server

# đặt mật khẩu (hoặc dùng SSH key — xem mục 3)
passwd

# khởi động sshd
sshd
💡

Vì không root, sshd của Termux nghe ở port 8022 (không phải 22) — user thường không bind được port < 1024.

Lấy username Termux (cần khi ssh vào)

whoami    # ví dụ: u0_a234

Cài & kết nối Tailscale

Cài app Tailscale trên Android, đăng nhập cùng tailnet với Mac mini. Lấy IP 100.x.x.x của Android trong app hoặc admin console.

2 Kết nối từ Mac mini

ssh -p 8022 u0_a234@<tailscale-ip-android>

Nếu bật MagicDNS, dùng luôn tên máy thay cho IP:

ssh -p 8022 u0_a234@android-hostname

Sau khi vào shell, chạy curl bình thường:

curl https://example.com
curl -s https://api.ipify.org   # xem IP public mà Android đang đi ra

3 Khuyến nghị: dùng SSH key thay mật khẩu

Trên Mac mini, lấy public key:

cat ~/.ssh/id_ed25519.pub

Trên Termux, dán vào file authorized_keys:

mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys   # dán public key vào đây
chmod 600 ~/.ssh/authorized_keys

Dùng key giúp bạn ssh không cần gõ mật khẩu mỗi lần, và an toàn hơn — đặc biệt khi muốn chạy script tự động từ Mac mini.

4 Giữ kết nối ổn định

Trở ngại lớn nhất không phải SSH mà là Android tự tắt tiến trình nền. Xử lý:

Vấn đềGiải pháp
Android kill Termux ở backgroundTắt battery optimization cho Termux; cài pkg install termux-api rồi chạy termux-wakelock để giữ tiến trình sống
Tailscale rớt khi tắt màn hìnhAndroid Settings → VPN → bật Always-on VPN cho Tailscale; tắt battery optimization cho app Tailscale
sshd không tự chạy sau rebootCài addon Termux:Boot để tự start sshd + Tailscale khi khởi động máy
Phải gõ sshd mỗi lần mở TermuxThêm sshd vào ~/.bashrc hoặc dùng Termux:Boot

5 Nếu Android có root: dùng port 22

Root cho phép bind vào privileged port (< 1024), nên bạn có thể dùng port 22 mặc định — không phải gõ -p 8022 mỗi lần. Có 2 cách, đều cần root.

💡

Root là tùy chọn. Cách không-root ở trên (port 8022) đã đủ dùng và ổn định. Chỉ dùng port 22 nếu bạn muốn lệnh ssh gọn hơn, hoặc cần tương thích công cụ chỉ hỗ trợ port 22.

Cách A — Redirect 22 → 8022 bằng iptables (khuyến nghị)

Giữ nguyên Termux sshd chạy ở 8022 (vẫn chạy bằng user thường), chỉ mượn root để chuyển hướng port. Sạch và an toàn hơn vì sshd không cần chạy với quyền root.

# cài tsu để có quyền root trong Termux
pkg install tsu

# chuyển mọi kết nối tới port 22 sang 8022 (sshd của Termux)
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-ports 8022

Từ Mac mini giờ ssh không cần chỉ định port:

ssh u0_a234@<tailscale-ip-android>

Cách B — Chạy sshd thẳng trên port 22 bằng root

# mở config sshd của Termux, đổi cổng
nano $PREFIX/etc/ssh/sshd_config
# sửa dòng:  Port 8022   ->   Port 22

# chạy sshd với quyền root để bind được port 22
sudo sshd
⚠️

Khi sshd chạy bằng root, nó vẫn drop quyền về user Termux lúc bạn đăng nhập — nên ~/.ssh/authorized_keys phải thuộc đúng user đó (đừng để root sở hữu). Nếu sai quyền, đăng nhập bằng key sẽ thất bại do StrictModes.

Giữ qua reboot

Rule iptables và sshd-chạy-root không tự sống lại sau khi khởi động. Dùng Termux:Boot để chạy lại lệnh ở Cách A/B khi boot, hoặc đặt làm Magisk service script (đặt vào /data/adb/service.d/) nếu bạn dùng Magisk.

6 Tóm tắt nhanh

Cần root?Không bắt buộc — chỉ cần nếu muốn dùng port 22 (mục 5)
Android cần gì?Termux + openssh (sshd) + curl + app Tailscale, cùng tailnet
Port SSH8022 (không root) · 22 nếu có root — xem mục 5
Usernamekết quả của whoami trong Termux (vd u0_a234)
Trở ngại chínhGiữ Termux + Tailscale không bị Android tắt nền
🔎

Ghi chú về IP: Tailscale mặc định KHÔNG tunnel toàn bộ traffic internet. Khi chạy curl trên Android, traffic ra internet vẫn đi qua mạng của điện thoại (Wi-Fi/4G) — trừ khi Android dùng một Exit Node. IP 100.x.x.x chỉ là địa chỉ nội bộ tailnet, không phải IP public.