FRP reverse proxy: frps, frpc và giới hạn cổng trong lab
FRP reverse proxy là cặp frps và frpc dùng để đưa một dịch vụ ở máy trong mạng nội bộ ra cổng của máy có IP công khai. ProxyVN đọc tài liệu gofrp.org ngày 27/10/2026, dựng sơ đồ hai máy lab, soát cấu hình TOML bằng script và đo phạm vi listener. Bài chỉ xuất dịch vụ lab của chính mình.
FRP reverse proxy: vai trò và khác biệt với proxy IP mua ngoài
frp là phần mềm reverse proxy chuyên xuyên mạng nội bộ. Trang Overview của frp mô tả nó hỗ trợ TCP, UDP, HTTP, HTTPS và có chế độ P2P. Mục đích là đưa dịch vụ của một máy không có IP công khai ra ngoài qua một máy có IP công khai.
Nhiều người gặp frp khi tìm cách "chạy proxy trên máy nhà". Cách hiểu đó dễ gây nhầm, nên phần đầu bài làm rõ frp khác gì gói proxy anh em mua.
Hai hướng đi khác nhau
Proxy IP mua ngoài là forward proxy. Ứng dụng của anh em kết nối tới máy proxy, máy proxy đi tiếp tới website. Website thấy IP của máy proxy. Bài forward proxy là gì giải thích hướng này.
frp là reverse proxy. Người dùng bên ngoài kết nối tới cổng của frps trên máy công khai, frp chuyển kết nối đó ngược vào dịch vụ ở máy trong mạng nội bộ. Dịch vụ được "xuất ra", không phải anh em "đi ra". Bài reverse proxy là gì nói rõ khái niệm.
Khi nào frp gần với chuyện proxy
Có một trường hợp frp trông giống proxy: dùng plugin của frpc để dịch vụ xuất ra chính là một cổng SOCKS5 hoặc HTTP. Khi đó người gọi vào frps, đi vào máy trong nhà, và đi tiếp ra Internet bằng đường mạng của máy đó. IP thoát là IP của máy chạy frpc.
Đây là cách hợp lệ để một người truy cập đường mạng riêng của chính mình từ xa, ví dụ về mạng văn phòng. Nó không phải cách bán lại IP và không thay được gói proxy thương mại. Phần cấu hình dưới đây có đúng ví dụ này, kèm tài khoản.
Giới hạn đạo đức và pháp lý
Bài này chỉ xuất dịch vụ lab của chính anh em, trên hai máy anh em quản trị. Không dùng frp để biến máy của người khác thành proxy khi họ không biết, không dùng cho dịch vụ mà anh em không có quyền phơi ra Internet. Hợp đồng của một số nhà mạng nhà riêng còn cấm chia sẻ đường truyền ra ngoài, nên anh em đọc kỹ trước.
Mình đã chạy gì, chưa chạy gì
Mình không tải hay chạy tệp thực thi từ bên ngoài trong lần viết này, nên chưa chạy frps và frpc. Phần đã chạy gồm hai script Python do mình viết. Script thứ nhất soát cặp file frps.toml và frpc.toml. Script thứ hai dựng hai listener giả để đo phạm vi nghe 127.0.0.1 so với 0.0.0.0. Kết quả của cả hai được ghi nguyên văn bên dưới.
Phân biệt frps, frpc trong FRP reverse proxy với forward proxy

