curlCả 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).
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ập nhật repo và package
pkg update && pkg upgrade
pkg install openssh curl
# đặ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.
whoami # ví dụ: u0_a234
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.
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
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.
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 ở background | Tắ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ình | Android Settings → VPN → bật Always-on VPN cho Tailscale; tắt battery optimization cho app Tailscale |
| sshd không tự chạy sau reboot | Cài addon Termux:Boot để tự start sshd + Tailscale khi khởi động máy |
Phải gõ sshd mỗi lần mở Termux | Thêm sshd vào ~/.bashrc hoặc dùng Termux:Boot |
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.
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>
# 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.
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.
| 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 SSH | 8022 (không root) · 22 nếu có root — xem mục 5 |
| Username | kết quả của whoami trong Termux (vd u0_a234) |
| Trở ngại chính | Giữ 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.