前一段时间入手了一台树莓派,就想着把以前云服务器的网站移到小小的树莓派上,从而保证不会因为要换服务器而重新配置网站。因此,我参考pidoc的网站架构重新进行了规划。其中重要一环便是实现内网穿透,通过互联网能访问到家里的树莓派。
Deepsek
内网穿透(NAT穿透)是一种技术手段,允许外部网络通过公网访问局域网(内网)中的设备或服务。由于内网设备通常位于路由器或防火墙后,没有独立的公网IP地址,外部用户无法直接访问。内网穿透通过建立中间通道或代理,绕过网络限制,实现内网服务的远程访问。
frp(Fast Reverse Proxy)是一款开源、简洁易用、高性能的内网穿透和反向代理工具,支持 tcp, udp, http, https等协议。它原理分为以下几步[1]:
参考资料
网络的大体结构如下所示,frp则是连接服务端(服务器)和客户端(树莓派)的桥梁。
服务端选择在已经备案的阿里云服务器中,它是固定的ip地址,备案后可以通过域名进行绑定。因此,通过域名则可以直接访问阿里云服务器。
frp_0.61.0_linux_amd64.tar.gz,这位是因为我的服务器是x86_64架构(绝大部分服务器都如此)。下载上传至服务器中,也可以直接在服务器中通过wget下载。frp_0.61.0_linux_amd64目录,可以看到里面的文件主要有四个文件,其中frps和frps.toml是服务器,frpc和frpc.toml是客户端。因此,我们需要对服务端的配置文件frps.toml进行编辑。bashroot@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.method为token时需要设置验证密码;webServer.addr这是如果需要在浏览器中可以看到仪表盘,则需要设置该地址。需要设置为内网地址。webServer.port对应的就是仪表盘的端口,webServer.user和webServer.password对应的就是仪表盘登录的用户名和密码;log.to是日志文件的路径,log.maxDays是保存的最近多少天的日志,log.level是日志的级别,可选值为 trace, debug, info, warn,和error。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
在此之前我已经frps和frps.toml拷贝到了/usr/local/frp路径下。然后通过systemctl enable frps.service设置开机启动,以及systemctl start frps.service启动服务。
systemctl
systemctl 是一个用于控制 systemd 系统和服务管理器的工具。它可以用于启动、停止、重启、重载服务,以及检查服务状态等操作。记录一下它常用的命令
bashsystemctl start 服务名.service
systemctl stop 服务名.service
systemctl restart 服务名.service
systemctl status 服务名.service
systemctl enable 服务名.service
systemctl disable 服务名.service
systemctl reload 服务名.service
systemctl daemon-reload #重载配置
客户端选择在家里的树莓派上,是不能通过80或443端口构建网络服务,因此采取反向代理的方式映射到备案的公网上去。同样的分为以下几个步骤
arm版本,因为我的树莓派是64位的,所以下载frp_0.61.0_linux_arm64.tar.gz。frpc.toml进行编辑即可tomlserverAddr = "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需要设置为你服务端的公网ip,serverPort设置成和前面服务端匹配连接的8000端口,auth.token也需要和服务器设置的一样。当然客户端也可以通过webServer.*相关参数设置仪表盘。最后则是反向代理设置,localPort则对应的是本地运行它的端口,customDomains则是在服务端反向代理的域名。
http
可以在同一个客户端中同时设置多个方向代理,只需要在文件中继续加入最后一段的[[proxies]],其中name、localPort和customDomains和前面的不相同。
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"]
frps服务。在/lib/systemd/system构建一个frpc.server服务,并且进行启动iniDescription=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
设置完上述之后,可以在服务端配合宝塔面板使用设置为https的连接。虽然frp是可以直接设置成https,但个人觉的这样使用更加灵活。
本文作者:sbyu
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!