Bạn có một server chạy tại nhà hoặc trong mạng nội bộ công ty, nhưng muốn truy cập nó từ bất kỳ đâu trên internet? Bạn đang gặp khó khăn với tường lửa, NAT, hoặc không có quyền cấu hình router? FRP (Fast Reverse Proxy) chính là giải pháp hoàn hảo cho vấn đề này—một công cụ mã nguồn mở mạnh mẽ, nhẹ, và cực kỳ dễ sử dụng để expose các dịch vụ nội bộ ra internet một cách an toàn và hiệu quả.
FRP là gì?
FRP (Fast Reverse Proxy) là một công cụ reverse proxy nhanh chóng giúp bạn expose một server nội bộ nằm sau NAT hoặc firewall ra internet thông qua một server có địa chỉ IP công khai. Khác với các giải pháp reverse proxy truyền thống như Nginx hay Apache, FRP được thiết kế đặc biệt cho intranet penetration (xuyên thủng mạng nội bộ), cho phép các thiết bị trong mạng riêng kết nối ra ngoài mà không cần mở cổng trên router hay cấu hình phức tạp.
Điểm nổi bật của FRP
- Hiệu suất cao: FRP sử dụng TCP stream multiplexing để tối ưu hóa băng thông và giảm độ trễ
- Dễ cấu hình: Cấu hình đơn giản thông qua file TOML/YAML/JSON, không cần kiến thức chuyên sâu về mạng
- Đa giao thức: Hỗ trợ TCP, UDP, HTTP, HTTPS, STCP, SUDP và nhiều giao thức khác
- Bảo mật: Mã hóa end-to-end, xác thực token, và hỗ trợ TLS
- Đa nền tảng: Chạy trên Linux, Windows, macOS, FreeBSD và ARM
- Dashboard Web: Giao diện quản lý trực quan để giám sát các kết nối
- P2P Mode: Kết nối peer-to-peer trực tiếp để tăng hiệu suất
- Load Balancing: Phân phối tải cho nhiều backend services
- Miễn phí và mã nguồn mở: Giấy phép Apache 2.0, hoàn toàn miễn phí

