内网穿透之FRP,域名访问本地服务【只看这篇就够了,收藏必备】

一、内网穿透简介

互联网上两个不同的主机进行通信首先需要知道对方 IP。根据 IP 协议,只有分配了公网IP的设备才能在互联网上通信和传输数据。而中国人口/设备众多,分配到的IPv4资源又少,因此绝大部分情况是通过路由器/交换机转换公网IP后才上网。

位于路由器/交换机后的设备一般是内网设备,分配的IP地址以 192.168/172.16/10.0 开头,属于内网 IP。要让内网设备对外提供服务,就需要进行内网穿透。

常见穿透工具包括:FRP, ZeroTier 等,本文仅介绍 FRP 的使用。

二、FRP 简介

FRP(Fast Reverse Proxy)是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

基本原理:

  • 在带有公网 ip 的云服务器上部署 frp 的服务端 frps
  • 在需要穿透的内网服务器上部署 frp 的客户端 frpc
  • 每个客户端都会有一个配置文件用于和服务器连接
  • 公网服务器充当代理服务器,用户访问 公网ip + 端口时,公网服务器的 frps 服务会根据端口号,自动转发到对应的内网服务器上,从而访问到内网服务

三、FRP 配置及使用

两种方式:一种下载frp软件,另一种使用docker。

服务端和客户端使用的都是同一份文件,只是配置文件和启动文件不同。因此只需要下载一份文件,并按类型分成两份。

下载地址:https://github.com/fatedier/frp/releases

服务器上输入uname -m是 x86_64 架构,因此下载 linux_amd64 版本

通过命令行下载并解压:

<span class="token function">wget</span> <span class="token parameter variable">-c</span> https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_amd64.tar.gz <span class="token function">tar</span> <span class="token parameter variable">-xvf</span> frp_0.53.2_linux_amd64.tar.gz <span class="token function">mv</span> frp_0.53.2_linux_amd64 frp
<span class="token function">wget</span> <span class="token parameter variable">-c</span> https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_amd64.tar.gz <span class="token function">tar</span> <span class="token parameter variable">-xvf</span> frp_0.53.2_linux_amd64.tar.gz <span class="token function">mv</span> frp_0.53.2_linux_amd64 frp 
wget -c https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_amd64.tar.gz tar -xvf frp_0.53.2_linux_amd64.tar.gz mv frp_0.53.2_linux_amd64 frp

查看目录:

. ├── frpc ├── frpc.toml ├── frps ├── frps.toml └── LICENSE
. ├── frpc ├── frpc.toml ├── frps ├── frps.toml └── LICENSE 
. ├── frpc ├── frpc.toml ├── frps ├── frps.toml └── LICENSE

这些文件分成两部分。

将两类文件分别打包

<span class="token function">mkdir</span> client server <span class="token function">mv</span> frpc* client <span class="token function">mv</span> frps* server
<span class="token function">mkdir</span> client server <span class="token function">mv</span> frpc* client <span class="token function">mv</span> frps* server 
mkdir client server mv frpc* client mv frps* server

server 目录上传到公网服务器任意路径。如果需要自动启动,看下一节。如下编辑 frps.toml,参数见注释。

<span class="token punctuation">[</span>common<span class="token punctuation">]</span> bindAddr <span class="token operator">=</span> <span class="token string">"0.0.0.0"</span> bindPort <span class="token operator">=</span> <span class="token number">7000</span> webServer.addr <span class="token operator">=</span> <span class="token string">"0.0.0.0"</span> webServer.port <span class="token operator">=</span> <span class="token number">7500</span> webServer.user <span class="token operator">=</span> <span class="token string">"admin"</span> webServer.password <span class="token operator">=</span> <span class="token string">"admin123456"</span> auth.method <span class="token operator">=</span> <span class="token string">"token"</span> auth.token <span class="token operator">=</span> <span class="token string">"e10adc3949ba59abbe56e057f20f883e"</span> transport.tcpMux <span class="token operator">=</span> <span class="token boolean">false</span> log.to <span class="token operator">=</span> <span class="token string">"./frps.log"</span> log.level <span class="token operator">=</span> <span class="token string">"info"</span> log.maxDays <span class="token operator">=</span> <span class="token number">3</span>
<span class="token punctuation">[</span>common<span class="token punctuation">]</span>  bindAddr <span class="token operator">=</span> <span class="token string">"0.0.0.0"</span> bindPort <span class="token operator">=</span> <span class="token number">7000</span>  webServer.addr <span class="token operator">=</span> <span class="token string">"0.0.0.0"</span> webServer.port <span class="token operator">=</span> <span class="token number">7500</span> webServer.user <span class="token operator">=</span> <span class="token string">"admin"</span> webServer.password <span class="token operator">=</span> <span class="token string">"admin123456"</span>  auth.method <span class="token operator">=</span> <span class="token string">"token"</span> auth.token <span class="token operator">=</span> <span class="token string">"e10adc3949ba59abbe56e057f20f883e"</span>  transport.tcpMux <span class="token operator">=</span> <span class="token boolean">false</span>  log.to <span class="token operator">=</span> <span class="token string">"./frps.log"</span> log.level <span class="token operator">=</span> <span class="token string">"info"</span> log.maxDays <span class="token operator">=</span> <span class="token number">3</span> 
[common] bindAddr = "0.0.0.0" bindPort = 7000 webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "admin123456" auth.method = "token" auth.token = "e10adc3949ba59abbe56e057f20f883e" transport.tcpMux = false log.to = "./frps.log" log.level = "info" log.maxDays = 3

