前一段时间入手了一台树莓派,就想着把以前云服务器的网站移到小小的树莓派上,从而保证不会因为要换服务器而重新配置网站。因此,我参考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 许可协议。转载请注明出处!