FRP là gì? Hướng dẫn cài đặt Fast Reverse Proxy để expose server nội bộ

Hướng dẫn cài đặt và sử dụng FRP (Fast Reverse Proxy)
Ngày đăng: thứ ba, 12 tháng 5 năm 2026 06:59

    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í

    alt text

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

     

    Kích hoạt và khởi động service:
    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
    2. Đặt shortcut của file này vào thư mục Startup: C:\Users\\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.

     

    Nguồn https://vnrom.net/

    Tin xem nhiều

    Api cung cấp dữ liệu phim miễn phí cho các bạn tập tành làm web phim

    Đây là api dành cho các bạn thích làm website hay app về phim, api cung cấp dữ liệu hơn 15000 bộ phim, bao gồm thông tin đạo diễn, diễn viên, ...

    Làm website giá rẻ

    Bạn đang cần làm website giá rẻ nhưng vẫn đảm bảo đẹp, chuyên nghiệp và dễ sử dụng? WebHayHay cung cấp giải pháp làm website vừa túi tiền, phù hợp cho doanh nghiệp nhỏ, hộ kinh doanh, cá nhân bán hàng online muốn có website nhanh chóng mà không tốn quá nhiều chi phí.
    Go Top