这里有几个参数需要根据需要手动修改:

其中认证token可以用 pwgen 命令来生成,这个授权码之后在客户端还会用到。

<span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> pwgen <span class="token parameter variable">-y</span> pwgen <span class="token parameter variable">-s</span> <span class="token number">32</span> <span class="token number">1</span>
<span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> pwgen <span class="token parameter variable">-y</span> pwgen <span class="token parameter variable">-s</span> <span class="token number">32</span> <span class="token number">1</span> 
sudo apt install pwgen -y pwgen -s 32 1

运行服务:

./frps <span class="token parameter variable">-c</span> frps.toml
./frps <span class="token parameter variable">-c</span> frps.toml 
./frps -c frps.toml

记得防火墙打开云服务器的7500端口和其他所有提到的端口,这些端口可以用’,'分割,在一个规则中同时打开。然后网页输入公网IP:7500,输入设置的Dashboard账户和密码,登录后即可看到 frp 的状态。

把 frps 添加为系统服务,这一来当系统重启时,Frps 服务会自动启动,并且不需要手动再次启动。

然后云服务端新建文件:frps.service

<span class="token builtin class-name">cd</span> /etc/systemd/system <span class="token function">sudo</span> <span class="token function">vim</span> frps.service
<span class="token builtin class-name">cd</span> /etc/systemd/system <span class="token function">sudo</span> <span class="token function">vim</span> frps.service 
cd /etc/systemd/system sudo vim frps.service

内容如下:

<span class="token punctuation">[</span>Unit<span class="token punctuation">]</span> <span class="token assign-left variable">Description</span><span class="token operator">=</span>frps <span class="token function">service</span> <span class="token assign-left variable">After</span><span class="token operator">=</span>network.target syslog.target <span class="token assign-left variable">Wants</span><span class="token operator">=</span>network.target <span class="token punctuation">[</span>Service<span class="token punctuation">]</span> <span class="token assign-left variable">Type</span><span class="token operator">=</span>simple <span class="token assign-left variable">ExecStart</span><span class="token operator">=</span>/home/user/software/frp/frps <span class="token parameter variable">-c</span> /home/user/software/frp/frps.toml <span class="token assign-left variable">Restart</span><span class="token operator">=</span>always <span class="token assign-left variable">RestartSec</span><span class="token operator">=</span>15s <span class="token punctuation">[</span>Install<span class="token punctuation">]</span> <span class="token assign-left variable">WantedBy</span><span class="token operator">=</span>multi-user.target
<span class="token punctuation">[</span>Unit<span class="token punctuation">]</span> <span class="token assign-left variable">Description</span><span class="token operator">=</span>frps <span class="token function">service</span> <span class="token assign-left variable">After</span><span class="token operator">=</span>network.target syslog.target <span class="token assign-left variable">Wants</span><span class="token operator">=</span>network.target <span class="token punctuation">[</span>Service<span class="token punctuation">]</span> <span class="token assign-left variable">Type</span><span class="token operator">=</span>simple <span class="token assign-left variable">ExecStart</span><span class="token operator">=</span>/home/user/software/frp/frps <span class="token parameter variable">-c</span> /home/user/software/frp/frps.toml <span class="token assign-left variable">Restart</span><span class="token operator">=</span>always <span class="token assign-left variable">RestartSec</span><span class="token operator">=</span>15s <span class="token punctuation">[</span>Install<span class="token punctuation">]</span> <span class="token assign-left variable">WantedBy</span><span class="token operator">=</span>multi-user.target 
[Unit] Description=frps service After=network.target syslog.target Wants=network.target [Service] Type=simple ExecStart=/home/user/software/frp/frps -c /home/user/software/frp/frps.toml Restart=always RestartSec=15s [Install] WantedBy=multi-user.target

