什么是内网穿透

  • 内网穿透,简单地说就是内网的数据让外网可以获取,可以映射到公共网络上,这样就可以在公共网络上访问内网的数据。
  • 内网是不能被外网直接访问的,只能通过一些中转技术,如 DingTalk Design CLI、花生壳、Natap 等工具,让内网“假装”成外网,就是内网穿透。
  • 外网主机的 IP 地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该 IP 的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。
  • 内网穿透扩展了我们之前的工作场景和范围,让使用者可以不局限在内网环境中就可以做到局域网才能做的事情,大大提高了我们的效率。

使用frp来进行内网穿透

简单地说,frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。

实现

  • 下载地址

  • 服务器端

    • 下载解压

      1
      wget https://github.com/fatedier/frp/releases/download/v0.41.0/frp_0.41.0_linux_amd64.tar.gz

      解压:

      1
      tar -zxvf frp_0.41.0_linux_amd64.tar.gz

      重命名:

      1
      2
      3
      cp -r frp_0.41.0_linux_amd64 frp
      rm -r frp_0.41.0_linux_amd64.tar.gz
      rm -r frp_0.41.0_linux_amd64
    • 进入

      1
      2
      cd frp
      ls -a

      我们只需要关注如下几个文件

      • frps
      • frps.ini
      • frpc
      • frpc.ini

        前两个文件(s结尾代表server)分别是服务端程序和服务端配置文件,后两个文件(c结尾代表client)分别是客户端程序和客户端配置文件。
        因为我们正在配置服务端,可以删除客户端的两个文件

        1
        2
        3
        rm frpc frpc.ini
        y
        y
    然后修改`frps.ini`文件

    
1
vim frps.ini
这个文件应有如下格式
1
2
3
4
5
6
7
8
[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
> 如果没有必要,端口均可使用默认值,token、user和password项请自行设置。 - “bind_port”表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。 - “dashboard_port”是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。 - “token”是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。 - “dashboard_user”和“dashboard_pwd”表示打开仪表板页面登录的用户名和密码,自行设置即可。 - “vhost_http_port”和“vhost_https_port”用于反向代理HTTP主机时使用,本文不涉及HTTP协议,因而照抄或者删除这两条均可。 需要为它设置可执行权限。您可以使用`chmod`命令来设置文件的权限。例如,使用以下命令为`frps`文件添加可执行权限,运行:
1
2
chmod +x frps
./frps -c frps.ini
然后阿里云后台安全组放行相关端口,**如果有宝塔面板,也要放行。** - 后台运行
1
nohup ./frps -c frps.ini &
  • 客户端

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [common]
    server_addr = 47.94.134.162
    server_port = 7000
    token = 12345678

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

    [rdp]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 3389
    remote_port = 7001
    [smb]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 445
    remote_port = 7002
上面frpc.ini的rdp、smb字段都是自己定义的规则,自定义端口对应时格式如下。



- “[xxx]”表示一个规则名称,自己定义,便于查询即可。
- “type”表示转发的协议类型,有TCP和UDP等选项可以选择,如有需要请自行查询frp手册。
- “local_port”是本地应用的端口号,按照实际应用工作在本机的端口号填写即可。
- “remote_port”是该条规则在服务端开放的端口号,自己填写并记录即可。

> RDP,即Remote Desktop 远程桌面,Windows的RDP默认端口是3389,协议为TCP,建议使用frp远程连接前,在局域网中测试好,能够成功连接后再使用frp穿透连接。
>
> SMB,即Windows文件共享所使用的协议,默认端口号445,协议TCP,本条规则可实现远程文件访问。

- 启动

    
1
frpc -c frpc.ini

ssh

安装openssh msi

运行

1
netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22