Trong nhiều trường hợp, máy local (PC ở nhà, Windows + XAMPP) không có IP tĩnh, nằm sau NAT của nhà mạng nên không thể truy cập từ Internet.
Giải pháp gọn – nhanh – dân dev rất hay dùng là Reverse SSH Tunnel.

Bài này hướng dẫn từ A–Z, ví dụ thực tế:
👉 Public web local port 80 ra ngoài Internet thông qua VPS, dùng SSH.


1. Reverse SSH Tunnel là gì?

Reverse SSH Tunnel cho phép:

  • Máy local chủ động kết nối ra VPS
  • VPS mở 1 cổng (ví dụ 8080)
  • Request đi vào VPS:8080 sẽ được đẩy ngược về local

Luồng thực tế:

Internet
   ↓
VPS_IP:8080
   ↓ (SSH tunnel)
LOCAL:127.0.0.1:80
   ↓
Apache / Nginx / XAMPP

👉 Không cần:

  • NAT
  • Port forwarding
  • IP tĩnh

2. Điều kiện cần chuẩn bị

🔹 Trên máy local

  • Có SSH client
    • Windows: OpenSSH (có sẵn Windows 10+)
  • Web server đang chạy:
    • Apache / Nginx / XAMPP
    • Lắng nghe tại 127.0.0.1:80

🔹 Trên VPS

  • Có SSH access
  • Cho phép TCP forwarding

3. Cấu hình SSH trên VPS (bắt buộc)

Mở file cấu hình SSH:

sudo nano /etc/ssh/sshd_config

Đảm bảo có (hoặc thêm):

AllowTcpForwarding yes
GatewayPorts yes

GatewayPorts yes rất quan trọng
❌ Nếu không có → chỉ truy cập được từ localhost VPS

Restart SSH:

sudo systemctl restart ssh

4. Tạo SSH alias vps_vnengineer (khuyến nghị)

Trên máy local, mở:

nano ~/.ssh/config

Thêm:

Host vps_vnengineer
    HostName VPS_IP
    User root
    Port 22

👉 Sau này chỉ cần gõ ssh vps_vnengineer cho gọn.


5. Lệnh tạo Reverse SSH Tunnel

Chạy trên máy local:

ssh -f -N -g -R 0.0.0.0:8080:127.0.0.1:80 vps_vnengineer

6. Giải thích chi tiết từng tham số

ssh -f -N -g -R 0.0.0.0:8080:127.0.0.1:80 vps_vnengineer
Thành phầnÝ nghĩa
ssh vps_vnengineerLocal chủ động kết nối ra VPS
-RReverse tunnel
0.0.0.0:8080VPS mở cổng 8080 cho toàn Internet
127.0.0.1:80Đẩy request về web local
-fChạy nền
-NKhông mở shell
-gCho phép host ngoài truy cập

7. Cách kiểm tra đúng (rất hay nhầm)

❌ Sai phổ biến

curl http://localhost:8080

(chạy ở local → KHÔNG đúng)

✅ Đúng cách

Test từ VPS:

curl http://localhost:8080

Test từ máy khác / Internet:

curl http://VPS_IP:8080

Nếu thấy HTML web local → Tunnel OK 🎉


8. Dùng cho nhiều website trong htdocs (Windows + XAMPP)

Ví dụ:

  • htdocs/site1
  • htdocs/site2

Bạn cấu hình VirtualHost trên Apache local:

<VirtualHost *:80>
    ServerName site1.local
    DocumentRoot "D:/xampp/htdocs/site1"
</VirtualHost>

Sau đó truy cập:

http://VPS_IP:8080

👉 Apache local xử lý như bình thường.


9. Ưu & nhược điểm

✅ Ưu điểm

  • Không cần IP tĩnh
  • Không cấu hình router
  • Rất nhanh, tiện test
  • Phù hợp demo, dev, crawl, webhook

❌ Nhược điểm

  • Không phù hợp làm CDN / production lâu dài
  • Mất tunnel nếu SSH disconnect
  • Phải giữ VPS hoạt động

10. Mẹo dùng thực tế (dân dev hay làm)

  • Chạy trong screen / tmux
  • Viết script auto reconnect
  • Kết hợp Nginx VPS làm proxy
  • Gắn domain → VPS_IP:8080
  • Dùng cho:
    • Webhook
    • Crawl
    • Demo khách
    • Debug API

11. Tổng kết

✔️ Lệnh:

ssh -f -N -g -R 0.0.0.0:8080:127.0.0.1:80 vps_vnengineer

✔️ Đây là Reverse SSH Tunnel chuẩn chỉnh
✔️ Giải pháp gọn gàng để public web local ra Internet