通过frp穿透内网

很早就想写这篇文章的,由于懒癌一直没动,直到被https坑到凌晨,我立马就写了这篇文章。由于在树莓派上搭建了博客,想通过外网也可以访问,于是开始鼓捣起来。通过搜集发现一般有花生壳、ngrok和frp这几种。由于花生壳免费的只有1G流量,随便搞搞就没了,ngrok也开始有收费的趋势了。而frp是免费的开源软件,虽然开发的时间还不算长,但是功能越来越多,而且目前的功能也够用了。我才不是因为穷好吗?读书人的事,能算穷吗?

参考链接:


frp是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。
具体介绍什么的可以去github上看,文档写的挺简洁的,但是要点都有了。地址:https://github.com/fatedier/frp
要用frp穿透首先要一个有公网的IP的服务器,在公网的服务器上部署并运行frp的服务端(frps),在需要穿透的客户端上部署并运行frp的客户端(frpc)。公网IP和服务器就不介绍了,VPS这么繁荣的时代,对吧。
开始了,release页面下载frp
frpversion.png

要注意版本的选择,我的公网服务器是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/frpscp 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的配置如下:
redirecttohttps.jpg

这时访问racecoder.com会显示302重定向到https://www.racecoder.com,表示临时性的移动到另一个地方,不过搜索引擎对302不太友好,如果需要友好一点则需要301重定向(不懂301和302区别的自行百度http 状态码)。配置稍微改改就行了,如下:!
https301redirect.jpg

最后启动啦啦啦

[root@centos-rpi3 frp]# systemctl enable frpc
[root@centos-rpi3 frp]# systemctl start frpc

其实主要是客户端的配置比较麻烦,有其他需求的可以自行去作者的github上查看或者提问。
如果配了仪表盘可以在仪表盘上看相应的流量信息。
发现不配图写起来真快~~!

标签: none

添加新评论

ali-01.gifali-58.gifali-09.gifali-23.gifali-04.gifali-46.gifali-57.gifali-22.gifali-38.gifali-13.gifali-10.gifali-34.gifali-06.gifali-37.gifali-42.gifali-35.gifali-12.gifali-30.gifali-16.gifali-54.gifali-55.gifali-59.gif

加载中……