设置自启动,并启动服务:

<span class="token function">sudo</span> systemctl <span class="token builtin class-name">enable</span> frps <span class="token function">sudo</span> systemctl start frps
<span class="token function">sudo</span> systemctl <span class="token builtin class-name">enable</span> frps   <span class="token function">sudo</span> systemctl start frps  
sudo systemctl enable frps sudo systemctl start frps

后续如果更改了配置文件,执行下边命令重启服务:

<span class="token function">sudo</span> systemctl daemon-reload <span class="token function">sudo</span> systemctl restart frps
<span class="token function">sudo</span> systemctl daemon-reload <span class="token function">sudo</span> systemctl restart frps 
sudo systemctl daemon-reload sudo systemctl restart frps

查看服务状态:

<span class="token function">sudo</span> systemctl status frps
<span class="token function">sudo</span> systemctl status frps  
sudo systemctl status frps

注:以上为云服务端配置,内网客户端也需要配置

client 目录上传到内网服务器,原来frpc.toml的内容删了,按照如下编辑 frpc.toml,参数见注释。

<span class="token punctuation">[</span>common<span class="token punctuation">]</span> serverAddr <span class="token operator">=</span> <span class="token string">"公网IP地址"</span> serverPort <span class="token operator">=</span> <span class="token number">7000</span> webServer.addr <span class="token operator">=</span> <span class="token string">"0.0.0.0"</span> webServer.port <span class="token operator">=</span> <span class="token number">7500</span> webServer.user <span class="token operator">=</span> <span class="token string">"username"</span> webServer.password <span class="token operator">=</span> <span class="token string">"password"</span> auth.method <span class="token operator">=</span> <span class="token string">"token"</span> auth.token <span class="token operator">=</span> <span class="token string">"e10adc3949ba59abbe56e057f20f883e"</span> auth.additionalScopes <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"HeartBeats"</span><span class="token punctuation">]</span> transport.tcpMux <span class="token operator">=</span> <span class="token boolean">false</span> log.to <span class="token operator">=</span> <span class="token string">"./frpc.log"</span> log.level <span class="token operator">=</span> <span class="token string">"info"</span> log.maxDays <span class="token operator">=</span> <span class="token number">3</span> <span class="token punctuation">[</span><span class="token punctuation">[</span>proxies<span class="token punctuation">]</span><span class="token punctuation">]</span> name <span class="token operator">=</span> <span class="token string">"ssh"</span> <span class="token builtin class-name">type</span> <span class="token operator">=</span> <span class="token string">"tcp"</span> localIP <span class="token operator">=</span> <span class="token string">"127.0.0.1"</span> localPort <span class="token operator">=</span> <span class="token number">22</span> remotePort <span class="token operator">=</span> <span class="token number">2288</span>
<span class="token punctuation">[</span>common<span class="token punctuation">]</span>  serverAddr <span class="token operator">=</span> <span class="token string">"公网IP地址"</span> serverPort <span class="token operator">=</span> <span class="token number">7000</span> webServer.addr <span class="token operator">=</span> <span class="token string">"0.0.0.0"</span> webServer.port <span class="token operator">=</span> <span class="token number">7500</span> webServer.user <span class="token operator">=</span> <span class="token string">"username"</span> webServer.password <span class="token operator">=</span> <span class="token string">"password"</span>  auth.method <span class="token operator">=</span> <span class="token string">"token"</span> auth.token <span class="token operator">=</span> <span class="token string">"e10adc3949ba59abbe56e057f20f883e"</span>  auth.additionalScopes <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"HeartBeats"</span><span class="token punctuation">]</span>  transport.tcpMux <span class="token operator">=</span> <span class="token boolean">false</span>  log.to <span class="token operator">=</span> <span class="token string">"./frpc.log"</span> log.level <span class="token operator">=</span> <span class="token string">"info"</span> log.maxDays <span class="token operator">=</span> <span class="token number">3</span> <span class="token punctuation">[</span><span class="token punctuation">[</span>proxies<span class="token punctuation">]</span><span class="token punctuation">]</span> name <span class="token operator">=</span> <span class="token string">"ssh"</span> <span class="token builtin class-name">type</span> <span class="token operator">=</span> <span class="token string">"tcp"</span> localIP <span class="token operator">=</span> <span class="token string">"127.0.0.1"</span> localPort <span class="token operator">=</span> <span class="token number">22</span> remotePort <span class="token operator">=</span> <span class="token number">2288</span>      
[common] serverAddr = "公网IP地址" serverPort = 7000 webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "username" webServer.password = "password" auth.method = "token" auth.token = "e10adc3949ba59abbe56e057f20f883e" auth.additionalScopes = ["HeartBeats"] transport.tcpMux = false log.to = "./frpc.log" log.level = "info" log.maxDays = 3 [[proxies]] name = "ssh" type = "tcp" localIP = "127.0.0.1" localPort = 22 remotePort = 2288