Forward proxy và reverse proxy ngược chiều
Hai thành phần có tên gần giống nhau nên người mới hay đặt nhầm máy. Trang Concepts mô tả: frp gồm máy chủ frps và máy khách frpc. Máy chủ đặt ở máy có IP công khai. Máy khách đặt ở máy chứa dịch vụ nội bộ cần xuất.
Cách frp chuyển một kết nối
Người dùng bên ngoài truy cập frps. frps dựa trên cổng hoặc thông tin khác để biết yêu cầu thuộc dịch vụ nào, rồi chuyển về frpc đang giữ kết nối với nó. frpc chuyển tiếp vào địa chỉ nội bộ đã khai. Trả lời đi đường ngược lại.
Điểm then chốt: frpc là bên chủ động gọi ra frps. Máy trong nhà không cần mở cổng vào, chỉ cần đi ra được tới frps. Đó là lý do frp xuyên được qua NAT và tường lửa nhà mạng.
Các kiểu proxy của frp
Trong thuật ngữ frp, một proxy là một dịch vụ nội bộ được xuất ra. Một frpc khai được nhiều proxy cùng lúc. Trang Concepts liệt kê tám kiểu.
Kiểu |
Mô tả theo tài liệu |
Cần cổng trên frps |
|---|---|---|
TCP |
Ánh xạ cổng TCP thuần |
Có, theo remotePort |
UDP |
Ánh xạ cổng UDP thuần |
Có |
HTTP |
Dành cho ứng dụng HTTP, sửa Host header, thêm xác thực |
Cổng vhost |
HTTPS |
Tương tự HTTP nhưng cho HTTPS |
Cổng vhost |
STCP |
TCP bảo mật, người truy cập cũng chạy frpc |
Không |
SUDP |
UDP bảo mật, tương tự STCP |
Không |
XTCP |
Điểm tới điểm, lưu lượng không qua máy chủ |
Không |
TCPMUX |
Nhiều dịch vụ dùng chung một cổng |
Cổng TCPMUX |
Bài này dùng kiểu TCP, vì đơn giản và dễ đo. Cuối bài có nhắc STCP như lựa chọn an toàn hơn khi không muốn mở cổng nào trên frps.
Phiên bản và định dạng tệp
Trang Setup ghi frp viết bằng Go, tải gói nhị phân từ trang GitHub Release, giải nén rồi chép frpc sang máy nội bộ, chép frps sang máy công khai. Định dạng cấu hình hỗ trợ TOML, YAML và JSON. Định dạng INI cũ vẫn chạy nhưng không còn được khuyến nghị.
Bài dùng TOML, đúng như các ví dụ trong tài liệu. Một số tính năng gắn nhãn phiên bản: tokenSource nạp token từ tệp có từ v0.64.0, nạp từ lệnh ngoài có từ v0.66.0, phạm vi cổng bằng mẫu template có từ v0.56.0. Hãy chạy frps --version trên máy của anh em và đối chiếu trước khi chép khóa.
Cổng và địa chỉ mặc định cần nhớ
Theo trang cấu hình máy chủ, bindAddr mặc định là 0.0.0.0, bindPort mặc định 7000, và proxyBindAddr mặc định theo bindAddr. Ở máy khách, serverPort mặc định 7000. Webserver của frps, nếu bật, có địa chỉ mặc định 127.0.0.1.
Ba giá trị mặc định này giải thích phần lớn sự cố bảo mật: frps nghe mọi giao diện nếu anh em không đặt bindAddr, và cổng của từng proxy cũng vậy nếu không đặt proxyBindAddr.
Chuẩn bị topology hai máy lab cho FRP reverse proxy
Lab này cần hai máy, hoặc hai máy ảo, để có đường đi thật qua mạng. Chạy cả hai trên một máy cũng được cho bước đầu, nhưng không kiểm được phạm vi listener.
Sơ đồ tuyến
- Máy A đóng vai máy công khai, giả sử địa chỉ 10.0.0.10. Chạy frps.
- Máy B đóng vai máy trong mạng nội bộ. Chạy frpc và một dịch vụ lab, ví dụ cổng SOCKS5 do plugin của frpc tạo.
- Máy C đóng vai người dùng bên ngoài, gọi vào 10.0.0.10:6001.
Luồng đi: máy C vào 10.0.0.10:6001, frps chuyển cho frpc trên máy B, plugin SOCKS5 của frpc xử lý và đi ra theo mạng của máy B. Ba máy này có thể là ba máy ảo trong một mạng riêng.
Phiên bản, tài khoản và dữ liệu thử
Ghi số phiên bản của frps và frpc, và dùng cùng một bản cho cả hai để khỏi gặp lỗi lệch tính năng. Tạo token riêng cho lab, tạo tài khoản SOCKS5 riêng cho lab. Không dùng mật khẩu của hệ thống thật.
Chuẩn bị sẵn một trang đích cho máy B gọi tới, ví dụ một trang trả về IP người gọi. Sau đó so địa chỉ trả về với IP của máy B và của máy A để biết IP thoát là của máy nào.
Quy tắc đặt tên cổng
Dùng dải cổng nhỏ cho lab, ví dụ 6000 đến 6010. Cổng điều khiển bindPort giữ ở 7000 như mặc định. Cổng dashboard để 7500, chỉ nghe 127.0.0.1. Ghi ba nhóm cổng ra giấy để sau này dễ đối chiếu với allowPorts và tường lửa.
Điều kiện dừng
Nếu máy A có IP công khai thật, kiểm lại tường lửa và danh sách cổng mở trước khi chạy. Chỉ mở cổng 7000 tới địa chỉ máy B và dải 6000 đến 6010 tới địa chỉ máy C. Đừng mở rộng cho cả Internet trong lúc lab chưa xong.
Cấu hình FRP reverse proxy tối thiểu: frps.toml, frpc.toml
Phần này bắt đầu từ ví dụ trong tài liệu rồi siết dần. Mỗi bước thêm một lớp giới hạn.
Ví dụ gốc trong tài liệu
Trang ví dụ SSH cho cấu hình ngắn nhất. Phía máy chủ chỉ có một dòng bindPort = 7000. Phía máy khách có serverAddr, serverPort và một proxy kiểu tcp.
# frps.toml
bindPort = 7000
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
Trường localIP và localPort là địa chỉ dịch vụ nội bộ. Trường remotePort là cổng frps nghe, và lưu lượng vào cổng này được chuyển tới dịch vụ nội bộ. Truy cập SSH bằng lệnh ssh -o Port=6000 [email protected].
Cấu hình này có hai vấn đề an toàn. Không đặt token nên không có gì để đối chiếu, và frps nghe 0.0.0.0. Dùng để thử xem frp chạy, không dùng để để lại máy.
Cấu hình lab siết chặt
Mình đổi ví dụ gốc thành cấu hình lab có xác thực, giới hạn cổng và plugin SOCKS5. Phía máy chủ như sau.
# frps.toml
bindAddr = "10.0.0.10"
bindPort = 7000
proxyBindAddr = "10.0.0.10"
auth.method = "token"
auth.tokenSource.type = "file"
auth.tokenSource.file.path = "/etc/frp/server_token"
transport.tls.force = true
maxPortsPerClient = 1
allowPorts = [
{ start = 6000, end = 6010 }
]
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "doi-mat-khau-dashboard"
log.to = "/var/log/frp/frps.log"
log.level = "info"
Phía máy khách xuất một cổng SOCKS5 có tài khoản, giới hạn băng thông một megabyte mỗi giây.
# frpc.toml
serverAddr = "10.0.0.10"
serverPort = 7000
auth.method = "token"
auth.tokenSource.type = "file"
auth.tokenSource.file.path = "/etc/frp/client_token"
[[proxies]]
name = "lab-socks"
type = "tcp"
remotePort = 6001
transport.bandwidthLimit = "1MB"
[proxies.plugin]
type = "socks5"
username = "lab"
password = "doi-mat-khau-lab"
Cả hai tệp token chứa cùng một chuỗi bí mật, quyền đọc 600. Khi dùng plugin, trang Client Plugin ghi anh em không cần localIP và localPort nữa.
Plugin SOCKS5 và HTTP
Tài liệu có plugin http_proxy với hai tham số httpUser và httpPassword, và plugin socks5 với username và password. Các tham số này đều là tùy chọn, nghĩa là có thể bỏ trống. Bỏ trống nghĩa là cổng proxy mở cho bất kỳ ai tới được remotePort.
Đây chính là bẫy lớn nhất của cách dùng frp làm proxy. Script của mình báo LOI với plugin không tài khoản. Phần xác thực bên dưới giải thích thêm.
Cách frpc đi qua proxy khác để tới frps
Nếu máy B chỉ ra Internet được qua một proxy, trang cấu hình máy khách có trường proxyURL với định dạng giao thức://user:passwd@địa chỉ:cổng. Giao thức hỗ trợ là http, socks5 và ntlm. Cách này cho frpc đi qua proxy mua ngoài để tới frps, nhưng bài này không dùng.
Trường user và chạy nền bằng systemd
Trang cấu hình máy khách có trường user. Khi đặt, tên proxy trở thành user.tênProxy để khỏi trùng với proxy của người khác. Trong lab chỉ có một client nên chưa cần, nhưng nếu nhiều máy cùng dùng một frps thì nên đặt, mỗi máy một giá trị.
Để frps tự chạy lại sau khi khởi động máy, tài liệu có trang hướng dẫn dùng systemd trên Linux: cài đặt, tạo tệp dịch vụ, khởi động, dừng và bật tự chạy theo máy. Hãy trỏ dịch vụ vào đúng tệp cấu hình và chạy bằng tài khoản thường, không dùng quyền quản trị.
Dải cổng bằng mẫu
Từ v0.56.0, tài liệu cho dùng cú pháp range của template Go cùng hàm parseNumberRangePair để sinh nhiều proxy từ một dải cổng. Ví dụ "6000-6006,6007" tạo tám proxy tên test-6000 đến test-6007. Tiện nhưng nguy hiểm nếu quên allowPorts, vì mỗi dòng mở thêm một cổng.
Xác thực, allowPorts và giới hạn listener của FRP reverse proxy

