Frp高级应用:双向验证、SSL、STCP
参考文献:
本文使用条件
域名一枚,需备案(第三部分域名SSL访问需要)
服务端:Linux(Debian) Docker (snowdreamtech/frps v0.62.1)+ Docker Compose
服务端反代工具:1Panel (与宝塔面类似)+ OpenResty(配置可与Nginx通用)
客户端1:Linux(Debian/Alpine) Docker(snowdreamtech/frpc v0.62.1) + Docker Compose
客户端2:Windows frpc.exe(snowdreamtech/frpc v0.62.1)+NSSM
目录
一、部署
1.1 Linux部署
可参考https://gofrp.org/zh-cn/docs/setup/直接使用二进制文件运行frp并使用systemd
或 supervisor
使之能自动启动
本文演示使用docker、docker compose来部署frp:
1.1.1 文件路径演示:
frp/ #根文件夹
│
├── conf/ #配置文件夹
│ └── frps.toml or frpc.toml
│
├── ssl/ #证书文件夹
│ ├── ca.crt
│ ├── server.crt or client.crt
│ └── server.key or client.key
│
└── docker-compose.yml
1.1.2 部署命令Linux
Linux环境
已安装vim
vim使用:
(!!注意修改为英文输入法!!)
进入vim界面后,按
i
进入编辑修改后需要保存,则先按
Esc
,再输入:wq
保存并退出,如输入:qa!
则不保存退出已安装docker、docker compose
安装代码:https://blog.vekixx.com/archives/docker-cli#二、docker、docker-compose安装
使用ssh连接机器
以下是Debian命令(其他架构自行搜索)
-
切换root
sudo -i
-
创建并进入文件夹
# frps mkdir -p /root/data/docker_data/frps/ # frpc mkdir -p /root/data/docker_data/frpc/ # frps cd /root/data/docker_data/frps/ # frpc cd /root/data/docker_data/frpc/ mkdir conf ssl
-
创建docker-compose.yml
vim docker-compose.yml
-
frps
复制并粘贴以下代码
services: frps: image: snowdreamtech/frps:0.62.1 container_name: frps restart: always network_mode: host volumes: - ./conf/frps.toml:/etc/frp/frps.toml - ./ssl:/etc/frp/ssl command: -c /etc/frp/frps.toml
-
frpc
复制并粘贴以下代码
services: frpc: image: snowdreamtech/frpc:0.62.1 container_name: frpc restart: always network_mode: host volumes: - ./conf/frpc.toml:/etc/frp/frpc.toml - ./ssl:/etc/frp/ssl command: -c /etc/frp/frps.toml
-
-
创建frps/c.toml
-
frps
vim /root/data/docker_data/frps/conf/frps.toml
复制并粘贴以下代码
参考:https://github.com/fatedier/frp/blob/dev/conf/frps_full_example.toml
bindAddr = "0.0.0.0" bindPort = 7000 kcpBindPort = 7000 quicBindPort = 7002 auth.method = "token" auth.token = "your_token" #建议token尽可能复杂 #本教程未使用。如已存在反代工具,需要修改 #vhostHTTPPort = 80 #vhostHTTPSPort = 443 webServer.addr = "0.0.0.0" webServer.port = 6443 webServer.user = "admin" webServer.password = "dash_password" #建议尽可能复杂 transport.maxPoolCount = 2000 transport.tcpMux = true transport.tcpMuxKeepaliveInterval = 60 transport.tcpKeepalive = 7200 transport.tls.certFile = "/etc/frp/ssl/server.crt" transport.tls.keyFile = "/etc/frp/ssl/server.key" transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt" #证书路径本文展示为相对路径,配合本文docker-compose.yml使用。应该也可使用绝对路径,如本文可改为/root/data/docker_data/frps/ssl/ca.crt log.to = "./frps.log" log.level = "info" log.maxDays = 3 log.disablePrintColor = false allowPorts = [ { start = 50000, end = 59999 } ] #frpc中remote port的范围,建议30000以上端口,一般不会冲突 maxPortsPerClient = 0 #frpc代理数量上限 udpPacketSize = 1500 natholeAnalysisDataReserveHours = 168
-
frpc
vim /root/data/docker_data/frpc/conf/frpc.toml
复制并粘贴以下代码
serverAddr = "frps_ip" serverPort = 7000 log.to = "./frpc.log" log.level = "info" log.maxDays = 3 auth.method = "token" auth.token = "your_token" #与frps匹配 #webServer.addr = "127.0.0.1" #webServer.port = 7400 #webServer.user = "admin" #webServer.password = "admin" transport.tls.certFile = "/etc/frp/ssl/client.crt" transport.tls.keyFile = "/etc/frp/ssl/client.key" transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt" #证书路径本文展示为相对路径,配合本文docker-compose.yml使用。应该也可使用绝对路径,如本文可改为/root/data/docker_data/frps/ssl/ca.crt #nas [[proxies]] name = "nas" type = "tcp" localIP = "{nas内网ip}" localPort = 5000 remotePort = 50001 transport.useEncryption = true transport.useCompression = true [[proxies]] name = "nas_stcp_ssh" type = "stcp" secretKey = "stcp_key" #建议尽可能复杂 localIP = "{nas内网ip}" localPort = XXXX #改为nas ssh端口 transport.useEncryption = true transport.useCompression = true
stcp使用参见四、STCP
-
-
创建证书
如何创建参见二、双向验证
复制到
ssl
文件夹内 -
启动容器
docker-compose up -d
查看运行状态
docker ps docker logs frps #查看frps报错信息 docker logs frpc #查看frpc报错信息
1.2 Windows部署
一键脚本frpc v0.62.1打包下载:frp_win_with_script.zip
已在Github开源:https://github.com/Vekixx/frp_windows_with_script找到对应文件右键单击-下载
![]()
1.2.1 文件路径演示:
frp/ #根文件夹
│
├── frpc.toml #配置文件
│
├── ssl/ #证书文件夹
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
│
├── src/ #nssm 脚本文件夹
├── nssm.exe #可使命令转化为Windows服务(可开机自启)
│
├── install.bat #运行服务脚本(开机自启)
│
└── uninstall.bat #删除服务脚本
1.2.2 文件准备
-
下载frpc.exe
-
官方下载链接:https://github.com/fatedier/frp/releases/
- v0.62.1 amd64(90%windows) :https://github.com/fatedier/frp/releases/download/v0.62.1/frp_0.62.1_windows_amd64.zip
-
本站下载链接:frp_0.62.1_windows_amd64.zip
找到对应文件右键单击-下载
-
-
下载nssm
-
本站:
-
本站下载链接:nssm-2.24.zip
找到对应文件右键单击-下载
-
准备启动服务和停止服务的脚本
使用ai创建
-
准备
frpc.toml
serverAddr = "frps_ip" #frps_ip也可改为域名,需要将域名指向frps的ip地址 serverPort = 7000 log.to = "./frpc.log" log.level = "info" log.maxDays = 3 auth.method = "token" auth.token = "your_token" #与frps匹配 transport.tls.certFile = "./ssl/client.crt" transport.tls.keyFile = "./ssl/client.key" transport.tls.trustedCaFile = "./ssl/ca.crt" #证书路径本文展示为windows中相对路径 [[visitors]] name = "nas_stcp_ssh visitor" type = "stcp" serverName = "nas_stcp_ssh" #与对应frpc stcp的name相同 secretKey = "stcp_key" #与对应frpc stcp的secretKey相同 bindAddr = "127.0.0.1" bindPort = 60001 transport.useEncryption = true transport.useCompression = true
1.2.3 运行
- 初次运行:双击
install.bat
即可 - 修改配置:修改
frpc.toml
后先后双击uninstall.bat
、install.bat
即可 - 停止运行:双击
uninstall.bat
即可
二、双向验证
参考:https://gofrp.org/zh-cn/docs/features/common/network/network-tls/
需使用openssl(linux自带,Windows需要下载Win32OpenSSL)
用 openssl 生成 ca 和双方 SAN 证书。
2.1创建文件夹
mkdir -p /root/openssl
cd /root/openssl
2.2 创建默认 OpenSSL 配置文件
cat > my-openssl.cnf << EOF
[ ca ]
default_ca = CA_default
[ CA_default ]
x509_extensions = usr_cert
[ req ]
default_bits = 2048
default_md = sha256
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca
string_mask = utf8only
[ req_distinguished_name ]
[ req_attributes ]
[ usr_cert ]
basicConstraints = CA:FALSE
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = CA:true
EOF
2.3 生成默认 ca:
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN={your_name}.ca.com" -days 50000 -out ca.crt
- 将
"/CN={your_name}.ca.com"
中的{your_name}
换成你的二级域名,如"/CN=vekixx.ca.com"
-days 50000
为50000天后过期,可适当修改。默认365天,但需每年运行此命令
2.4 生成 frps 证书:
openssl genrsa -out server.key 2048
openssl req -new -sha256 -key server.key \
-subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN={your_domain}" \
-reqexts SAN \
-config <(cat my-openssl.cnf <(printf " [SAN] subjectAltName=DNS:{your_domain},IP:{your_frpsip},DNS:{your_domain}")) \
-out server.csr
openssl x509 -req -days 36500 -sha256 \
-in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-extfile <(printf "subjectAltName=DNS:{your_domain},IP:{your_frpsip},DNS:{your_domain}") \
-out server.crt
注1:用查找替换替换本文的
{your_frpsip}
为你的frpc.toml中serverAddr的值,如IP:177.10.10.10
、IP:frp.vekixx.com
注2:使用查找替换替换本文的
{your_domain}
为你的二级域名,如CN=vekixx.com
、DNS:vekixx.com
注3:
-days 36500
为36500天后过期,可适当修改。默认365天,但需每年运行此命令
2.5 生成 frpc 的证书:
openssl genrsa -out client.key 2048
openssl req -new -sha256 -key client.key \
-subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN={your_domain}" \
-reqexts SAN \
-config <(cat my-openssl.cnf <(printf " [SAN] subjectAltName=DNS:{your_domain},DNS:{your_domain}")) \
-out client.csr
openssl x509 -req -days 36500 -sha256 \
-in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-extfile <(printf "subjectAltName=DNS:{your_domain},DNS:{your_domain}") \
-out client.crt
- 注1:使用查找替换替换本文的
{your_domain}
为你的二级域名,如CN=vekixx.com
、DNS:vekixx.com
- 注2:
-days 36500
为36500天后过期,可适当修改。默认365天,但需每年运行此命令
2.6 将证书复制到相应文件夹
- ca.crt —> frps/ssl frpc/ssl
- server.crt server.key —> frps/ssl
- client.crt client.key —> frpc/ssl
cp ./ca.crt ./frps/ssl/ca.crt
cp ./ca.crt ./frpc/ssl/ca.crt
cp ./server.crt ./frps/ssl/server.crt
cp ./server.key ./frps/ssl/server.key
cp ./client.crt ./frps/ssl/client.crt
cp ./client.key ./frps/ssl/client.key
将frps/ssl文件夹复制到frps相应位置
将frpc/ssl文件夹复制到frpc相应位置
三、SSL
以下说明均以需要使用https://nas.xxxx.com
访问本地的群晖NAShttp://10.0.0.1:5000
为例,frps服务器公网ip地址为172.10.10.10
示意图:
3.1 前期准备
3.1.1 DNS设置
在域名托管商中将需要使用的域名指向frps的ip地址,
本例即在
类型
选择A
,在名称
填写nas
,在IPv4地址
填172.10.10.10
,代理状态关闭(Cloudflare专有设置),最后点击保存。
![]()
使用
*
表示这个域名仅用于该服务器使用,不可再指向其他服务器ip。
3.1.2 安装1Panel、安装OpenResty
安装1Panel:
安装OpenResty
- 进入1Panel面板,选择
应用商店
,进入应用商店页面,第一个就为OpenResty,点击安装,使用默认安装即可
3.1.3 证书准备
-
进入1Panel面板,选择
网站
-证书
,进入证书页面 -
选择
Acme 账户
,创建一个账户(只需要填一个邮箱地址即可),用于自动更新证书 -
选择
DNS账户
,创建一个账户,需要事先获取域名托管商的Access key和secret(名称不一样),用于申请证书 -
创建泛域名证书
- 泛域名证书可以给所有的三级域名加上SSL,使用方便
- 点击
申请证书
,主域名填*.your_domain.com
,其他域名填your_domain.com
(只有一个输入框则填入*.your_domain.com,your_domain.com
)。例如我的就需填写*.vekixx.com
、vekixx.com
。 - 最后点击
确定
或者申请
3.2 frp穿透
-
frps.toml
无需操作 -
frpc.toml
serverAddr = "172.10.10.10" serverPort = 7000 log.to = "./frpc.log" log.level = "info" log.maxDays = 3 auth.method = "token" auth.token = "12345678901234567890" #与frps匹配 transport.tls.certFile = "/etc/frp/ssl/client.crt" transport.tls.keyFile = "/etc/frp/ssl/client.key" transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt" #nas [[proxies]] name = "nas" type = "tcp" localIP = "10.0.0.1" localPort = 5000 remotePort = 50001 transport.useEncryption = true transport.useCompression = true
本例演示其实使用
http://172.10.10.10:50001
已经可以开始登录本地的NAS,但尚未完成SSL,无法使用域名访问
3.3 反向代理
-
进入1Panel面板,选择
网站
-网站
,进入网站页面 -
点击创建,选择反向代理,分组不用管,主域名填写
nas.xxxx.com
,代号自动填写,代理地址填写ip:port
,点击确认
此处完成通过
https://nas.xxxx.com
访问本地50001
端口,而50001
端口已于本地群晖NAS登录网页http://10.0.0.1:5000
绑定,即通过https://nas.xxxx.com
访问本地群晖NAShttp://10.0.0.1:5000
但是尚未完成所有设置
-
创建成功后,出现网站列表,点击域名进入网站设置(注意先后顺序)
-
HTTPS:点击启用HTTPS后的按钮,只需要
Acme账户
选择刚才的邮箱,证书自动选择刚才的泛域名证书(只有一个证书的情况下),点最下面的确认 -
反向代理:本次无需修改
-
配置文件:本次无需修改
-
-
此时,访问域名
https://nas.xxxx.com
即可跳转到本地群晖NAS登录界面http://10.0.0.1:5000
注:此时frps服务器防火墙中
50001
端口可不放开,但7000
端口必须打开
3.4 批量反向代理
如果想要大规模的反代,一个一个添加过于繁琐,故通过修改配置文件以达到批量反代的效果
3.4.1 前期准备
- DNS设置:将其他需要反代的域名也指向frps ip(如使用
*
指向frps ip则跳过此步) - 安装1Panel、安装OpenResty与证书准备无需再次操作
3.4.2 frp穿透
-
frpc.toml
只需继续增加端口[[proxies]] name = "emby" #不可重复 type = "tcp" localIP = "10.0.0.1" localPort = 3096 remotePort = 50002 #不可重复 transport.useEncryption = true transport.useCompression = true [[proxies]] name = "alist" #不可重复 type = "tcp" localIP = "10.0.0.1" localPort = 5244 remotePort = 50003 #不可重复 transport.useEncryption = true transport.useCompression = true
3.4.3 反向代理
-
创建网站:
-
如果是新创建网站,只需要在其他域名添加(一个域名一行,不要标点符号),反向代理填主域名(也可以随便填,后面删掉)
alist.xxxx.com emby.xxxx.com aria.xxxx.com . . . qb.xxxx.com
-
已创建网站,只需要在点击域名,进入网站设置页面-
域名设置
-新增域名
,添加新域名即可(格式和上面一样,一个域名一行,不要标点符号)
-
-
HTTPS:同3.3中操作即可
必须在修改配置文件前完成,一旦修改了配置文件,就无法操作HTTPS了(打开页面提示“服务错误”,https开关自动关闭,这是正常情况)
-
反向代理:建议删掉所有反向代理,通过配置文件完成反向代理
3.4.4 修改配置文件(重点)
-
点击
配置文件
(网站设置标题的右侧),进入配置文件修改页面server { listen 80 ; server_name nas.vekixx.com emby.xxxx.com aria.xxxx.com ... qb.xxxx.com; index index.php index.html index.htm default.php default.htm default.html; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; access_log /www/sites/nas.vekixx.com/log/access.log main; error_log /www/sites/nas.vekixx.com/log/error.log; location ^~ /.well-known/acme-challenge { allow all; root /usr/share/nginx/html; } include /www/sites/nas.vekixx.com/proxy/*.conf; if ($scheme = http) { return 301 https://$host$request_uri; } ssl_certificate /www/sites/nas.vekixx.com/ssl/fullchain.pem; ssl_certificate_key /www/sites/nas.vekixx.com/ssl/privkey.pem; ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; error_page 497 https://$host$request_uri; proxy_set_header X-Forwarded-Proto https; add_header Strict-Transport-Security "max-age=31536000"; }
-
只需保留几项,在此基础上修改
server { listen 80 ; server_name nas.vekixx.com emby.xxxx.com aria.xxxx.com ... qb.xxxx.com; ssl_certificate /www/sites/nas.vekixx.com/ssl/fullchain.pem; ssl_certificate_key /www/sites/nas.vekixx.com/ssl/privkey.pem; ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; }
-
添加相应代码
将第3行之后的代码剪切至其他地方,原位添加:
return 301 https://$host$request_uri;
server { listen 80 ; server_name nas.vekixx.com emby.xxxx.com aria.xxxx.com ... qb.xxxx.com; return 301 https://$host$request_uri; }
在下方粘贴
server { listen 443 ssl http2 ; server_name nas.vekixx.com; location / { proxy_pass http://127.0.0.1:50001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Connection ""; } }
在
server_name
下一行粘贴剪切走的代码server { listen 443 ssl http2 ; server_name nas.vekixx.com; ssl_certificate /www/sites/nas.vekixx.com/ssl/fullchain.pem; ssl_certificate_key /www/sites/nas.vekixx.com/ssl/privkey.pem; ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; location / { proxy_pass http://127.0.0.1:50001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Connection ""; } }
上述内容即可当成模板,需要添加一个服务就复制一遍,修改
server_name
后的域名与proxy_pass http://127.0.0.1:45001;
中的端口号 ,以alist为例server { listen 443 ssl http2 ; server_name nas.vekixx.com; ssl_certificate /www/sites/nas.vekixx.com/ssl/fullchain.pem; ssl_certificate_key /www/sites/nas.vekixx.com/ssl/privkey.pem; ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; location / { proxy_pass http://127.0.0.1:50001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Connection ""; } } server { listen 443 ssl http2 ; server_name alist.vekixx.com; ssl_certificate /www/sites/nas.vekixx.com/ssl/fullchain.pem; ssl_certificate_key /www/sites/nas.vekixx.com/ssl/privkey.pem; ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; location / { proxy_pass http://127.0.0.1:50002; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Connection ""; } }
注1:此时frps服务器防火墙中
50001
、50002
端口可不放开,但7000
端口必须打开注2:此外,对于部分文件应用,nginx默认不大于50M,需要传输大文件的需要增加一些代码,如对于Alist
server { listen 443 ssl http2 ; server_name alist.vekixx.com; . . . . . location / { proxy_pass http://127.0.0.1:50002; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Connection ""; #在此后添加 client_max_body_size 10G; #文件大小10G以下 proxy_send_timeout 7200; #超时时间7200s proxy_read_timeout 7200; #超时时间7200s } }
-
点击
保存并重载
完成配置,即完成多个域名反代
四、STCP
上述操作(双向验证+HTTPS)访问本地服务安全已经较高,但是本地服务中还有许多服务不宜暴露在外网,比如SSH、路由器的网页等,一旦被破解,极易造成本地服务崩溃、数据丢失,而STCP则是将其通过更加安全的方法(类VPN)暴露此类服务,即在外网不运行frpc则无法访问此类服务。
示意图:
双方frpc.toml
代码示意图:
#被访问者
serverAddr = "frps_ip"
serverPort = 7000
auth.method = "token"
auth.token = "your_token" #与frps匹配
transport.tls.certFile = "/etc/frp/ssl/client.crt"
transport.tls.keyFile = "/etc/frp/ssl/client.key"
transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt"</br>
[[proxies]]
name = "nas_stcp_ssh" #≈账号
type = "stcp"
secretKey = "stcp_key" #≈密码
localIP = "10.0.0.1"
localPort = 3333
transport.useEncryption = true
transport.useCompression = true
#访问者
serverAddr = "frps_ip"
serverPort = 7000
auth.method = "token"
auth.token = "your_token" #与frps匹配
transport.tls.certFile = "./ssl/client.crt"
transport.tls.keyFile = "./ssl/client.key"
transport.tls.trustedCaFile = "./ssl/ca.crt"</br>
[[visitors]]
name = "nas_stcp_ssh visitor"
type = "stcp"
serverName = "nas_stcp_ssh" #与被访问者name对应 ≈账号
secretKey = "stcp_key" #与被访问者secretKey对应 ≈密码
bindAddr = "127.0.0.1"
bindPort = 60001
transport.useEncryption = true
transport.useCompression = true
使用方法:
-
若是
10.0.0.1:3333
为一网页端口,则使用浏览器访问http://127.0.0.1:60001
即显示http://10.0.0.1:3333
内容 -
若是
10.0.0.1:3333
为一SSH端口,则可使用ssh {user_name}@127.0.0.1 -p 60001
即可打开10.0.0.1的终端SSH软件使用:
-
以Windterm为例:
-
其他SSH软件大多数存在主机、端口、用户,按需填写即可
-
评论区