2025-03-22
网站技术
0

目录

frp介绍
网络结构
服务端
客户端
结语

前一段时间入手了一台树莓派,就想着把以前云服务器的网站移到小小的树莓派上,从而保证不会因为要换服务器而重新配置网站。因此,我参考pidoc的网站架构重新进行了规划。其中重要一环便是实现内网穿透,通过互联网能访问到家里的树莓派。

frp介绍

Deepsek

内网穿透(NAT穿透)是一种技术手段,允许外部网络通过公网访问局域网(内网)中的设备或服务。由于内网设备通常位于路由器或防火墙后,没有独立的公网IP地址,外部用户无法直接访问。内网穿透通过建立中间通道或代理,绕过网络限制,实现内网服务的远程访问。

frp(Fast Reverse Proxy)是一款开源、简洁易用、高性能的内网穿透和反向代理工具,支持 tcp, udp, http, https等协议。它原理分为以下几步[1]

  1. 服务端运行,监听一个主端口,等待客户端的连接;
  2. 客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;
  3. 服务端fork新的进程监听客户端指定的端口;
  4. 外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;
  5. 客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。

参考资料

网络结构

网络的大体结构如下所示,frp则是连接服务端(服务器)和客户端(树莓派)的桥梁

服务端

服务端选择在已经备案的阿里云服务器中,它是固定的ip地址,备案后可以通过域名进行绑定。因此,通过域名则可以直接访问阿里云服务器。

  1. 首先在frp下载网页[2]中下载最新对应版本,比如,我下载的版本是frp_0.61.0_linux_amd64.tar.gz,这位是因为我的服务器是x86_64架构(绝大部分服务器都如此)。下载上传至服务器中,也可以直接在服务器中通过wget下载。
  2. 解压后进入frp_0.61.0_linux_amd64目录,可以看到里面的文件主要有四个文件,其中frpsfrps.toml是服务器,frpcfrpc.toml是客户端。因此,我们需要对服务端的配置文件frps.toml进行编辑。
bash
root@iZbp191ssbr9r5wdkgbmgpZ:~/softwares/frp# tar -xvf frp_0.61.0_linux_amd64.tar.gz frp_0.61.0_linux_amd64/ frp_0.61.0_linux_amd64/LICENSE frp_0.61.0_linux_amd64/frps.toml frp_0.61.0_linux_amd64/frpc frp_0.61.0_linux_amd64/frps frp_0.61.0_linux_amd64/frpc.toml root@iZbp191ssbr9r5wdkgbmgpZ:~/softwares/frp# cd frp_0.61.0_linux_amd64/ root@iZbp191ssbr9r5wdkgbmgpZ:~/softwares/frp/frp_0.61.0_linux_amd64# ls frpc frpc.toml frps frps.toml LICENSE root@iZbp191ssbr9r5wdkgbmgpZ:~/softwares/frp/frp_0.61.0_linux_amd64# vim frps.toml

3、我根据自己的需求,对frps.toml做如下的编辑。

toml
# Port bindPort = 8000 # auth.method specifies what authentication method to use authenticate frpc with frps. auth.method = "token" auth.token = "123456" #set your toekn # If you want to support virtual host, you must set the http port for listening (optional) # Note: http port and https port can be same with bindPort vhostHTTPPort = 80 # Configure the web server to enable the dashboard for frps. webServer.addr = "x.x.x.x" #set your server's private IP webServer.port = 8500 webServer.user = "admin" webServer.password = "admin123" # console or real logFile path like ./frps.log log.to = "/usr/local/frp/frps.log" log.level = "info" log.maxDays = 3

其中有几个需要注意的参数,详细的参数可以参考[3]

  • bindPort对应服务端运行的端口,也就是客户端需要和服务端之间的绑定的端口;
  • auth.token一般设定auth.methodtoken时需要设置验证密码;
  • webServer.addr这是如果需要在浏览器中可以看到仪表盘,则需要设置该地址。需要设置为内网地址。webServer.port对应的就是仪表盘的端口,webServer.userwebServer.password对应的就是仪表盘登录的用户名和密码;
  • log.to是日志文件的路径,log.maxDays是保存的最近多少天的日志,log.level是日志的级别,可选值为 trace, debug, info, warn,和error
  1. 设置和启动frps服务。在/lib/systemd/system构建一个frps.service服务文件,内容如下
ini
[Unit] Description=frps service After=network.target [Service] Type=simple ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target

在此之前我已经frpsfrps.toml拷贝到了/usr/local/frp路径下。然后通过systemctl enable frps.service设置开机启动,以及systemctl start frps.service启动服务。

systemctl

systemctl 是一个用于控制 systemd 系统和服务管理器的工具。它可以用于启动、停止、重启、重载服务,以及检查服务状态等操作。记录一下它常用的命令

bash
systemctl start 服务名.service systemctl stop 服务名.service systemctl restart 服务名.service systemctl status 服务名.service systemctl enable 服务名.service systemctl disable 服务名.service systemctl reload 服务名.service systemctl daemon-reload #重载配置
  1. 最后就是要在服务器的防火墙中进行放行相关端口,我还需要在阿里云的后台中放行所有涉及的端口。

客户端

客户端选择在家里的树莓派上,是不能通过80443端口构建网络服务,因此采取反向代理的方式映射到备案的公网上去。同样的分为以下几个步骤

  1. 对于客户端同样的需要下载对应的服务器架构的版本。树莓派则需要下载arm版本,因为我的树莓派是64位的,所以下载frp_0.61.0_linux_arm64.tar.gz
  2. 同样解压后可以看见和前面相同的四个文件,我们只需要客户端的配置文件frpc.toml进行编辑即可
  3. 根据自己需求编辑
toml
serverAddr = "x.x.x.x" # your server ip serverPort = 8000 # your server port user = "root" # console or real logFile path like ./frpc.log log.to = "/usr/local/frp/frpc.log" log.level = "info" log.maxDays = 3 # auth token auth.method = "token" auth.token = "123456" #set your server toekn # Set admin address for control frpc's action by http api such as reload webServer.addr = "x.x.x.x" #set your client's private IP webServer.port = 8500 webServer.user = "admin" webServer.password = "admin123" webServer.pprofEnable = false #http [[proxies]] name = "web-http" type = "http" localPort = 5000 #your local port of running web in your client customDomains=["sbyu.site"]

这里值得注意是serverAddr需要设置为你服务端的公网ipserverPort设置成和前面服务端匹配连接的8000端口,auth.token也需要和服务器设置的一样。当然客户端也可以通过webServer.*相关参数设置仪表盘。最后则是反向代理设置,localPort则对应的是本地运行它的端口,customDomains则是在服务端反向代理的域名。

http

可以在同一个客户端中同时设置多个方向代理,只需要在文件中继续加入最后一段的[[proxies]],其中namelocalPortcustomDomains和前面的不相同。

toml
#http [[proxies]] name = "web2-http" # can not be web1-http type = "http" localPort = 6000 #your local port of running web in your client customDomains=["blog.sbyu.site"]
  1. 设置和启动frps服务。在/lib/systemd/system构建一个frpc.server服务,并且进行启动
ini
Description=frpc service After=network.target syslog.target Wants=network.target [Service] Type=simple Restart=on-failure RestartSec=5s ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.toml [Install] WantedBy=multi-user.target
  1. 最后在防火墙放行相关端口。

结语

设置完上述之后,可以在服务端配合宝塔面板使用设置为https的连接。虽然frp是可以直接设置成https,但个人觉的这样使用更加灵活。

本文作者:sbyu

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!