内网穿透,就是把内网机器端口映射到公网,便于远程访问。

应用场景:

  • 直接在公网演示本地 demo;
  • 出门在外远程自己的电脑;
  • 下班路上控制路由远程下载;
  • ……

内网穿透的方案主要两种:

  1. 花生壳等 第三方服务:免费凑合用,花钱买速度;
  2. ngrok、frp 等开源自建服务:简单部署,一劳永逸。

对速度要求不高的情况下,花生壳是不错的选择。ngrok 也有免费的限流服务。 测试之后,我选了自己搭建 frp 。 具体原因:

  • 速度快,远程桌面清晰流畅;
  • 比 ngrok 部署简单、无依赖;
  • 客户端、服务端 都很小,不怎么占资源。

我们开始部署 frp 吧!

  1. 获取对应版本的 frp in github

    cd /usr/local/
    # 例:服务器系统 Ubuntu 64位 
    wget https://github.com/fatedier/frp/releases/download/v0.21.0/frp_0.21.0_linux_amd64.tar.gz
    #妥善解压、配置文件路径
    tar -xvf frp_0.21.0_linux_amd64.tar.gz
    mv frp_0.21.0_linux_amd64 frp
    
  2. 配置服务端

    #frps     服务端程序
    #frps.ini 服务端配置文件
    #frpc     客户端程序(此处 frpc 仅用于amd64 linux 系统,下文 客户端 需单独下载。)
    #frpc.ini 客户端配置文件
    

    vim frps.ini

    [common]
    #frp服务器监听地址,如果是IPV6地址必须用中括号包围
    bind_addr = 0.0.0.0
    #frp服务器监听端口
    bind_port = 7000
    
    #kcp的udp监听端口,如果不设那就不启用
    #kcp_bind_port = 7000
    #指定使用的协议,默认tcp,可选kcp
    #protocol = kcp
    
    #如果要使用vitual host,就必须设置
    vhost_http_port = 8080
    #vhost_https_port = 443
    
    #Web后台监听端口
    dashboard_port = 7500
    
    #Web后台的用户名和密码
    dashboard_user = abc
    dashboard_pwd = 123
    
    #Web后台的静态资源目录,调试用的,一般不设
    #assets_dir = ./static
    
    #日志输出,可以设置为具体的日志文件或者console
    log_file = /var/log/frps.log
    
    #日志记录等级,有trace, debug, info, warn, error
    log_level = info
    #日志保留时间
    log_max_days = 3
    
    #启用特权模式,从v0.10.0版本开始默认启用特权模式,且目前只能使用特权模式
    #privilege_mode = true
    
    #特权模式Token,请尽量长点且复杂
    privilege_token = 123
    
    #特权模式允许分配的端口范围
    privilege_allow_ports = 2000-3000,3001,3003,4000-50000
    
    #心跳超时,不用改
    #heartbeat_timeout = 90
    
    #每个代理可以设置的连接池上限
    #max_pool_count = 5
    
    #认证超时时间,一般不用改
    #authentication_timeout = 900
    
    #如果配置了这个,当你的模式为http或https时,就能设置子域名subdomain
    #subdomain_host = frps.com
    
    #是否启用tcp多路复用,默认就是true,不用管
    #tcp_mux = true
    

    整理好 frps.ini 配置文件,即可先启动服务端:

    screen -S frp #或者 nohup 挂后台执行 nohup ./frps -c frps.ini &
    ./frps -c frps.ini
    
  3. 配置客户端

    • Win PC
      # 例:win10 64 位
      # https://github.com/fatedier/frp/releases/download/v0.21.0/frp_0.21.0_windows_amd64.zip
      下载==>解压==>配置目录
      

      编辑 frpc.ini

      [common]
      #frp服务器地址
      server_addr = 服务器地址
      #frp服务器端口
      server_port = 7000
      #特权模式Token
      privilege_token = 123
      #转发desktop 远程桌面端口
      [desktop]
      type = tcp
      #可以指定为其它IP,默认是本地
      #local_ip = 127.0.0.1
      local_port = 3389
      remote_port = 1234
      #启用加密
      #use_encryption = true
      #启用压缩
      #use_compression = true
      

      启动win客户端:

      frpc.exe -c frpc.ini
      

      然后,便可通过win自带远程桌面,控制远在异地或者床下的PC了。

    • 路由器 openwrt
      cd /mnt/sda1/ # !! 切换到外置存储,地方够大
      mkdir frp
      cd frp
      wget https://github.com/fatedier/frp/releases/download/v0.21.0/frp_0.21.0_linux_mips.tar.gz
      

      路由器版本依照 硬件和固件版本确定,笔者 路由 型号 DW33D 、固件 LEDE Reboot 17.01.4 r3560-79f57e422d / LuCI lede-17.01 branch (git-17.290.79498-d3f0685)

      vi frp/frpc.ini

      [common]
      #frp服务器地址
      server_addr = 服务器地址
      #frp服务器端口
      server_port = 7000
      #特权模式Token
      privilege_token = 123
      #转发desktop
      [ssh]
      type = tcp
      #可以指定为其它IP,默认是本地
      #local_ip = 127.0.0.1
      local_port = xxxx
      remote_port = xxxx
      #启用加密
      #use_encryption = true
      #启用压缩
      #use_compression = true
      

      openwrt 开机自启:

      cd /etc/init.d/
      vi frp
      #---start
      #!/bin/sh /etc/rc.common
      START=99
      start(){
              sleep 10
              /mnt/sda1/frp/frpc -c /mnt/sda1/frp/frpc-domy.ini
      }
      restart(){
              /mnt/sda1/frp/frpc -c /mnt/sda1/frp/frpc-domy.ini
      }
      #---end
      chmod 755 frp # 赋权
      ./frp enable    # 启用
      ./frp start     # 尝试手动启动
      

至此,服务端与客户端均已配置完毕,并开始连接。

login to server success,……
[ssh] start proxy success

以上便是 frp 内网穿透的最常用部署过程。此外,还有很多种方案可探索:

  • 结合 aria2 远程下载;
  • 远程打印
  • 自建云盘

安全建议:

在公网上暴露自己是有风险的,最基本的安全措施要有:

  • 更改默认端口(如,默认ssh的22端口)

  • 强密码

  • 低调

全文完。希望需要的人能参考一二。