通过frp穿透内网
很早就想写这篇文章的,由于懒癌一直没动,直到被https坑到凌晨,我立马就写了这篇文章。由于在树莓派上搭建了博客,想通过外网也可以访问,于是开始鼓捣起来。通过搜集发现一般有花生壳、ngrok和frp这几种。由于花生壳免费的只有1G流量,随便搞搞就没了,ngrok也开始有收费的趋势了。而frp是免费的开源软件,虽然开发的时间还不算长,但是功能越来越多,而且目前的功能也够用了。我才不是因为穷好吗?读书人的事,能算穷吗?
参考链接:
- https://mlapp.cn/348.html
- https://diannaobos.com/post/399.html
- https://www.cloudxns.net/Support/detail/id/918.html 域名带不带www区别
- https://stackoverflow.com/questions/1100343/apache-redirect-from-non-www-to-www apache重定向到www
frp是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。
具体介绍什么的可以去github上看,文档写的挺简洁的,但是要点都有了。地址:https://github.com/fatedier/frp
要用frp穿透首先要一个有公网的IP的服务器,在公网的服务器上部署并运行frp的服务端(frps),在需要穿透的客户端上部署并运行frp的客户端(frpc)。公网IP和服务器就不介绍了,VPS这么繁荣的时代,对吧。
开始了,release页面下载frp
要注意版本的选择,我的公网服务器是64位的CPU,因此选择frp_0.13.0_linux_amd64.tar.gz
,树莓派的CPU是ARM架构的,所以再下一个frp_0.13.0_linux_arm.tar.gz
。可以通过[root@centos-rpi3 conf]# cat /proc/cpuinfo
命令查看CPU的信息。
下好后分别把压缩包放到对应的机器上。
目录结构如下
frp_0.13.0_linux_arm
├─ frpc # frp客户端程序
├─ frpc.ini # frp客户端配置文件
├─ frpc_full.ini # frp客户端完整配置文件
├─ frps # frp服务端程序
├─ frps.ini # frp服务端配置文件
├─ frps_full.ini # frp服务端完整配置文件
└─ LICENSE # 版权文件
可以看到还是很简洁的,由于服务端和客户端的版本不同,所以只保留要使用的文件,其他删掉即可。
我们先来配置服务端的:
如果打算测试是否可行的可以直接改配置文件然后启动,这里我就不测试了,直接搞起来。由于要长期使用,将其配置为开机启动项。首先是可执行文件cp frps /usr/bin/
,这个路径仅供参考~~!然后是frps的配置文件mkdir /etc/frps
,cp frps.ini /etc/frps/
,最后新建一个frps的开机脚本:
[root@luzhengjunvps frps]# vi /etc/systemd/system/frps.service
添加如下内容
[Unit]
Description=frps daemon
[Service]
Type=simple
ExecStart=/usr/bin/frps -c /etc/frps/frps.ini
[Install]
WantedBy=multi-user.target
注意配置中ExecStart
后是你自己配置的文件的位置,不要照搬~~!
现在看下frps的配置文件中有什么要配置的,以下是我配置的:
具体配置可参考作者给出的文档:https://github.com/fatedier/frp/blob/master/README_zh.md
[common]
bind_addr = 0.0.0.0
bind_port = 7000 # 通过此端口和客户端通信
vhost_http_port = 80 # 转发http请求
vhost_https_port = 443 # 转发https请求
dashboard_port = 7500 # 仪表盘访问的端口
dashboard_user = ******
dashboard_pwd = ******
log_file = ./frps.log
log_level = error
[ssh]
auth_token = ****** # 要和客户端配置的值一致
bind_addr = 0.0.0.0
listen_port = ****** # 通过此端口连接SSH
配置中转发了80(https)和443(https)端口的请求,同时配置了仪表盘(dashboard),如果不需要的可以删除相关配置。同时还配置了ssh的转发,这样就可以在公网通过ssh连接内网的树莓派了,很是方便,auth_token要和客户端的配置一致,可以用在线的密码生成器随机生成一个比较复杂的。
然后启动脚本:
[root@luzhengjunvps frps]# systemctl enable frps
[root@luzhengjunvps frps]# systemctl start frps
客户端的配置大同小异。
首先拷贝可执行文件frpc到目录下/usr/bin/frp/
下(没有可以创建或放到其他目录都行啦),再拷贝配置文件frpc.ini
到/etc/frp/
下,再就是frpc的开机脚本:
[root@centos-rpi3 frp]# vi /etc/systemd/system/frpc.service
添加如下内容
[Unit]
Description=frpc daemon
After=syslog.target network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/bin/frp/frpc -c /etc/frp/frpc.ini
Restart= always
RestartSec=15min
ExecStop=/usr/bin/killall frpc
[Install]
WantedBy=multi-user.target
同样ExecStart
的值填自己的实际文件路径,不要照搬。由于开机启动时网络可能未准备好或其他依赖的关系原因,因此frpc的开机第一次自启可能会失败,因此RestartSec
可以配置的时间短一点(如1min),在失败后较短的时间内重启,这里我就这样啦,因为我基本都是手动重启(捂脸)。作者也提供了一个参数配置,具体参考:frp issues
最后就是frpc的配置文件了:
[common]
server_addr = 198.13.40.43 # 公网服务器的IP
server_port = 7000 # 和frps配置的通信端口一致
local_ip = 127.0.0.1
auth_token = ****** # 和frps配置SSH的auth_token一致
log_file = ./frpc.log
log_level = error
[ssh]
type = tcp
local_port = 22
use_encryption = true
remote_port = ****** # 通过此端口连接SSH,和frps上配置的listen_port一致
[web-443]
type = https
local_port = 443
custom_domains = www.racecoder.com # 带上www可以正常访问
[web-443-nonwww]
type = https
local_port = 443
custom_domains = racecoder.com # 不带www也可以访问,需要配置Apache,见下文
[web-80]
type = http
local_port = 80
custom_domains = www.racecoder.com # 带上www可以正常访问
[web-80-nonwww]
type = http
local_port = 80
custom_domains = racecoder.com # 不带www也可以访问,需要配置Apache,见下文
域名不是必须的,可以直接配置IP的。据作者的文档中描述可以自定义域名访问内网web服务,我有域名我不管你们那些没有的啦 哈哈哈,看我不是穷人吧~~!
关于带不带www网上有很多争议,这里我选择带~~!不过为了体验,也可以不输入www但会自动跳转到带www的url,Apache的配置如下:
这时访问racecoder.com会显示302重定向到https://www.racecoder.com,表示临时性的移动到另一个地方,不过搜索引擎对302不太友好,如果需要友好一点则需要301重定向(不懂301和302区别的自行百度http 状态码
)。配置稍微改改就行了,如下:!
最后启动啦啦啦
[root@centos-rpi3 frp]# systemctl enable frpc
[root@centos-rpi3 frp]# systemctl start frpc
其实主要是客户端的配置比较麻烦,有其他需求的可以自行去作者的github上查看或者提问。
如果配了仪表盘可以在仪表盘上看相应的流量信息。
发现不配图写起来真快~~!