Ba lớp giới hạn: token, allowPorts, listener
Cấu hình chạy được chưa đủ. Phần này nói về ba lớp giới hạn, kèm kết quả đo phạm vi listener.
Token và nguồn token
Trang Authentication ghi frpc và frps hỗ trợ hai cách xác thực: token và oidc, mặc định là token. Token là chuỗi giống nhau ở hai phía. OIDC dùng nhà cung cấp danh tính theo luồng Client Credentials Grant.
Đừng ghi token thẳng vào file nếu có thể tránh. Từ v0.64.0, tokenSource nạp token từ tệp. Tài liệu lưu ý tệp token nên có quyền như 600, khoảng trắng đầu cuối được tự cắt, và giá trị chỉ nạp lúc tải cấu hình, không nạp lại khi chạy. Trường tokenSource loại trừ lẫn nhau với trường token.
Từ v0.66.0, loại exec nạp token từ một lệnh ngoài. Vì lý do an toàn, frpc phải khởi động với cờ --allow-unsafe=TokenSourceExec. Mình không dùng loại này trong lab.
allowPorts: cổng nào được phép
Trang quản lý máy chủ giải thích: để tránh lạm dụng cổng, đặt allowPorts trong cấu hình máy chủ. Mỗi phần tử là một dải với start và end, hoặc một cổng đơn với single. Frpc xin cổng ngoài danh sách sẽ bị từ chối.
Kèm theo đó là maxPortsPerClient, giới hạn số proxy đồng thời của một client. Mặc định không giới hạn, nên lab của mình đặt bằng 1. Hai trường này nên đi cùng nhau.
Phạm vi listener: bindAddr và proxyBindAddr
Trường bindAddr là địa chỉ frps nghe cổng điều khiển, mặc định 0.0.0.0. Trường proxyBindAddr là địa chỉ nghe các cổng proxy, mặc định theo bindAddr. Có hai nơi cần siết, không phải một.
Để thấy sự khác biệt, mình viết listener_scope.py: dựng hai máy chủ TCP giả bằng socket Python, một nghe 127.0.0.1, một nghe 0.0.0.0, rồi nối vào cả hai bằng địa chỉ loopback và địa chỉ LAN của chính máy.
dia chi LAN cua may: 192.168.0.93
bind 127.0.0.1 | qua 127.0.0.1: NOI DUOC | qua 192.168.0.93: TU CHOI (TimeoutError)
bind 0.0.0.0 | qua 127.0.0.1: NOI DUOC | qua 192.168.0.93: NOI DUOC
Đây là kết quả chạy thật trên máy Windows của mình, và không phải đo frp. Listener nghe 127.0.0.1 không nhận kết nối từ địa chỉ LAN, thể hiện bằng lỗi hết thời gian chờ. Listener nghe 0.0.0.0 nhận từ cả hai. Với frp, cổng proxy theo proxyBindAddr cũng như vậy.
Dashboard và Prometheus
Khi bật webServer, frps có Dashboard. Trang Monitoring ghi dữ liệu giám sát nằm trong bộ nhớ, bị xóa sau mỗi lần khởi động lại hoặc giữ bảy ngày. Khi đặt enablePrometheus, giao diện metrics dùng chung địa chỉ với Dashboard, nên phải bật Dashboard trước.
Địa chỉ mặc định của webServer là 127.0.0.1. Script của mình báo LOI nếu anh em đổi sang 0.0.0.0, và báo cảnh báo nếu không có mật khẩu. Truy cập Dashboard qua đường hầm SSH thay vì mở ra ngoài.
Xem log định kỳ để phát hiện cổng bị dò
Cổng frps công khai sẽ bị máy quét thử trong vài giờ đầu. Log ở mức info đủ để thấy các lần đăng nhập thất bại và các yêu cầu xin cổng bị từ chối. Anh em đọc log mỗi ngày trong tuần đầu, rồi mỗi tuần. Nếu số lần đăng nhập sai tăng đột ngột, đổi token và siết tường lửa theo nguồn.
TLS giữa frpc và frps
Trang Communication Security and Optimization viết: khi bật TLS giữa frpc và frps, toàn bộ lưu lượng được mã hóa, và tính năng này bật mặc định ở bản mới. Trường transport.tls.force đặt trên frps làm máy chủ chỉ nhận client có TLS. Lab của mình đặt force bằng true.
Mã hóa riêng từng proxy bằng useEncryption dùng thuật toán aes-128-cfb theo tài liệu, và không cần khi đã bật TLS toàn cục.
Chạy ca đúng sai và đọc log của FRP reverse proxy
Phần này gồm kết quả script soát cấu hình, và kế hoạch chạy ca trên hai máy lab.
Kết quả script soát cặp file
Script frp_check.py đọc frps.toml và frpc.toml bằng thư viện tomllib của Python, rồi áp các quy tắc theo trang cấu hình. Mình soạn hai cặp: cặp lab siết chặt ở phần trên, và cặp xấu mô phỏng cấu hình vội.
== frps: frps_tot.toml
[OK] token nap tu nguon ngoai file cau hinh
[OK] bindAddr = 10.0.0.10
== frpc: frpc_tot.toml
[OK] lab-socks: remotePort 6001 nam trong allowPorts
[OK] lab-socks: plugin socks5 co tai khoan
KET QUA: DAT | loi=0 canh bao=0
== frps: frps_xau.toml
[CANH BAO] token viet thang trong file; dung auth.tokenSource.type=file (tu v0.64.0) va chmod 600
[CANH BAO] bindAddr khong dat: mac dinh nghe 0.0.0.0 (tai lieu)
[LOI] thieu allowPorts: client xin cong nao cung duoc
[LOI] webServer.addr = 0.0.0.0: dashboard khong chi nghe loopback
== frpc: frpc_xau.toml
[LOI] proxy-mo: plugin http_proxy khong co tai khoan: cong proxy mo cho ai toi duoc cong 6000
[CANH BAO] ssh-nha: localIP = 192.168.1.20 khong phai loopback: frpc se dua cong dich vu khac trong mang noi bo ra ngoai
KET QUA: KHONG DAT | loi=3 canh bao=9
Kết quả rút gọn: mình bỏ bốn dòng cảnh báo thiếu cấu hình băng thông và TLS, các dòng còn lại giữ nguyên văn. Tổng cộng cặp xấu có 3 lỗi và 9 cảnh báo, cặp lab có 0 lỗi, 0 cảnh báo.
Lỗi nghiêm trọng nhất của cặp xấu là proxy http_proxy không có tài khoản, vì bất kỳ ai tới được cổng 6000 đều dùng được đường mạng của máy B. Lỗi thứ hai là thiếu allowPorts. Cảnh báo localIP khác loopback nhắc rằng frpc còn có thể đưa một máy khác trong mạng nội bộ ra ngoài.
Log của frp
Tài liệu cấu hình chung ghi khối log gồm trường to cho đường dẫn tệp (hoặc console để in ra màn hình), level với các mức trace, debug, info, warn, error và mặc định là info. Mình đặt tệp log cho frps và để mức info.
Có một trường đáng chú ý trong cấu hình máy chủ: detailedErrorsToClient mặc định bằng true, nghĩa là server trả thông tin lỗi chi tiết cho client. Với client không đáng tin, nên đặt false để lỗi không lộ cấu hình.
Kế hoạch sáu ca trên hai máy

Sáu ca đúng sai trên hai máy lab
Ca |
Việc làm |
Kết quả cần thấy |
|---|---|---|
1 |
Chạy frps rồi frpc đúng token |
frpc báo đăng nhập thành công, Dashboard thấy proxy lab-socks |
2 |
Từ máy C, curl qua SOCKS5 cổng 6001 có tài khoản |
Trang đích trả về IP của máy B |
3 |
Như ca 2 nhưng không tài khoản |
Bị từ chối bởi plugin |
4 |
frpc dùng token sai |
Đăng nhập thất bại, frpc thoát vì loginFailExit mặc định true |
5 |
frpc xin remotePort 7000, ngoài allowPorts |
Proxy bị từ chối |
6 |
Gọi vào 10.0.0.10:6001 từ máy ngoài danh sách tường lửa |
Không nối được |
Mình chưa chạy sáu ca này. Cột phải là điều tài liệu cho phép dự đoán. Ca 4 dựa vào trường loginFailExit, tài liệu ghi mặc định true. Ca 5 dựa vào trang quản lý máy chủ. Nếu máy của anh em cho kết quả khác, ghi lại và tin vào máy.
Kiểm IP thoát của plugin SOCKS5
Với ca 2, mục tiêu không chỉ là thấy trang đích trả về. Anh em còn cần biết IP thoát. Dùng trang đích trả về địa chỉ người gọi, rồi so với IP đường mạng của máy B và IP của máy A. Giá trị đúng phải là IP của máy B, vì plugin chạy trong frpc trên máy đó.
Nếu thấy IP của máy A, kết nối đang đi thẳng từ máy A, tức cấu hình sai chỗ khác. Nếu thấy IP của máy C, ca thử đã bỏ qua proxy. Ghi ba giá trị cạnh nhau vào bảng kết quả để so sánh sau này.
Đọc lỗi từ cả hai phía
Khi proxy lab không dùng được, hỏi ba câu theo thứ tự. Frpc có đăng nhập được frps không, xem log frpc và Dashboard. Cổng remotePort có nghe không, kiểm bằng lệnh liệt kê cổng trên máy A. Plugin ở máy B có nhận kết nối không, xem log frpc.
Nếu hai bước đầu đúng mà vẫn lỗi, chuyển sang bước thứ ba: đường ra Internet của máy B. Frp chỉ chuyển kết nối, không sửa lỗi mạng ở máy B.
Hoàn nguyên, giới hạn tài nguyên và dùng FRP reverse proxy thật
Xong lab thì dọn. Trước khi dùng thật, ghi rõ giới hạn tài nguyên và điều kiện áp dụng.
Hoàn nguyên lab
Dừng frpc trước, rồi frps. Xóa file cấu hình và file token lab. Xóa tệp nhị phân tải về nếu không dùng lại. Đóng các quy tắc tường lửa đã mở cho dải 6000 đến 6010 và cổng 7000. Kiểm lại danh sách cổng nghe trên máy A, đảm bảo không còn tiến trình frps.
Nếu đã chạy bằng systemd theo hướng dẫn trong tài liệu, tắt và gỡ dịch vụ, rồi kiểm tệp dịch vụ không còn trong thư mục hệ thống.
Giới hạn tài nguyên
Tài liệu cho nhiều tham số hạn chế tài nguyên. Băng thông từng proxy bằng transport.bandwidthLimit, đơn vị MB hoặc KB. Mặc định giới hạn thực hiện ở phía client, muốn server thực hiện thì đặt bandwidthLimitMode bằng server.
Máy chủ có maxPoolCount, mặc định 5, giới hạn kích thước hồ kết nối mà client xin. Có userConnTimeout mặc định 10 giây, là thời gian chờ client trả lời sau khi người dùng nối vào. Có heartbeatTimeout mặc định 90 giây.
Ghép với tcpMux, bật mặc định, một kết nối giữa client và server mang nhiều yêu cầu. Nhờ đó số mô tả tệp mở ít hơn. Tài liệu cũng ghi kết nối pool khi đã bật tcpMux chỉ cải thiện ít.
STCP: xuất dịch vụ mà không mở cổng
Với dịch vụ nhạy cảm, tài liệu ví dụ STCP. Phía xuất dịch vụ khai proxy kiểu stcp có secretKey. Phía truy cập cũng chạy frpc, khai một visitor cùng secretKey và bind một cổng cục bộ, ví dụ 127.0.0.1:6000. Frps không phải mở thêm cổng nào cho dịch vụ này.
Nhược điểm: người truy cập phải cài và chạy frpc. Ưu điểm: bề mặt tấn công nhỏ hơn nhiều so với một cổng TCP công khai. Mình chưa thử STCP, nên chỉ nêu như lựa chọn.
Điều kiện áp dụng vào hệ thống thật
- Phiên bản frps và frpc khớp nhau và khớp với tài liệu đã đọc.
- bindAddr, proxyBindAddr và webServer.addr đã đặt, không để mặc định.
- Token nạp từ tệp quyền hạn chế, không viết thẳng trong cấu hình.
- allowPorts và maxPortsPerClient đã đặt.
- Mọi proxy xuất ra có xác thực, và băng thông đã giới hạn.
- Có tường lửa ở máy A cho phép nguồn cụ thể.
- Chủ máy B biết và đồng ý việc xuất dịch vụ, và dịch vụ được phép phơi ra.
- Có kế hoạch dừng khẩn cấp: biết cách tắt frps nhanh.
FRP reverse proxy: checklist và câu hỏi thường gặp
Phần cuối gom các việc cần kiểm trước khi chạy và các câu hỏi thường gặp.
Checklist nhanh

Checklist trước khi dùng FRP reverse proxy thật
- Ghi lại số phiên bản của frps và frpc.
- Chạy frp_check.py hoặc cách soát tương đương trên cả hai file.
- Chạy listener_scope.py hoặc cách đo tương đương để chắc bind đúng.
- Đặt token, allowPorts, maxPortsPerClient, tls.force.
- Plugin proxy luôn có tài khoản.
- Thử từ máy C đủ ca đúng và ca sai.
- Xóa tệp lab và đóng cổng tường lửa khi xong.
Nếu cần một đường ra ổn định thay vì tự dựng, anh em có thể mua proxy Việt Nam tại ProxyVN, gồm proxy dân cư tĩnh Viettel, VNPT, FPT, datacenter Việt Nam và proxy xoay. Các gói hỗ trợ HTTP và SOCKS5 với tài khoản user và mật khẩu.
frp đưa dịch vụ của anh em ra ngoài. Proxy mua ngoài đưa ứng dụng của anh em đi ra. Hai việc ngược chiều, đừng dùng lẫn.
Câu hỏi thường gặp
FRP reverse proxy có thay được proxy dân cư mua ngoài không. Không. IP thoát của frp là IP đường mạng máy chạy frpc, thường là IP nhà hoặc văn phòng của chính anh em. Proxy mua ngoài cho nhiều IP, nhiều vùng, và hỗ trợ nhà cung cấp. Hai thứ khác mục đích.
Mở cổng frps ra Internet có nguy hiểm không. Có nếu thiếu token, thiếu allowPorts hoặc để plugin proxy không tài khoản. Có token mạnh, tls.force, allowPorts, tường lửa theo nguồn, rủi ro giảm nhiều nhưng không bằng không. Luôn xem log định kỳ.
Dùng frp để truy cập SSH máy nhà có ổn không. Ví dụ chính của tài liệu là SSH. Dùng STCP hoặc đặt tường lửa cho nguồn cụ thể an toàn hơn mở cổng 6000 cho cả Internet. Thêm xác thực bằng khóa SSH. Bài SSH ProxyJump là cách khác để đi qua máy trung gian.
Plugin socks5 của frp có hỗ trợ UDP không. Mình chưa đọc trang plugin chi tiết về UDP, nên không khẳng định. Nếu cần UDP, hỏi lại tài liệu hoặc dùng proxy UDP chuyên dụng.
Có thể dùng frp để cho thuê IP của máy mình không. Bài này không hướng dẫn việc đó. Chia sẻ đường truyền cho người khác dùng thường vi phạm hợp đồng nhà mạng, và anh em chịu trách nhiệm về lưu lượng đi qua IP của mình. Cần IP cho thuê hợp lệ thì dùng nhà cung cấp proxy.
Máy B chỉ ra Internet qua proxy công ty thì frpc có chạy được không. Trang cấu hình máy khách có trường proxyURL, hỗ trợ giao thức http, socks5 và ntlm. Mình chưa thử tính năng này. Nếu proxy công ty chặn CONNECT tới cổng 7000, frpc không tới được frps, và đây là lỗi mạng, không phải lỗi cấu hình frp.
Khác gì Port forwarding thường. Chuyển tiếp cổng thông thường chạy trên một máy hoặc qua router, xem bài port forwarding là gì. frp thêm vai trò máy công khai trung gian, nên dùng được khi máy nội bộ không có IP công khai.
FRP reverse proxy và những điều cần nhớ
FRP reverse proxy xuất dịch vụ lab qua frps và frpc, nên cần token, allowPorts, bindAddr đặt rõ và plugin có tài khoản. Hãy đo phạm vi listener trước khi mở cổng. Cần proxy ổn định để đi ra, liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam cho FRP reverse proxy.