Các trường hợp sử dụng phổ biến
FRP phù hợp với nhiều tình huống thực tế:
1. Truy cập Homelab từ xa: Expose các dịch vụ homelab (Plex, Home Assistant, NAS) ra internet mà không cần IP tĩnh hay mở cổng router
2. Phát triển web: Cho phép khách hàng hoặc đồng nghiệp xem ứng dụng đang phát triển trên localhost của bạn
3. SSH/RDP Từ Xa: Truy cập máy tính hoặc server nội bộ qua SSH hoặc Remote Desktop từ bất kỳ đâu
4. Game Servers: Host game server tại nhà và cho bạn bè kết nối mà không cần port forwarding
5. IoT và Smart Home: Kết nối với thiết bị IoT trong nhà từ bên ngoài một cách an toàn
6. Bypass Corporate Firewall: Truy cập các dịch vụ bị chặn bởi tường lửa công ty (sử dụng hợp pháp và có trách nhiệm)
Yêu cầu hệ thống
Để chạy FRP server (Trên server có IP công khai)
- Hệ điều hành: Linux (Ubuntu, Debian, CentOS), Windows Server, macOS
- RAM: Tối thiểu 512MB (khuyến nghị 1GB+)
- CPU: 1 core (khuyến nghị 2+ cores)
- Địa chỉ IP công khai: Bắt buộc
- Cổng mở: Port 7000 (hoặc tùy chỉnh) phải được mở trên firewall
Để chạy FRP Client (Trên máy nội bộ)
- Hệ điều hành: Linux, Windows, macOS, FreeBSD, ARM
- RAM: Tối thiểu 128MB
- Kết nối Internet: Cần để kết nối đến FRP server
Hướng dẫn cài đặt FRP
Phần 1: Cài đặt FRP server (frps)
FRP server cần được cài đặt trên một máy chủ có địa chỉ IP công khai (VPS, cloud server, v.v.).
Bước 1: Tải FRP từ GitHub
# Truy cập thư mục tạm
cd /tmp
# Tải phiên bản mới nhất (v0.61.1 tại thời điểm viết bài)
wget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz
# Giải nén
tar -zxvf frp_0.65.0_linux_amd64.tar.gz
# Di chuyển đến thư mục cài đặt
sudo mv frp_0.65.0_linux_amd64 /usr/local/frp
# Chuyển đến thư mục FRP
cd /usr/local/frpLưu ý: Thay v0.65.0 bằng phiên bản mới nhất từ trang releases.
Bước 2: Tạo file cấu hình server
FRP hiện khuyến nghị sử dụng định dạng TOML thay vì INI cũ. Tạo file frps.toml:
sudo nano /usr/local/frp/frps.tomlThêm cấu hình cơ bản sau:
# Cổng FRP server lắng nghe kết nối từ clients
bindPort = 7000
# Dashboard web (tùy chọn nhưng rất hữu ích)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin123"
# Token xác thực (bắt buộc cho bảo mật)
auth.method = "token"
auth.token = "YOUR_SECRET_TOKEN_HERE"Giải thích cấu hình:
bindPort: Cổng mà FRP server lắng nghe (mặc định 7000)webServer.*: Cấu hình dashboard web tạihttp://SERVER_IP:7500auth.token: Token bí mật để xác thực clients (bắt buộc phải giống nhau giữa server và client)
Bảo mật quan trọng: Thay YOUR_SECRET_TOKEN_HERE bằng một chuỗi ngẫu nhiên mạnh:
openssl rand -hex 32Bước 3: Mở Firewall
# Ubuntu/Debian với ufw
sudo ufw allow 7000/tcp
sudo ufw allow 7500/tcp
# CentOS/RHEL với firewalld
sudo firewall-cmd --permanent --add-port=7000/tcp
sudo firewall-cmd --permanent --add-port=7500/tcp
sudo firewall-cmd --reloadBước 4: Chạy FRP server
Chạy thử nghiệm trực tiếp:
./frps -c frps.tomlNếu thành công, bạn sẽ thấy log tương tự:
2025/10/25 16:00:00 [I] [root.go:200] frps started successfully
2025/10/25 16:00:00 [I] [service.go:193] Dashboard is running at http://0.0.0.0:7500Thiết lập chạy tự động với systemd (khuyến nghị):
sudo nano /etc/systemd/system/frps.serviceThêm nội dung:
[Unit]
Description=FRP Server
After=network.target
[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.targetKích hoạt và khởi động service:
sudo systemctl daemon-reload
sudo systemctl enable frps.service
sudo systemctl start frps.service
sudo systemctl status frps.service
Phần 2: Cài đặt FRP Client (frpc)
FRP client được cài đặt trên máy nội bộ mà bạn muốn expose ra internet.
Bước 1: Tải FRP Client
Trên Linux:
cd /tmp
wget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz
tar -zxvf frp_0.65.0_linux_amd64.tar.gz
sudo mv frp_0.65.0_linux_amd64 /usr/local/frp
cd /usr/local/frpTrên Windows:
- Tải file
frp_x.x.x_windows_amd64.ziptừ GitHub releases - Giải nén vào thư mục
C:\frp\ - Mở Command Prompt hoặc PowerShell với quyền Administrator
Trên macOS:
cd /tmp
wget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_darwin_amd64.tar.gz
tar -zxvf frp_0.65.0_darwin_amd64.tar.gz
sudo mv frp_0.65.0_darwin_amd64 /usr/local/frp
cd /usr/local/frpBước 2: Tạo file cấu hình Client
Tạo file frpc.toml:
# Linux/macOS
sudo nano /usr/local/frp/frpc.toml
# Windows: Tạo file C:\frp\frpc.toml bằng NotepadVí dụ cấu hình expose SSH:
# Thông tin kết nối đến FRP server
serverAddr = "YOUR_SERVER_PUBLIC_IP"
serverPort = 7000
# Token xác thực (phải giống với server)
auth.method = "token"
auth.token = "YOUR_SECRET_TOKEN_HERE"
# Proxy SSH: Expose cổng SSH 22 ra cổng 6000 trên server
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000Ví dụ cấu hình expose Web Server:
serverAddr = "YOUR_SERVER_PUBLIC_IP"
serverPort = 7000
auth.method = "token"
auth.token = "YOUR_SECRET_TOKEN_HERE"
# Proxy HTTP: Expose web server nội bộ
[[proxies]]
name = "web"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["example.com"]
# Hoặc expose qua TCP
[[proxies]]
name = "web-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 8080Giải thích cấu hình:
serverAddr: IP công khai của FRP serverserverPort: Port FRP server đang lắng nghe (7000)auth.token: Token xác thực (phải giống server)[[proxies]]: Mỗi service cần expose là một proxy riêngname: Tên duy nhất cho proxytype: Loại proxy (tcp, udp, http, https, stcp, xtcp)localIP: IP của service nội bộ (127.0.0.1 nếu cùng máy)localPort: Port của service nội bộremotePort: Port trên server công khai (cho TCP/UDP)customDomains: Domain tùy chỉnh (cho HTTP/HTTPS)
Bước 3: Chạy FRP Client
Linux/macOS:
./frpc -c frpc.tomlWindows:
C:\frp\frpc.exe -c C:\frp\frpc.tomlKhi thành công, bạn sẽ thấy:
2025/10/25 16:10:00 [I] [service.go:xxx] login to server success
2025/10/25 16:10:00 [I] [proxy_manager.go:xxx] [ssh] start proxy successThiết lập chạy tự động (Linux):
sudo nano /etc/systemd/system/frpc.service[Unit]
Description=FRP Client
After=network.target
[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.toml
ExecReload=/usr/local/frp/frpc reload -c /usr/local/frp/frpc.toml
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable frpc.service
sudo systemctl start frpc.serviceThiết lập chạy tự động (Windows):
- Tạo file
start-frpc.bat:
@echo off
cd C:\frp
frpc.exe -c frpc.toml- Đặt shortcut của file này vào thư mục Startup:
C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Hướng dẫn sử dụng FRP
Ví dụ 1: Truy cập SSH từ xa
Sau khi cấu hình như trên với proxy SSH, bạn có thể SSH vào máy nội bộ từ bất kỳ đâu:
ssh -p 6000 username@YOUR_SERVER_PUBLIC_IPThay username bằng tài khoản trên máy nội bộ và YOUR_SERVER_PUBLIC_IP bằng IP công khai của FRP server.
Ví dụ 2: Expose Home Assistant
Giả sử bạn chạy Home Assistant trên 192.168.1.12:8123 trong mạng nhà:
Cấu hình frpc.toml:
serverAddr = "YOUR_SERVER_PUBLIC_IP"
serverPort = 7000
auth.method = "token"
auth.token = "YOUR_SECRET_TOKEN_HERE"
[[proxies]]
name = "homeassistant"
type = "tcp"
localIP = "192.168.1.12"
localPort = 8123
remotePort = 8123Sau khi khởi động frpc, truy cập Home Assistant tại: http://YOUR_SERVER_PUBLIC_IP:8123
Ví dụ 3: Expose Multiple Services
Bạn có thể expose nhiều service trong một file cấu hình:
serverAddr = "YOUR_SERVER_PUBLIC_IP"
serverPort = 7000
auth.method = "token"
auth.token = "YOUR_SECRET_TOKEN_HERE"
# SSH
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
# Web Server
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 8080
# Plex Media Server
[[proxies]]
name = "plex"
type = "tcp"
localIP = "192.168.1.100"
localPort = 32400
remotePort = 32400Ví dụ 4: HTTP với Custom Domain
Nếu bạn có domain trỏ đến FRP server, bạn có thể expose HTTP service:
Cấu hình server frps.toml (thêm):
vhostHTTPPort = 80Cấu hình client frpc.toml:
serverAddr = "YOUR_SERVER_PUBLIC_IP"
serverPort = 7000
auth.method = "token"
auth.token = "YOUR_SECRET_TOKEN_HERE"
[[proxies]]
name = "web"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["myapp.example.com"]Truy cập tại: http://myapp.example.com
Ví dụ 5: HTTPS với TLS
[[proxies]]
name = "web-secure"
type = "https"
localIP = "127.0.0.1"
localPort = 443
customDomains = ["secure.example.com"]Ví dụ 6: P2P Mode (Kết nối trực tiếp)
P2P mode cho phép hai client kết nối trực tiếp với nhau thay vì qua server, giảm độ trễ:
Client 1 (Visitor):
[[visitors]]
name = "p2p_ssh_visitor"
type = "xtcp"
serverName = "p2p_ssh"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 6000Client 2 (Server):
[[proxies]]
name = "p2p_ssh"
type = "xtcp"
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22Tính năng nâng cao
1. Mã hóa và nén
Bật mã hóa (AES-128-CFB):
# Trong frpc.toml
transport.useEncryption = trueBật nén (giảm băng thông):
transport.useCompression = trueLưu ý: Mã hóa và nén tăng CPU usage nhưng cải thiện bảo mật và giảm băng thông.
2. Load Balancing
Phân phối tải cho nhiều backend servers:
[[proxies]]
name = "web1"
type = "tcp"
localIP = "192.168.1.10"
localPort = 80
remotePort = 8080
loadBalancer.group = "web"
loadBalancer.groupKey = "secret"
[[proxies]]
name = "web2"
type = "tcp"
localIP = "192.168.1.11"
localPort = 80
remotePort = 8080
loadBalancer.group = "web"
loadBalancer.groupKey = "secret"Lưu lượng đến port 8080 sẽ được phân phối giữa hai servers.
3. Health Checks
FRP tự động kiểm tra health của backend services:
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 8080
healthCheck.type = "tcp"
healthCheck.intervalSeconds = 10
healthCheck.timeoutSeconds = 3
healthCheck.maxFailed = 3Nếu service không phản hồi sau 3 lần thử, proxy sẽ ngừng forward traffic.
4. Bảo vệ HTTP Basic Auth
[[proxies]]
name = "web"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["private.example.com"]
httpUser = "admin"
httpPassword = "secure123"Người dùng phải nhập username/password để truy cập.
Xử lý lỗi phổ biến
Lỗi 1: “Login to server failed”
Nguyên nhân: Token không khớp giữa client và server.
Giải pháp:
# Kiểm tra token trong frps.toml và frpc.toml phải giống nhau
grep "token" /usr/local/frp/frps.toml
grep "token" /usr/local/frp/frpc.tomlLỗi 2: “Port already used”
Nguyên nhân: Port đã được sử dụng bởi service khác.
Giải pháp:
# Kiểm tra port đang được sử dụng
sudo netstat -tulpn | grep :7000
# Hoặc thay đổi port trong cấu hìnhLỗi 3: “Connection refused”
Nguyên nhân: Firewall chặn hoặc FRP server không chạy.
Giải pháp:
# Kiểm tra FRP server đang chạy
sudo systemctl status frps
# Kiểm tra firewall
sudo ufw status
sudo firewall-cmd --list-all
# Thử kết nối thủ công
telnet YOUR_SERVER_IP 7000Lỗi 4: “Proxy already exists”
Nguyên nhân: Tên proxy bị trùng.
Giải pháp: Đặt tên unique cho mỗi proxy trong [[proxies]] section.
Mẹo tối ưu hóa và bảo mật
Bảo mật
- Sử dụng Token mạnh: Luôn dùng token ngẫu nhiên dài
- TLS cho Dashboard: Cấu hình HTTPS cho dashboard web
- Giới hạn IP: Chỉ cho phép IP cụ thể kết nối đến FRP server
- Fail2Ban: Cài đặt fail2ban để chặn brute-force attempts
- Regular Updates: Luôn cập nhật FRP lên phiên bản mới nhất
Hiệu suất
- TCP Multiplexing: FRP tự động sử dụng, không cần cấu hình
- Connection Pool: Giảm overhead bằng cách tái sử dụng kết nối
- P2P Mode: Sử dụng khi có thể để giảm độ trễ
- Nén: Chỉ bật khi băng thông quan trọng hơn CPU
FRP là một công cụ mạnh mẽ và linh hoạt cho bất kỳ ai cần expose các service nội bộ ra internet một cách nhanh chóng và an toàn. Với cấu hình đơn giản, hiệu suất cao, và nhiều tính năng nâng cao như load balancing, P2P mode, và health checks, FRP phù hợp cho cả môi trường phát triển lẫn production.








