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

应用场景:

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

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

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

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

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

我们开始部署 frp 吧!

  1. #### 获取对应版本的 frp in github
1
2
3
4
5
6
   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
  1. #### 配置服务端
1
2
3
4
   #frps     服务端程序
   #frps.ini 服务端配置文件
   #frpc     客户端程序(此处 frpc 仅用于amd64 linux 系统,下文 客户端 需单独下载。)
   #frpc.ini 客户端配置文件

vim frps.ini

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
   [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 配置文件,即可先启动服务端:

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

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

    编辑 frpc.ini

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
     [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客户端:

    1
    
     frpc.exe -c frpc.ini

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

    • ##### 路由器 openwrt
    1
    2
    3
    4
    
     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

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
     [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 开机自启:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
     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     # 尝试手动启动

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

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

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

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

安全建议:

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

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

  • 低调

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