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

相关链接

如果觉得我的文章对你有用,请随意赞赏