内网穿透frp及树莓派的应用

Author Avatar
呃哦 11月 13, 2017

前言

在上一篇文章树莓派之下载机和NAS服务器中,我们介绍了怎么用树莓派搭建下载机,并且在局域网内可以在任何一台设备上添加下载服务,但是当我们不在家的时候,就没办法了,这样有点麻烦,比如在公司的时候,想远程下载一部电影,回家的时候可以看.对此,解决方法有两个:

  • 方法一:跟运营商要求一个公网IP,而后在路由器上进行端口映射到树莓派上,这样我们就可以通过公网IP访问我们的树莓派了.缺点是,一般运营商不给…很麻烦,或者当环境是内网并且路由器不是自己的,例如公司的,那就做不了主了
  • 方法二:进行内网穿透,将自己的一些提供外界访问的端口通过中转服务器穿透出去,这就是今天的主题了.

内网穿透介绍

内网穿透说白了就是将自己的内网机器的端口,通过端口映射和外网机器连在一起,即访问外网的X端口即相当于访问内网的Y端口.

内网穿透工具即第三方服务提供商介绍:

  • 花生壳
    花生壳是国内的动态域名解析软件,即支持内网端口动态解析到某一个域名上,这应该是知名度最高的一个了吧,不过是收费的

  • ngrok
    ngrok是免费的开源软件,支持多端口映射,算是有点年代了,官网提供免费的端口映射服务,不过免费账号或者游客账号只支持一个端口映射,有多端口映射需求的话,要么付费,要么自己搭建ngrok服务器,毕竟这是一个开源项目,有提供源码供编译运行.

  • frp
    frp相对于ngrok算是一个新项目了,同样支持多端口映射,二级域名等功能,不过目前不知道有什么第三方服务商.博主是通过在自己服务器搭建运行的,下面就是讲解怎么在服务器搭建frp并且端口映射到树莓派

搭建与运行

frp提供发行版和源码编译步骤,编译就算了吧,有发行版直接拿来用就好了.
frp发行版地址,下载对应操作系统和CPU架构的就可以了,像我服务是下载amd64的,树莓派是arm的.

服务器端安装运行

下载解压frp后,有服务器端和客户端各有三个文件,服务器是frps开头的文件,客户端是frpc,参考server和client两个单词还是比较形象的 0.0

frps开头的文件,frps是二进制执行程序,frps.ini 和 frps_full.ini 同样是配置文件,不过frps.ini是基本的配置文件,frps_full.ini是完整的配置文件,包含各项配置参数.简单配置如下:

  [common]
  bind_port = 7000 # 服务器端口
  privilege_token = ThisIsAToken # token秘钥 
  privilege_allow_ports = 7000-8000 # 白名单端口,只允许服务器的这部分端口被映射出去

  log_file = ./frps.log
  log_level = info

  dashboard_port = 7001 # 控制面板端口
  dashboard_user = account # 控制面板登录账号
  dashboard_pwd = password

这里需要解释一下,frps运行后,如果没有限制白名单端口的话,客户端是可以指定任意端口连接映射的,这样会造成端口滥用不好管理,并且如果没有token验证,任何一台设备只要知道了你服务器IP都可以将你的服务器作为免费的端口映射中转服务器

而后启动运行即可,这里就不作为服务通过systemctl启动了,用另一个神器 tmux ,终端复用神器,提供会话功能,即可实现关闭ssh连接后程序依然执行,比起自带的nohup强大的是不仅后台执行,而且可以随时切回前台.

  sudo apt install tmux # 安装tmux
  tmux # 直接启动一个会话,默认会话名是 0
  ./frps -c frps.ini # 指定配置文件运行frps
  # 这时候使用快捷键 Ctrl+b d 即可将会话后台运行(detach).注:按住Ctrl和b键,松手,按d键
  tmux attach -t 0 # 回到刚才的会话(attach)的命令

客户端安装运行

树莓派上下载解压arm版本,同样是一个客户端文件和服务器文件,这里同样我们自定义自己的配置文件

  # vim frpc.ini
  [common]
  server_addr = x.x.x.x # 这里为你的服务器IP
  server_port = 7000
  privilege_token = ThisIsAToken # 服务器和客户端的 privilege_token需要一样才可以连接得上

  [ssh]
  type = tcp
  local_ip = 127.0.0.1
  local_port = 22
  remote_port = 7002

  [http]
  type = tcp
  local_ip = 127.0.0.1
  local_port = 80
  remote_port = 7003

  [rpc]
  local_ip = 127.0.0.1
  local_port = 6800
  remote_port = 7004

而后通过 tmux 运行 frpc -c frpc.ini 命令就可以了

Dashboard

当frps服务器端程序运行后,我们上面已经配置了 Dashboard 的端口和账号了,即可通过浏览器输入 x.x.x.x:dashboard_port 查看frp状态,查看客户端是否连接上来了,以及流量统计

树莓派aria2的应用

通过上面的配置,我们将树莓派的80端口和6800端口映射出去了
有人可能会问,映射80端口不就好了,事实上,为了远程下载,80端口反而是非必须的,因为在上一篇文章我们介绍过了,aria2 远程下载的实现是通过rpc远程调用机制实现的,因此, webui-aria2 项目只是一个通过js实现 aria2 远程调用的一个应用,假设我们自己的电脑也有 webui-aria2 的话,只需浏览器打开,在 webui-aria2 的设置-连接设置添加 aria2 的rpc端口即可.如图所示:

这是我在本地 127.0.0.1 打开后设置rpc,即可连接树莓派的 aria2

扯远了,假设现在是在手机端,没有安装连接 aria2 rpc的软件,这时候就依旧用树莓派的就可以了,打开树莓派的http端口,因为做了端口映射,所以在浏览器输入 x.x.x.x:7003 就是了,webui-aria2 默认的rpc端口就是当前地址下的6800端口,但因为我们是做了端口映射处理,所以这里在 设置-连接设置处把rpc端口改为 7004 就可以了,如上图所示.

总结

至此,我们的树莓派就可以在何地何处都能远程添加下载任务了,并且我们映射了ssh的22端口出去,也可以远程通过ssh控制树莓派,perfect!