同样地,本地执行 ./frpc -c frpc.toml 即可启动客户端。

注:frpc.toml可以改名;frpc.toml每一行内容的后面不可以加注释,否则会报错。建议使用 tmux 在后台启动服务
内网服务器一定要能够访问外网(如果是校园网,网络断开的话要重新登陆才行,否则服务也会断开

回到服务器的dashboard界面,找到tcp端口,可以看到2288端口已经是online状态,即绑定成功。以上所有相当于公网IP:2288对应127.0.0.1:22

在上面的client端,也就是frpc.toml文件末尾添加:

<span class="token punctuation">[</span><span class="token punctuation">[</span>proxies<span class="token punctuation">]</span><span class="token punctuation">]</span> name <span class="token operator">=</span> <span class="token string">"ssh"</span> <span class="token builtin class-name">type</span> <span class="token operator">=</span> <span class="token string">"tcp"</span> localIP <span class="token operator">=</span> <span class="token string">"127.0.0.1"</span> localPort <span class="token operator">=</span> <span class="token number">9800</span> remotePort <span class="token operator">=</span> <span class="token number">9000</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>proxies<span class="token punctuation">]</span><span class="token punctuation">]</span> name <span class="token operator">=</span> <span class="token string">"ssh"</span> <span class="token builtin class-name">type</span> <span class="token operator">=</span> <span class="token string">"tcp"</span> localIP <span class="token operator">=</span> <span class="token string">"127.0.0.1"</span> localPort <span class="token operator">=</span> <span class="token number">9800</span> remotePort <span class="token operator">=</span> <span class="token number">9000</span> 
[[proxies]] name = "ssh" type = "tcp" localIP = "127.0.0.1" localPort = 9800 remotePort = 9000

使用frp软件时,在某些服务器上是二进制文件,通过sudo chmod +x frpc等指令也无法执行,那么docker可以完美解决所有问题。

过程同第一种类似。只有在./frps -c frps.toml./frpc -c frpc.toml的时候,换成通过docker启动即可,首先安装docker:

<span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> docker.io <span class="token parameter variable">-y</span> <span class="token function">sudo</span> <span class="token function">groupadd</span> <span class="token function">docker</span> <span class="token function">sudo</span> <span class="token function">usermod</span> <span class="token parameter variable">-aG</span> <span class="token function">docker</span> <span class="token environment constant">$USER</span> <span class="token function">sudo</span> systemctl restart <span class="token function">docker</span> <span class="token function">sudo</span> <span class="token function">chmod</span> a+rw /var/run/docker.sock <span class="token function">sudo</span> <span class="token function">cat</span> /etc/group <span class="token operator">|</span> <span class="token function">grep</span> <span class="token function">docker</span>
 <span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> docker.io <span class="token parameter variable">-y</span>  <span class="token function">sudo</span> <span class="token function">groupadd</span> <span class="token function">docker</span>  <span class="token function">sudo</span> <span class="token function">usermod</span> <span class="token parameter variable">-aG</span> <span class="token function">docker</span> <span class="token environment constant">$USER</span>  <span class="token function">sudo</span> systemctl restart <span class="token function">docker</span>  <span class="token function">sudo</span> <span class="token function">chmod</span> a+rw /var/run/docker.sock  <span class="token function">sudo</span> <span class="token function">cat</span> /etc/group <span class="token operator">|</span> <span class="token function">grep</span> <span class="token function">docker</span> 
sudo apt install docker.io -y sudo groupadd docker sudo usermod -aG docker $USER sudo systemctl restart docker sudo chmod a+rw /var/run/docker.sock sudo cat /etc/group | grep docker

公网的服务端
编辑配置文件,可以放在/etc/frpc/frps.toml,内容如下:

<span class="token punctuation">[</span>common<span class="token punctuation">]</span> bind_port <span class="token operator">=</span> <span class="token number">7000</span> dashboard_port <span class="token operator">=</span> <span class="token number">7500</span> dashboard_user <span class="token operator">=</span> admin dashboard_pwd <span class="token operator">=</span> admin123456 token <span class="token operator">=</span> e10adc3949ba59abbe56e057f20f883e tcp_mux <span class="token operator">=</span> <span class="token boolean">false</span> log_file <span class="token operator">=</span> ./frps.log log_level <span class="token operator">=</span> info log_max_days <span class="token operator">=</span> <span class="token number">3</span>
<span class="token punctuation">[</span>common<span class="token punctuation">]</span>  bind_port <span class="token operator">=</span> <span class="token number">7000</span>  dashboard_port <span class="token operator">=</span> <span class="token number">7500</span> dashboard_user <span class="token operator">=</span> admin dashboard_pwd <span class="token operator">=</span> admin123456  token <span class="token operator">=</span> e10adc3949ba59abbe56e057f20f883e  tcp_mux <span class="token operator">=</span> <span class="token boolean">false</span>  log_file <span class="token operator">=</span> ./frps.log log_level <span class="token operator">=</span> info log_max_days <span class="token operator">=</span> <span class="token number">3</span> 
[common] bind_port = 7000 dashboard_port = 7500 dashboard_user = admin dashboard_pwd = admin123456 token = e10adc3949ba59abbe56e057f20f883e tcp_mux = false log_file = ./frps.log log_level = info log_max_days = 3

然后启动docker:

<span class="token function">docker</span> run <span class="token parameter variable">--restart</span><span class="token operator">=</span>always <span class="token parameter variable">--network</span> <span class="token function">host</span> <span class="token parameter variable">-d</span> <span class="token parameter variable">-v</span> /your-toml-path/frps.toml:/etc/frp/frps.toml <span class="token parameter variable">--name</span> frps snowdreamtech/frps
    <span class="token function">docker</span> run <span class="token parameter variable">--restart</span><span class="token operator">=</span>always <span class="token parameter variable">--network</span> <span class="token function">host</span> <span class="token parameter variable">-d</span> <span class="token parameter variable">-v</span> /your-toml-path/frps.toml:/etc/frp/frps.toml <span class="token parameter variable">--name</span> frps snowdreamtech/frps 
docker run --restart=always --network host -d -v /your-toml-path/frps.toml:/etc/frp/frps.toml --name frps snowdreamtech/frps

内网客户端:
编辑配置文件,可以放在/etc/frpc/frpc.toml,内容如下:

<span class="token punctuation">[</span>common<span class="token punctuation">]</span> server_addr <span class="token operator">=</span> 公网IP地址 server_port <span class="token operator">=</span> <span class="token number">7000</span> token <span class="token operator">=</span> e10adc3949ba59abbe56e057f20f883e tcp_mux <span class="token operator">=</span> <span class="token boolean">false</span> <span class="token punctuation">[</span>single step web ui<span class="token punctuation">]</span> <span class="token builtin class-name">type</span> <span class="token operator">=</span> tcp local_ip <span class="token operator">=</span> <span class="token number">127.0</span>.0.1 local_port <span class="token operator">=</span> <span class="token number">22</span> remote_port <span class="token operator">=</span> <span class="token number">2288</span>
<span class="token punctuation">[</span>common<span class="token punctuation">]</span>  server_addr <span class="token operator">=</span> 公网IP地址 server_port <span class="token operator">=</span> <span class="token number">7000</span>  token <span class="token operator">=</span> e10adc3949ba59abbe56e057f20f883e  tcp_mux <span class="token operator">=</span> <span class="token boolean">false</span> <span class="token punctuation">[</span>single step web ui<span class="token punctuation">]</span> <span class="token builtin class-name">type</span> <span class="token operator">=</span> tcp local_ip <span class="token operator">=</span> <span class="token number">127.0</span>.0.1 local_port <span class="token operator">=</span> <span class="token number">22</span> remote_port <span class="token operator">=</span> <span class="token number">2288</span> 
[common] server_addr = 公网IP地址 server_port = 7000 token = e10adc3949ba59abbe56e057f20f883e tcp_mux = false [single step web ui] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 2288

然后启动docker:

<span class="token function">docker</span> run <span class="token parameter variable">--restart</span><span class="token operator">=</span>always <span class="token parameter variable">--network</span> <span class="token function">host</span> <span class="token parameter variable">-d</span> <span class="token parameter variable">-v</span> /your-toml-path/frpc.toml:/etc/frp/frpc.toml <span class="token parameter variable">--name</span> frpc snowdreamtech/frpc
    <span class="token function">docker</span> run <span class="token parameter variable">--restart</span><span class="token operator">=</span>always <span class="token parameter variable">--network</span> <span class="token function">host</span> <span class="token parameter variable">-d</span> <span class="token parameter variable">-v</span> /your-toml-path/frpc.toml:/etc/frp/frpc.toml <span class="token parameter variable">--name</span> frpc snowdreamtech/frpc 
docker run --restart=always --network host -d -v /your-toml-path/frpc.toml:/etc/frp/frpc.toml --name frpc snowdreamtech/frpc

