APPLELINUXNETWORKSELF HOSTINGWINDOWSWORDPRESS

Hướng dẫn cài đặt và sử dụng FRP (Fast Reverse Proxy)

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/frp

Lư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.toml

Thê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ại http://SERVER_IP:7500
  • auth.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 32

Bướ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 --reload

Bước 4: Chạy FRP server

Chạy thử nghiệm trực tiếp:

./frps -c frps.toml

Nế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:7500

Thiết lập chạy tự động với systemd (khuyến nghị):

sudo nano /etc/systemd/system/frps.service

Thê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.target

Kí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/frp

Trên Windows:

  1. Tải file frp_x.x.x_windows_amd64.zip từ GitHub releases
  2. Giải nén vào thư mục C:\frp\
  3. 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/frp

Bướ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 Notepad

Ví 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 = 6000

Ví 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 = 8080

Giải thích cấu hình:

  • serverAddr: IP công khai của FRP server
  • serverPort: 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êng
  • name: Tên duy nhất cho proxy
  • type: 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.toml

Windows:

C:\frp\frpc.exe -c C:\frp\frpc.toml

Khi 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 success

Thiế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.target
sudo systemctl daemon-reload
sudo systemctl enable frpc.service
sudo systemctl start frpc.service

Thiết lập chạy tự động (Windows):

  1. Tạo file start-frpc.bat:
@echo off
cd C:\frp
frpc.exe -c frpc.toml
  1. Đặ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_IP

Thay 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 = 8123

Sau 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 = 32400

Ví 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 = 80

Cấ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 = 6000

Client 2 (Server):

[[proxies]]
name = "p2p_ssh"
type = "xtcp"
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22

Tí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 = true

Bật nén (giảm băng thông):

transport.useCompression = true

Lư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 = 3

Nế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.toml

Lỗ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ình

Lỗ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 7000

Lỗ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

  1. Sử dụng Token mạnh: Luôn dùng token ngẫu nhiên dài
  2. TLS cho Dashboard: Cấu hình HTTPS cho dashboard web
  3. Giới hạn IP: Chỉ cho phép IP cụ thể kết nối đến FRP server
  4. Fail2Ban: Cài đặt fail2ban để chặn brute-force attempts
  5. Regular Updates: Luôn cập nhật FRP lên phiên bản mới nhất

Hiệu suất

  1. TCP Multiplexing: FRP tự động sử dụng, không cần cấu hình
  2. Connection Pool: Giảm overhead bằng cách tái sử dụng kết nối​
  3. P2P Mode: Sử dụng khi có thể để giảm độ trễ
  4. 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.

Duy Nghiện
Hãy làm khán giả, đừng làm nhân vật chính :)

You may also like

Nhận thông báo qua email
Nhận thông báo cho
guest

0 Bình luận
Mới nhất
Cũ nhất Nhiều like nhất
Phản hồi nội tuyến
Xem tất cả bình luận