Làm chủ frp (Fast Reverse Proxy): Cách ‘đục’ NAT và Firewall để truy cập Server từ xa

Network tutorial - IT technology blog
Network tutorial - IT technology blog

Bài toán đau đầu: Server xịn nhưng chỉ dùng được ở nhà

Anh em SysAdmin hay DevOps chắc không lạ gì cảnh này: Dựng một con server cực xịn ở nhà, cài đủ thứ từ Home Assistant, Database đến Media Server. Ở trong mạng LAN thì chạy mượt, nhưng cứ hễ ra ngoài cà phê, muốn check log hay remote desktop là lại “bó tay”.

Rào cản lớn nhất chính là NATFirewall. Hiện nay, hầu hết gói cước Internet gia đình đều bị “nhốt” sau lớp CGNAT của nhà mạng. Không có IP Public thực thụ, việc hí hoáy “mở port” trên router trở nên vô nghĩa. Tại văn phòng, firewall thường chặn sạch kết nối từ ngoài vào (Inbound), chỉ cho phép đi ra (Outbound).

Hồi trước, mình hay dùng VPN hoặc mua thêm IP tĩnh để mở port. Tuy nhiên, khi quản lý mạng cho văn phòng 50 người, mình thấy cách này khá rườm rà. Nhất là khi cần demo nhanh một web app cho khách hay cho dev team remote vào terminal gấp, việc bắt họ cài client VPN là điều không khả thi.

So sánh nhanh các giải pháp “vượt rào” phổ biến

Để giải quyết việc này, chúng ta thường cân nhắc giữa 3 hướng chính:

1. Port Forwarding truyền thống

  • Ưu điểm: Kết nối trực tiếp, tốc độ cao nhất (ping thấp).
  • Nhược điểm: Cần IP Public, dễ bị tấn công nếu lộ port, cấu hình router phức tạp.

2. VPN (WireGuard, Tailscale)

  • Ưu điểm: Bảo mật tuyệt đối, cảm giác như đang ngồi trong văn phòng.
  • Nhược điểm: Phải cài app trên mọi thiết bị. Gửi link web cho khách hàng mà bắt họ cài Tailscale thì… thôi bỏ đi.

3. Tunneling Services (frp, Ngrok, Cloudflare Tunnel)

  • Ưu điểm: Không cần IP Public, vượt mọi loại NAT, cực kỳ linh hoạt.
  • Nhược điểm: Cần một server trung gian (VPS) để làm cầu nối.

Tại sao mình lại “chốt” frp thay vì Ngrok hay Cloudflare Tunnel?

Ngrok bản free có cái dở là URL thay đổi liên tục mỗi lần restart, rất ức chế. Cloudflare Tunnel thì rất ngon cho Web, nhưng với các giao thức như SSH, RDP hay Game Server, cấu hình thường hơi “khoai” với người mới bắt đầu.

frp (Fast Reverse Proxy) là một dự án mã nguồn mở cực kỳ mạnh mẽ. Với một con VPS “cỏ” giá khoảng 5$/tháng, bạn có toàn quyền kiểm soát luồng dữ liệu. Dữ liệu không đi qua server của bên thứ ba nào, và bạn có thể public bất kỳ thứ gì từ TCP, UDP cho đến HTTP/HTTPS.

Cơ chế hoạt động của frp chia làm hai phần chính:

  • frps (frp Server): Chạy trên máy có IP Public (VPS).
  • frpc (frp Client): Chạy trên máy nội bộ (server ở nhà/văn phòng).

Hướng dẫn triển khai frp từng bước một

Bước 1: Chuẩn bị hạ tầng

Bạn cần một con VPS chạy Linux (Ubuntu là lựa chọn quốc dân) có IP Public. Phía local, bạn có thể dùng Windows, Linux hoặc thậm chí là một con Raspberry Pi bé xíu.

Bước 2: Cấu hình frps trên VPS (Server)

Đầu tiên, hãy tải bản release mới nhất từ GitHub của fatedier/frp. Nhớ chọn đúng kiến trúc amd64 cho VPS.

# Tải về bản v0.54.0
wget https://github.com/fatedier/frp/releases/download/v0.54.0/frp_0.54.0_linux_amd64.tar.gz
tar -zxvf frp_0.54.0_linux_amd64.tar.gz
cd frp_0.54.0_linux_amd64

Mở file frps.toml và cấu hình như sau (lưu ý từ bản 0.52.0 frp đã dùng định dạng TOML):

# frps.toml
bindPort = 7000

# Token bảo mật để tránh người lạ dùng ké tunnel của bạn
auth.token = "mat_khau_sieu_cap_cua_ban"

# Giao diện web để quản lý các kết nối (tùy chọn)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin_password"

Chạy lệnh: ./frps -c frps.toml. Nếu thấy dòng “frps started successfully” là bạn đã thành công một nửa.

Bước 3: Cấu hình frpc trên máy nội bộ (Client)

Tương tự, tải frp về máy local. Mở file frpc.toml để thiết lập các dịch vụ muốn “show” ra ngoài.

Ví dụ, mình muốn public SSH (port 22) và một web server local (port 80) ra Internet qua IP của VPS:

# frpc.toml
serverAddr = "123.45.67.89" # Thay bằng IP Public của VPS
serverPort = 7000

auth.token = "mat_khau_sieu_cap_cua_ban"

[[proxies]]
name = "ssh-remote"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000 # Cổng bạn dùng để SSH từ xa

[[proxies]]
name = "web-local"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["your-domain.com"]

Kích hoạt client: ./frpc -c frpc.toml. Giờ đây, bạn có thể SSH vào server ở nhà bằng lệnh ssh -p 6000 [email protected] từ bất cứ đâu trên thế giới.

Mẹo tối ưu và bảo mật “xương máu”

Sau nhiều năm triển khai cho các dự án thực tế, mình rút ra 3 lưu ý quan trọng để hệ thống không bị “sập” giữa chừng:

1. Đừng chạy lệnh thủ công, hãy dùng Systemd

Nếu bạn tắt cửa sổ terminal, tunnel sẽ chết ngay lập tức. Hãy cài đặt Systemd để frp tự khởi động cùng máy tính và tự động kết nối lại nếu rớt mạng.

2. Quên mở port trên Firewall của VPS

Đây là lỗi kinh điển. Nhiều anh em cấu hình frp xong xuôi nhưng quên mở port 7000 và 6000 trên UFW hoặc Security Group của nhà cung cấp VPS (như DigitalOcean, AWS). Nếu không mở, dữ liệu sẽ bị chặn ngay tại cửa ngõ VPS.

3. Luôn ép sử dụng TLS

Traffic mặc định có thể bị đánh cắp. Hãy thêm dòng transport.tls.force = true vào cả server và client. Việc này giúp mã hóa toàn bộ dữ liệu đi qua tunnel, an tâm hơn khi remote vào các dịch vụ nhạy cảm.

Kết luận

frp thực sự là một con dao đa năng cho anh em kỹ thuật. Thay vì chờ đợi nhà mạng mở NAT hay tốn tiền triệu mua IP tĩnh, bạn chỉ cần một con VPS rẻ tiền là có thể làm chủ hoàn toàn hệ thống của mình.

Mình từng dùng frp để quản lý cả dàn 20 server backup đặt tại nhà khách hàng mà không cần động vào router của họ dù chỉ một giây. Nếu anh em gặp khó khăn khi setup HTTPS hay chạy trên Docker, cứ để lại comment, mình sẽ giải đáp ngay!

Share: