FRP?
FRP(Fast Reverse Proxy)是一款高性能的反向代理应用,主要用于内网穿透。通过FRP,您可以将内网服务暴露给外网用户,无需进行复杂的网络配置。
准备工作
服务器:一台具备公网IP的服务器,用于部署FRP服务端。客户端:需要进行内网穿透的设备。FRP程序:可以从FRP官方GitHub页面下载最新版本。
部署步骤(不管是ini格式还是toml格式都可以用下面的配置文件)
服务器 A (具有公共 IP 地址)
解压并放置 frps
二进制文件和 frps.toml
配置文件。
修改frps.toml :
[common]
bind_port = 7000
12
启动frps:
./frps -c ./frps.toml
1
服务器 B (在无法从公共互联网直接访问的服务器上)
解压并放置 frpc
二进制文件和 frpc.toml
配置文件。
修改frpc.toml: (server_addr就是你的ssh连接的ip,remote_port就是你连接的ip端口)
[common]
server_addr = "x.x.x.x"
server_port = 7000
[ssh]
type = "tcp"
local_ip = "127.0.0.1"
local_port = 22
remote_port = 6000
123456789
启动frpc :
./frpc -c ./frpc.toml
1
通过 SSH 访问服务器 B
从另一台机器通过服务器 A 访问服务器 B (假设用户名是 test
):
ssh -o Port=6000 test@x.x.x.x
1
通过多个 SSH 服务共享同一端口
配置 frps.toml
:
[common]
bind_port = 7000
tcpmux_httpconnect_port = 5002
123
配置内部机器 A 和 B 的 frpc.toml
:
[common]
server_addr = "x.x.x.x"
server_port = 7000
[ssh1]
type = "tcpmux"
multiplexer = "httpconnect"
custom_domains = ["machine-a.example.com"]
local_ip = "127.0.0.1"
local_port = 22
[ssh2]
type = "tcpmux"
multiplexer = "httpconnect"
custom_domains = ["machine-b.example.com"]
local_ip = "127.0.0.1"
local_port = 22
1234567891011121314151617
通过 SSH Proxy Command 访问:
ssh -o 'proxycommand socat - PROXY:x.x.x.x:%h:%p,proxyport=5002' test@machine-a.example.com
1
使用自定义域访问内部 Web 服务
配置 frps.toml
:
[common]
bind_port = 7000
vhost_http_port = 8080
123
配置 frpc.toml
:
[common]
server_addr = "x.x.x.x"
server_port = 7000
[web]
type = "http"
local_port = 80
custom_domains = ["www.example.com"]
12345678
在浏览器中访问 http://www.example.com:8080
。
转发 DNS 查询请求
配置 frps.toml
:
[common]
bind_port = 7000
12
配置 frpc.toml
:
[common]
server_addr = "x.x.x.x"
server_port = 7000
[dns]
type = "udp"
local_ip = "8.8.8.8"
local_port = 53
remote_port = 6000
123456789
测试 DNS 解析:
dig @x.x.x.x -p 6000 www.google.com
1
转发 Unix 域套接字
配置 frps.toml
和 frpc.toml
:
[common]
server_addr = "x.x.x.x"
server_port = 7000
[unix_domain_socket]
type = "tcp"
remote_port = 6000
plugin = "unix_domain_socket"
plugin_unix_path = "/var/run/docker.sock"
123456789
测试配置:
curl http://x.x.x.x:6000/version
1
公开简单的 HTTP 文件服务器
配置 frps.toml
和 frpc.toml
:
[common]
server_addr = "x.x.x.x"
server_port = 7000
[test_static_file]
type = "tcp"
remote_port = 6000
plugin = "static_file"
plugin_local_path = "/tmp/files"
plugin_strip_prefix = "static"
plugin_http_user = "abc"
plugin_http_passwd = "abc"
123456789101112
从浏览器访问 http://x.x.x.x:6000/static/
。
为本地 HTTP(S) 服务启用 HTTPS
配置 frpc.toml
:
[common]
server_addr = "x.x.x.x"
server_port = 7000
[test_https2http]
type = "https"
custom_domains = ["test.example.com"]
plugin = "https2http"
plugin_local_addr = "127.0.0.1:80"
plugin_crt_path = "./server.crt"
plugin_key_path = "./server.key"
plugin_host_header_rewrite = "127.0.0.1"
plugin_request_headers = ["x-from-where: frp"]
12345678910111213
访问 https://test.example.com
。
使用 STCP 模式
配置 frps.toml
和 frpc.toml
:
[common]
server_addr = "x.x.x.x"
server_port = 7000
[secret_ssh]
type = "stcp"
secretkey = "abcdefg"
local_ip = "127.0.0.1"
local_port = 22
123456789
在另一台机器上启动 frpc
:
[common]
server_addr = "x.x.x.x"
server_port = 7000
[secret_ssh_visitor]
type = "stcp"
server_name = "secret_ssh"
secretkey = "abcdefg"
bind_addr = "127.0.0.1"
bind_port = 6000
12345678910
使用 SSH 连接:
ssh -oPort=6000 127.0.0.1
1
使用 P2P 模式
配置 frps.toml
和 frpc.toml
:
[common]
server_addr = "x.x.x.x"
server_port = 7000
[p2p_ssh]
type = "xtcp"
secretkey = "abcdefg"
local_ip = "127.0.0.1"
local_port = 22
123456789
在另一台机器上启动 frpc
:
[common]
server_addr = "x.x.x.x"
server_port = 7000
[p2p_ssh_visitor]
type = "xtcp"
server_name = "p2p_ssh"
secretkey = "abcdefg"
bind_addr = "127.0.0.1"
bind_port = 6000
keep_tunnel_open = false
1234567891011
使用 SSH 连接:
ssh -oPort=6000 127.0.0.1
1
配置文件和环境变量
您可以使用 TOML、YAML 或 JSON 格式的配置文件。环境变量可以在配置文件中引用,采用 Go 的标准格式:
# frpc.toml
server_addr = "{{ .Envs.FRP_SERVER_ADDR }}"
server_port = 7000
[ssh]
type = "tcp"
local_ip = "127.0.0.1"
local_port = 22
remote_port = "{{ .Envs.FRP_SSH_REMOTE_PORT }}"
123456789
设置环境变量:
export FRP_SERVER_ADDR=x.x.x.x
export FRP_SSH_REMOTE_PORT=6000
./frpc -c ./frpc.toml
123
服务器仪表板
配置 frps.toml
:
[common]
web_server_addr = "0.0.0.0"
web_server_port = 7500
web_server_user = "admin"
web_server_pwd = "admin"
12345
访问 http://[server_addr]:7500
查看仪表板。
客户端管理界面
配置 frpc.toml
:
[common]
web_server_addr = "127.0.0.1"
web_server_port = 7400
web_server_user = "admin"
web_server_pwd = "admin"
12345
访问 http://127.0.0.1:7400
查看管理界面。
热加载配置
启用 HTTP API:
[common]
web_server_addr = "127.0.0.1"
web_server_port = 7400
123
使用命令重新加载配置:
frpc reload -c ./frpc.toml
1
验证客户端
使用令牌认证:
# frps.toml
[common]
auth_token = "abcdefg"
# frpc.toml
[common]
auth_token = "abcdefg"
1234567
使用 OIDC 身份验证:
# frps.toml
[common]
auth_method = "oidc"
auth_oidc_issuer = "https://example-oidc-issuer.com/"
auth_oidc_audience = "https://oidc-audience.com/.default"
# frpc.toml
[common]
auth_method = "oidc"
auth_oidc_client_id =
"my-client-id"
auth_oidc_client_secret = "my-client-secret"
auth_oidc_audience = "https://oidc-audience.com/.default"
1234567891011121314
获取 JWT:
export FRP_OIDC_TOKEN=$(curl -X POST -d 'client_id=my-client-id' -d 'client_secret=my-client-secret' -d 'audience=https://oidc-audience.com/.default' https://example-oidc-issuer.com/token | jq -r .access_token)
1
配置持久化存储
启用持久化存储:
# frps.toml
[common]
database_type = "sqlite3"
database_path = "/var/lib/frp/frps.db"
1234
配置日志
[common]
log_file = "./frps.log"
log_level = "info"
log_max_days = 3
1234
这样,您可以使用 frp 实现各种隧道需求。可以根据具体需求调整配置以满足安全性和性能的要求。
tip: 如果在连接中提示
[root@docker frp]# ./frpc -c ./frpc.ini
2024/09/02 23:34:39 [W] [service.go:101] login to server failed: dial tcp xx.xx.xx.xxx:7000: connect: connection timed out
12
那么绝大多数情况是存在云服务器端的防火墙连接问题:首先先利用下面的命令检查云服务器的端口开放状态:
a) 防火墙开放端口
防火墙状态:
systemctl status firewalld.service
1
开启防火墙:
systemctl start firewalld.service
1
关闭防火墙
systemctl stop firewalld.service
1
查看已开放端口:
firewall-cmd --permanent --zone=public --list-ports
1
设置开放端口
firewall-cmd --zone=public --add-port=7000/tcp --permanent
1
重启防火墙 (在更改完端口之后一定要更新防火墙,重新载入一下,不然还是会报错!!!)
firewall-cmd --reload
1
b)云服务器开放端口
参考:https://blog.csdn.net/wsjzzcbq/article/details/88896214
2.客户端与服务端的frp的版本不一致
a) 客户端提示:
2024/09/02 23:57:28 [W] [service.go:101] login to server failed: EOF
1
b) 服务端提示:
2024/09/03 11:50:45 [W] [service.go:214] Accept new mux stream error: broken pipe
1
3.如果一开始是后台启动,修改配置再开启报frp已经存在,那么需要查看frp进程
ps -aux|grep frp| grep -v grep
1
杀死进程并重新开启frp服务即可!!!
云服务器端开启端口除了要在服务器内设置外,还要在云服务器控制台的安全组内将开放端口填入!
frp服务端后台运行以及开机自启
一、frpc配置systemctl启动
1.创建systemctl配置文件:
vi /lib/systemd/system/frpc.service
1
2.配置文件填入以下配置信息:
[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
#启动服务的命令(此处写你的frpc的实际安装目录)
ExecStart=/usr/local/frp/frp/frpc -c /usr/local/frp/frp/frpc.ini
ExecReload=/usr/local/frp/frp/frpc reload -c /usr/local/frp/frp/frpc.ini
[Install]
WantedBy=multi-user.target
123456789101112131415161718
3.启动frpc
# 启动frps
systemctl start frpc
# 打开开机自启动
systemctl enable frpc
# 关闭开机自启动
systemctl disable frpc
# 重启应用
systemctl restart frpc
# 停止应用
systemctl stop frpc
# 查看应用的日志
systemctl status frpc
1234567891011121314151617
二、frps配置systemctl启动
类似frpc的配置,只不过是在外网服务器配置frps!!