Youtube视频
FRP使用的细节,请观看视频了解更多
FRP服务端安装 & 配置 - Linux
下载解压
# 下载,若要下载最新版本请到官网查看最新的版本
wget https://github.com/fatedier/frp/releases/download/v0.46.0/frp_0.46.0_linux_amd64.tar.gz
# 解压
tar -zxvf frp_0.46.0_linux_amd64.tar.gz
# 进入到解压目录
cd frp_0.46.0_linux_amd64
# 将frps可执行文件移动到用户可执行目录下
mv frps /usr/bin
# 创建frp配置目录
mkdir /etc/frp
# 将frps的最小配置文件移动到配置目录下
mv frps.ini /etc/frp
配置通过systemd
管理frps
新增&编辑配置服务文件
vim /etc/systemd/system/frps.service
[Unit]
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
Restart=on-failure
RestartSec=5s
ExecStart = /usr/bin/frps -c /etc/frp/frps.ini
[Install]
WantedBy = multi-user.target
编辑保存后设置自启
# 刷新服务配置文件
systemctl daemon-reload
# 设置frps自启动
systemctl enable frps
# 启动frps
systemctl start frps
# 查看frps运行状态
systemctl status frps
frps.ini
配置文件 - 注释
# common 下面是通用配置
[common]
# 绑定tcp端口,默认是7000,服务端与客户端默认使用tcp传输
bind_port = 7000
# 绑定udp端口,若需要使用XTCP,需要绑定
bind_udp_port =7000
# 绑定kcp端口,若客户端与服务端使用kcp传输,需要绑定。kcp使用的是udp协议
kcp_bind_port = 7001
# 绑定quic端口,若客户端与服务端使用quic传输,需要绑定。quic使用的是udp协议
quic_bind_port = 7002
# http 和 https 端口绑定
vhost_http_port = 80
vhost_https_port = 443
# Dashboard 相关配置
# 访问端口
dashboard_port = 7500
# 访问的用户名和密码
dashboard_user = admin
dashboard_pwd = admin
# 若需要使用tls访问,可配置
dashboard_tls_mode = true
# 证书文件提前申请放到指定目录下
dashboard_tls_cert_file = /data/cert/frp/frp.idev.dev.cer
dashboard_tls_key_file = /data/cert/frp/frp.idev.dev.key
# 是否启用普罗米修斯监控
enable_prometheus = true
# Token,客户端与服务端认证的秘钥,请使用随机字符串,尽量超长。这里不支持某些特殊字符,若需要加入特殊字符,请手动加入可使用的特殊字符
token = xxxxx
# 优化相关
# 是否启用tcp多路复用,默认启用
tcp_mux = true
# 连接池连接的最大数量
max_pool_count = 10
# 日志相关
# 日志文件输出路径
log_file = /var/log/frps.log
# 日志级别
log_level = info
# 日志最大保存天数,默认3天
log_max_days = 7
# TLS 双向认证,强烈建议开启TLS双向认证加密客户端与服务端数据传输。证书生成请看下面的tls整数生成配置
# 是否强制限制客户端通过tls连接服务端,若ca校验通过,会自动启用
tls_only = true
# 服务端证书文件
tls_cert_file = /data/cert/frp/server.crt
# 服务端证书秘钥文件
tls_key_file = /data/cert/frp/server.key
# ca证书文件
tls_trusted_ca_file = /data/cert/frp/ca.crt
frps.ini
配置文件 - 无注释
[common]
bind_port = 7000
bind_udp_port =7000
kcp_bind_port = 7001
quic_bind_port = 7002
vhost_http_port = 80
vhost_https_port = 443
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
dashboard_tls_mode = true
dashboard_tls_cert_file = /data/cert/frp/frp.idev.dev.cer
dashboard_tls_key_file = /data/cert/frp/frp.idev.dev.key
enable_prometheus = true
token = xxxxx
tcp_mux = true
max_pool_count = 10
log_file = /var/log/frps.log
log_level = info
log_max_days = 7
tls_only = true
tls_cert_file = /data/cert/frp/server.crt
tls_key_file = /data/cert/frp/server.key
tls_trusted_ca_file = /data/cert/frp/ca.crt
FRP客户端安装 & 配置 - Linux
下载解压
# 下载,若要下载最新版本请到官网查看最新的版本
wget https://github.com/fatedier/frp/releases/download/v0.46.0/frp_0.46.0_linux_amd64.tar.gz
# 解压
tar -zxvf frp_0.46.0_linux_amd64.tar.gz
# 进入到解压目录
cd frp_0.46.0_linux_amd64
# 将frpc可执行文件移动到用户可执行目录下
mv frpc /usr/bin
# 创建frp配置目录
mkdir /etc/frp
# 将frpc的最小配置文件移动到配置目录下
mv frpc.ini /etc/frp
配置通过systemd
管理frpc
新增&编辑配置服务文件
vim /etc/systemd/system/frpc.service
[Unit]
Description = frp client
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
Restart=on-failure
RestartSec=5s
ExecStart = /usr/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini
[Install]
WantedBy = multi-user.target
编辑保存后设置自启
# 刷新服务配置文件
systemctl daemon-reload
# 设置frpc自启动
systemctl enable frpc
# 启动frpc
systemctl start frpc
# 查看frpc运行状态
systemctl status frpc
frpc.ini
基本配置
[common]
# 服务端的地址,可使用ip或者域名,使用域名先把IP解析到域名下
server_addr = frp.idev.dev
# 服务端的端口,这里是使用7000
server_port = 7000
# 通信协议,如果需要使用quic或者kcp,需要修改protocol,并且修改server_port为对应协议的服务端端口。使用前要确保服务端已经绑定了对应的端口
protocol = tcp
# admin 管理界面,如果需要使用frpc reload 热加载客户端的配置,必须开启
# 绑定的地址
admin_addr = 10.10.10.92
# 绑定的端口
admin_port = 7400
# 用户名和密码
admin_user = admin
admin_pwd = admin
# token需要和服务端一致
token = xxxxx
# 优化
tcp_mux = true
# 连接池数量,不能超过服务端设置的max_pool_count,否则会以服务端设置的最大值为准
pool_count = 5
# 日志相关
log_file = /var/log/frpc.log
log_level = info
log_max_days = 7
# TLS双向认证
# 是否启用tls
tls_enable = true
# 客户端证书文件
tls_cert_file = /data/cert/frp/client.crt
# 客户端证书秘钥文件
tls_key_file = /data/cert/frp/client.key
# ca证书文件
tls_trusted_ca_file = /data/cert/frp/ca.crt
客户端案例配置
TCP & UDP
SSH
[ssh]
# 类型为tcp
type = tcp
# 指定穿透到局域网的哪个ip和端口
local_ip = 127.0.0.1
local_port = 22
# 指定远程服务端映射的端口
remote_port = 2001
# 启用压缩
use_compression = true
RDP远程控制 - 需要提前开启内网windows主机的远程控制
[rdp]
type = tcp
# 需要被控制的windows主机IP
local_ip = 10.10.10.120
# windows默认远程端口为3389
local_port = 3389
remote_port = 2002
use_compression = true
通过IP访问内网的HTTP服务
[web]
type = tcp
local_ip = 10.10.10.12
local_port = 80
remote_port = 2003
use_compression = true
DNS - UDP协议
[dns]
# 类型需要修改为udp
type = udp
local_ip = 10.10.10.12
local_port = 53
remote_port = 5353
use_compression = true
HTTP & HTTPS
提前准备好内网的WEB服务,这里使用NGINX演示
server {
listen 80;
server_name web.latata.me;
location / {
proxy_pass http://10.10.10.12;
}
}
server {
listen 443 ssl;
server_name web.latata.me;
ssl_certificate /data/cert/latata.me/latata.me.cer;
ssl_certificate_key /data/cert/latata.me/latata.me.key;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 30m;
add_header Strict-Transport-Security "max-age=31536000";
location / {
proxy_pass http://10.10.10.12;
}
}
HTTP
[http]
# 类型为http
type = http
# 我这里是转发到本地的nginx服务的80段鸥
local_port = 80
# 自定义的域名地址,需要提前解析到服务器的IP上
custom_domains = web.latata.me
# 启用压缩
use_compression = true
HTTPS可以通过NGINX等WEB服务器使用,也可以使用FRPC客户端插件实现
HTTPS - NGINX
[https]
# 类型为https
type = https
local_port = 443
custom_domains = web.latata.me
use_compression = true
HTTPS - PLUGIN
[https-plugin]
# 类型同样为https
type = https
custom_domains = web.latata.me
use_compression = true
# 需要指定插件的配置
# 指定使用的插件
plugin = https2http
# 插件处理后,代理到内网的哪个ip和端口
plugin_local_addr = 127.0.0.1:80
# TLS解密的证书和秘钥
plugin_crt_path = /data/cert/latata.me/latata.me.cer
plugin_key_path = /data/cert/latata.me/latata.me.key
STCP
客户端配置
[ssh-stcp]
# 类型为stcp
type = stcp
# 穿透的内网服务
local_ip = 127.0.0.1
local_port = 22
use_compression = true
# 指定秘钥
sk = gioahfawiofhawiof
访问端配置
[ssh-stcp-visitor]
# 类型为stcp
type = stcp
# 角色为访问者
role = visitor
# 指定要访问的客户端服务名称,上面是ssh-stcp
server_name = ssh-stcp
# 秘钥和客户端保持一致
sk = gioahfawiofhawiof
# 绑定一个内网访问的ip和端口
bind_addr = 127.0.0.1
bind_port = 6000
PLUGINS
STATIC_FILE - 静态文件服务器
[static-file]
# 类型为tcp
type = tcp
remote_port = 2004
use_compression = true
# 静态文件服务器插件的配置
plugin = static_file
# 指定需要访问的静态文件目录
plugin_local_path = /usr/share/nginx/html
# 访问的前缀
plugin_strip_prefix = static
# 指定用户名和密码
plugin_http_user = admin
plugin_http_passwd =admin
UNIX_DOMAIN_SOCKET - Unix域套接字
[docker]
type = tcp
remote_port = 2005
use_compression = true
# 插件配置
plugin = unix_domain_socket
# 指定套接字,这里映射到docker上
plugin_unix_path = /var/run/docker.sock
SOCKS5 - 代理
[socks5-proxy]
type = tcp
remote_port = 2006
# 插件配置
plugin = socks5
# 指定代理的用户名和密码
plugin_http_user = admin
plugin_http_passwd = admin
TLS证书自签
自行修改IP和域名信息,没有绑定域名可以把DNS配置删掉
# 生成ca
# 生成ca 秘钥
openssl genrsa -out ca.key 2048
# 生成ca证书,-subj 指定证书的信息,自行修改 C国家 ST省份 L城市 O组织 CN域名 emailAddress邮箱 -days 证书的有效期
openssl req -x509 -new -nodes -key ca.key -subj "/C=CN/ST=ZJ/L=HZ/O=Dev Share/CN=idev.dev/emailAddress=hi@idev.dev" -days 36000 -out ca.crt
# 生成frps服务端证书
# 创建服务端私钥
openssl genrsa -out server.key 2048
# 创建证书签名请求文件
openssl req -new -sha256 -key server.key \
-subj "/C=CN/ST=ZJ/L=HZ/O=Dev Share/CN=idev.dev" \
-reqexts SAN \
-config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:修改为FRP服务端的IP,DNS:修改为解析到服务端的域名")) \
-out server.csr
# 使用CA根证书签名服务器证书
openssl x509 -req -days 36500 -sha256 \
-in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-extfile <(printf "subjectAltName=IP:修改为FRP服务端的IP,DNS:修改为解析到服务端的域名") \
-out server.crt
# 生成frpc客户端证书
openssl genrsa -out client.key 2048
# 创建证书签名请求文件
openssl req -new -sha256 -key client.key \
-subj "/C=CN/ST=ZJ/L=HZ/O=Dev Share/CN=idev.dev" \
-reqexts SAN \
-config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:127.0.0.1,DNS:修改为解析到服务端的域名")) \
-out client.csr
# 使用CA根证书签名客户端证书
openssl x509 -req -days 36500 -sha256 \
-in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1,DNS:修改为解析到服务端的域名") \
-out client.crt