注:公网的服务端和内网的客户端区别在于:docker镜像不一致。

四、心跳设置

如不设置心跳,FRP 创建的连接可能在间隔较长时间后会断开,重新连接需刷新几次才能成功。FRP 本身提供了心跳机制来维持连接。

注:如果上边FRP自带的心跳已经满足需求,直接滑到后边域名绑定

另外,如果你依然想要使用 crontab 作为保持连接的方法,你可以按照以下步骤设置:
服务端输入 crontab -e,添加定时任务:

* * * * * <span class="token function">curl</span> localhost:8080 --max-time <span class="token number">5</span> <span class="token operator">></span>/dev/null <span class="token operator"><span class="token file-descriptor important">2</span>></span><span class="token file-descriptor important">&1</span>
* * * * * <span class="token function">curl</span> localhost:8080 --max-time <span class="token number">5</span> <span class="token operator">></span>/dev/null <span class="token operator"><span class="token file-descriptor important">2</span>></span><span class="token file-descriptor important">&1</span> 
* * * * * curl localhost:8080 --max-time 5 >/dev/null 2>&1

客户端 toml 文件添加相应的 heartbeat 字段:
如果用github下载的软件启动,添加以下字段:

<span class="token punctuation">[</span><span class="token punctuation">[</span>proxies<span class="token punctuation">]</span><span class="token punctuation">]</span> name <span class="token operator">=</span> <span class="token string">"heartbeat"</span> <span class="token builtin class-name">type</span> <span class="token operator">=</span> <span class="token string">"tcp"</span> localIP <span class="token operator">=</span> <span class="token string">"127.0.0.1"</span> localPort <span class="token operator">=</span> <span class="token number">80</span> remotePort <span class="token operator">=</span> <span class="token number">8080</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>proxies<span class="token punctuation">]</span><span class="token punctuation">]</span> name <span class="token operator">=</span> <span class="token string">"heartbeat"</span> <span class="token builtin class-name">type</span> <span class="token operator">=</span> <span class="token string">"tcp"</span> localIP <span class="token operator">=</span> <span class="token string">"127.0.0.1"</span> localPort <span class="token operator">=</span> <span class="token number">80</span> remotePort <span class="token operator">=</span> <span class="token number">8080</span> 
[[proxies]] name = "heartbeat" type = "tcp" localIP = "127.0.0.1" localPort = 80 remotePort = 8080

如果用docker启动,添加以下字段:

<span class="token punctuation">[</span>heartbeat<span class="token punctuation">]</span> <span class="token builtin class-name">type</span> <span class="token operator">=</span> tcp local_ip <span class="token operator">=</span> <span class="token number">127.0</span>.0.1 local_port <span class="token operator">=</span> <span class="token number">80</span> remote_port <span class="token operator">=</span> <span class="token number">8080</span>
<span class="token punctuation">[</span>heartbeat<span class="token punctuation">]</span> <span class="token builtin class-name">type</span> <span class="token operator">=</span> tcp local_ip <span class="token operator">=</span> <span class="token number">127.0</span>.0.1 local_port <span class="token operator">=</span> <span class="token number">80</span> remote_port <span class="token operator">=</span> <span class="token number">8080</span> 
[heartbeat] type = tcp local_ip = 127.0.0.1 local_port = 80 remote_port = 8080

如果未生效或者担心心跳是否设置成功,可以查看cron日志:

* * * * * <span class="token function">curl</span> localhost:8080 --max-time <span class="token number">5</span> <span class="token operator">></span> /var/log/cron <span class="token operator"><span class="token file-descriptor important">2</span>></span><span class="token file-descriptor important">&1</span> <span class="token function">sudo</span> <span class="token function">service</span> <span class="token function">cron</span> restart <span class="token function">sudo</span> <span class="token function">tail</span> <span class="token parameter variable">-f</span> /var/log/cron
 * * * * * <span class="token function">curl</span> localhost:8080 --max-time <span class="token number">5</span> <span class="token operator">></span> /var/log/cron <span class="token operator"><span class="token file-descriptor important">2</span>></span><span class="token file-descriptor important">&1</span>  <span class="token function">sudo</span> <span class="token function">service</span> <span class="token function">cron</span> restart  <span class="token function">sudo</span> <span class="token function">tail</span> <span class="token parameter variable">-f</span> /var/log/cron 
* * * * * curl localhost:8080 --max-time 5 > /var/log/cron 2>&1 sudo service cron restart sudo tail -f /var/log/cron

注:

  1. 将/var/log下的cron文件权限改成可写,chmod 777 /var/log/cron 即可。
  2. 将云服务端的8080端口打开

请注意,使用 crontab 的方法并不是最优的解决方案,因为它可能会给服务器带来不必要的负担,尤其是当服务不需要这么频繁的心跳检测时。优先考虑使用 FRP 自带的心跳机制。如果你认为 FRP 的心跳机制不足以维持连接,再考虑使用 crontab

五、域名绑定

使用备案好的域名访问使用FRP进行内网穿透的服务,你需要配置FRP服务端(frps)、客户端(frpc)以及进行域名解析。以下是各配置的示例:
FRP服务端配置,frps.toml文件最后添加下面的内容:

vhost_http_port <span class="token operator">=</span> <span class="token number">80</span> vhost_https_port <span class="token operator">=</span> <span class="token number">443</span> subdomain_host <span class="token operator">=</span> yourdomain.com
 vhost_http_port <span class="token operator">=</span> <span class="token number">80</span> vhost_https_port <span class="token operator">=</span> <span class="token number">443</span>  subdomain_host <span class="token operator">=</span> yourdomain.com 
vhost_http_port = 80 vhost_https_port = 443 subdomain_host = yourdomain.com

FRP客户端配置,frpc.toml文件最后添加下面的内容:

<span class="token punctuation">[</span><span class="token punctuation">[</span>proxies<span class="token punctuation">]</span><span class="token punctuation">]</span> name <span class="token operator">=</span> <span class="token string">"domin"</span> <span class="token builtin class-name">type</span> <span class="token operator">=</span> http localIP <span class="token operator">=</span> <span class="token string">"127.0.0.1"</span> localPort <span class="token operator">=</span> <span class="token number">8080</span> subdomain <span class="token operator">=</span> <span class="token function">service</span>
<span class="token punctuation">[</span><span class="token punctuation">[</span>proxies<span class="token punctuation">]</span><span class="token punctuation">]</span> name <span class="token operator">=</span> <span class="token string">"domin"</span>  <span class="token builtin class-name">type</span> <span class="token operator">=</span> http localIP <span class="token operator">=</span> <span class="token string">"127.0.0.1"</span> localPort <span class="token operator">=</span> <span class="token number">8080</span>  subdomain <span class="token operator">=</span> <span class="token function">service</span> 
[[proxies]] name = "domin" type = http localIP = "127.0.0.1" localPort = 8080 subdomain = service

域名解析设置

  • 登录到你的域名管理控制台。
  • 进入DNS管理或域名解析设置页面。
  • 添加A记录,指向FRP服务端的公网IP地址。

假设你的域名是yourdomain.com,你希望通过service.yourdomain.com来访问内网服务,那么你需要添加如下的解析记录:

  • 记录类型:A
  • 主机记录:service
  • 解析线路:默认
  • 记录值:your_public_ip(FRP服务端的公网IP)
  • TTL(生存时间):根据需要设置,通常是默认值或最短值

完成以上配置后,你需要重启FRP服务端和客户端以应用新的配置。在FRP服务端和客户端成功启动并连接后,你应该可以通过域名service.yourdomain.com来访问你的内网服务。

请确保服务器的防火墙或云服务器的安全组设置允许外部访问上述配置的端口,特别是HTTP和HTTPS端口(80和443)。同时,记得检查内网服务的防火墙设置,确保FRP客户端能够访问到内网服务的端口。

注:域名解析可能需要一些时间才能生效,这取决于DNS提供商和TTL设置。一旦DNS解析生效,且FRP配置正确无误,你就可以通过你的域名来访问内网服务了。笔者刚设置完上边的frps,frpc以及域名解析,访问不了,去食堂吃个饭回来就可以访问了,大概十几分钟。

现在既可以通过IP+Port访问,也可以通过域名访问,快去爽吧。

六、域名备案的一些知识点

哪里买的,哪里进行备案。笔者使用的是阿里的域名和云 备案是国内对网络(网站)的一种管理机制。其实就是向有关部门提交一下域名使用人员活公司的实名信息。比如说这个域名主要是用来做什么的,然后负责人的联系方式是什么。只有备案了的域名才能被正常的DNS解析,也就是只有备案的域名才能被正常的访问。如果你的DNS解析服务器在国外,那么也可以不备案,但是不建议这么做。备案以后会少很多麻烦。传统的备案时间较长,可能有20-30天,现在腾讯或者阿里的小程序备案只要7个工作日基本就能搞定了。 备案流程:进入备案小程序---<span class="token operator">></span>填写备案信息---<span class="token operator">></span>云审核---<span class="token operator">></span>管局审核---<span class="token operator">></span>备案成功 有问题云这边会有工作人员call你,帮你修改好有问题的地方。 阿里云有很多新人优惠,第一次买1块钱一年。笔者买了个玩玩,买好后进行域名认证。域名认证一般官方提示需要22min(节假日也是这个时间,其实会快一点)。 填写备案域名和相关信息 网站名称:个人新站 网站服务内容:其他 备注:个人作品展示,个人信息展示 最后是人脸验证等。 提交后云那边有小姐姐帮你审核,如果有问题,会给你打电话,告诉你怎么改。这段时间记得看手机。如果没问题,他们会帮你提交到相应的管局,然后你会收到一条带验证码的短信,你需要在24h内核验链接,验证你的手机号,否则管局会驳回你的备案申请。不过驳回了也没啥事,小姐姐会帮你重新提交。如果这个没问题,应该就等管局那边审核了,几个工作日就好。等通过了会收到短信,再提示你公安部备案,如果你是个人网站或者小型网站,就不用了,因为很麻烦。 好了,就先记录这么多。
哪里买的,哪里进行备案。笔者使用的是阿里的域名和云 备案是国内对网络(网站)的一种管理机制。其实就是向有关部门提交一下域名使用人员活公司的实名信息。比如说这个域名主要是用来做什么的,然后负责人的联系方式是什么。只有备案了的域名才能被正常的DNS解析,也就是只有备案的域名才能被正常的访问。如果你的DNS解析服务器在国外,那么也可以不备案,但是不建议这么做。备案以后会少很多麻烦。传统的备案时间较长,可能有20-30天,现在腾讯或者阿里的小程序备案只要7个工作日基本就能搞定了。 备案流程:进入备案小程序---<span class="token operator">></span>填写备案信息---<span class="token operator">></span>云审核---<span class="token operator">></span>管局审核---<span class="token operator">></span>备案成功 有问题云这边会有工作人员call你,帮你修改好有问题的地方。 阿里云有很多新人优惠,第一次买1块钱一年。笔者买了个玩玩,买好后进行域名认证。域名认证一般官方提示需要22min(节假日也是这个时间,其实会快一点)。 填写备案域名和相关信息 网站名称:个人新站 网站服务内容:其他 备注:个人作品展示,个人信息展示 最后是人脸验证等。 提交后云那边有小姐姐帮你审核,如果有问题,会给你打电话,告诉你怎么改。这段时间记得看手机。如果没问题,他们会帮你提交到相应的管局,然后你会收到一条带验证码的短信,你需要在24h内核验链接,验证你的手机号,否则管局会驳回你的备案申请。不过驳回了也没啥事,小姐姐会帮你重新提交。如果这个没问题,应该就等管局那边审核了,几个工作日就好。等通过了会收到短信,再提示你公安部备案,如果你是个人网站或者小型网站,就不用了,因为很麻烦。 好了,就先记录这么多。 
哪里买的,哪里进行备案。笔者使用的是阿里的域名和云 备案是国内对网络(网站)的一种管理机制。其实就是向有关部门提交一下域名使用人员活公司的实名信息。比如说这个域名主要是用来做什么的,然后负责人的联系方式是什么。只有备案了的域名才能被正常的DNS解析,也就是只有备案的域名才能被正常的访问。如果你的DNS解析服务器在国外,那么也可以不备案,但是不建议这么做。备案以后会少很多麻烦。传统的备案时间较长,可能有20-30天,现在腾讯或者阿里的小程序备案只要7个工作日基本就能搞定了。 备案流程:进入备案小程序--->填写备案信息--->云审核--->管局审核--->备案成功 有问题云这边会有工作人员call你,帮你修改好有问题的地方。 阿里云有很多新人优惠,第一次买1块钱一年。笔者买了个玩玩,买好后进行域名认证。域名认证一般官方提示需要22min(节假日也是这个时间,其实会快一点)。 填写备案域名和相关信息 网站名称:个人新站 网站服务内容:其他 备注:个人作品展示,个人信息展示 最后是人脸验证等。 提交后云那边有小姐姐帮你审核,如果有问题,会给你打电话,告诉你怎么改。这段时间记得看手机。如果没问题,他们会帮你提交到相应的管局,然后你会收到一条带验证码的短信,你需要在24h内核验链接,验证你的手机号,否则管局会驳回你的备案申请。不过驳回了也没啥事,小姐姐会帮你重新提交。如果这个没问题,应该就等管局那边审核了,几个工作日就好。等通过了会收到短信,再提示你公安部备案,如果你是个人网站或者小型网站,就不用了,因为很麻烦。 好了,就先记录这么多。

七、小结

随笔整理。又重新整理了一下。亲自实验过,非常好用,欢迎点赞收藏。

原文链接:https://blog.csdn.net/weixin_43804047/article/details/135174832

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享