半步多 玄玉V笔记

内网穿透利器ngrok和frp

2015-10-20
玄玉

最常见的使用场景就是微信开发:微信服务器需要主动调用或回调开发者服务器

如果把代码直接部署到公网服务器,开发阶段也不便于 debug,此时 ngrok 就派上用场了

当本地运行一个服务时,它能把本地的一个端口反向代理到公网,这样全世界都可以访问

Ngrok

先到官方注册一个账号:https://dashboard.ngrok.com/signup,它会给你一个 Authtoken

再把这个工具下载下来:https://ngrok.com/download

然后执行下面这个命令,这样就配置好了

./ngrok config add-authtoken YourAuthtoken

接下来启动,这样就可以在控制台看到分配的公网域名了(每次执行后,公网域名都会变化)

./ngrok http 2000

Pagekite

它也能实现和 ngrok 一样的效果(同样的,二者的速度都很慢,均不推荐)

其官网为:http://pagekite.net,按照下载页面的提示,很容易就弄好了,下面是效果图

SunnyNgrok

有良心网友免费搭建了一个 ngrok 服务器:http://www.ngrok.cc

下面是使用效果图(也可以自己搭一个 ngrok 服务,网上有教程

2016-11-04 19:08 更新:今天同事推荐了另一个免费的:http://ngrok.2bdata.com,也挺好用

小米球Ngrok

2024-06-19 21:22 更新:ngrok.2bdata不能用了,ngrok.cc需要2.00元实名认证 + 最少10.00元/月的费用

最近又发现一个热心猿友提供的:https://www.xiaomiqiu.cn/,只需要0.5元的实名认证费,也很良心!

而且,它代理出去的公网地址,也是固定的 URL,并且也支持 HTTP / HTTPS / TCP,值得推荐!!

FRP

如果有一台具备公网 IP 的服务器,那么也可以搭一个 FRP(Fast Reverse Proxy) 服务,实现内网穿透

下载地址:https://github.com/fatedier/frp/releases,它分服务端和客户端

补充:v0.52.0 开始,不再推荐使用 INI 配置文件,改为 YAML / TOML / JSON 格式,详细介绍如下:

https://www.cnblogs.com/huang-savesblog/articles/17787700.html

https://github.com/fatedier/frp/blob/master/conf/frps_full_example.toml

另外:网上也有免费的,但没试过效果:https://freefrp.net/docs

服务端配置

将下载的 frp_0.65.0_linux_amd64.tar.gz 解压后,删掉 frpc 和 frpc.toml(这俩是 客户端 用的)

然后也删掉 frps.toml 和 LICENSE(最后只剩下 frps 一个文件)

这里使用 YAML 文件,所以创建一个 frps.yaml

bindAddr: 0.0.0.0
bindPort: 8801
auth:
  method: token
  token: xuanyuv_token

webServer:
  addr: 0.0.0.0
  port: 8802
  user: xuanyuv
  password: xuanyuv_dashboard

log:
  # 启动时,若本地不存在logs文件夹,那么frps会自动创建
  to: ./logs/frps.log
  level: info
  maxDays: 300

subDomainHost: xuanyuv.com
vhostHTTPPort: 8800
vhostHTTPTimeout: 600

再编写一个启动脚本:startup.sh

#!/bin/bash
cd /app/software/frp_0.65.0_linux_amd64/
nohup ./frps -c ./frps.yaml > /dev/null 2>&1 &

客户端配置

将下载的 frp_0.65.0_windows_amd64.zip 解压后,删掉 frps 和 frps.toml(这俩是 服务端 用的)

然后也删掉 frpc.toml 和 LICENSE(最后只剩下 frpc.exe 一个文件)

这里也用 YAML 文件,所以创建一个 frpc.yaml(注意:这里是 frpC.yaml,不是 frpS.yaml)

serverAddr: 服务端的公网IP
serverPort: 8801
auth:
  method: token
  token: xuanyuv_token

log:
  # 启动时,若本地不存在logs文件夹,那么frpc.exe会自动创建
  to: ./logs/frpc.log
  level: info
  maxDays: 300

transport:
  tls:
    enable: false

proxies:
  - name: qss-xuanyuv
    type: http
    subdomain: qss
    localIP: 127.0.0.1
    localPort: 1100
  - name: mpp-xuanyuv
    type: http
    subdomain: mpp
    localIP: 127.0.0.1
    localPort: 2100

再编写一个启动脚本:startup.bat

@echo off
title FRP内网穿透工具【玄玉制作】
color 02

echo;
echo FRP Client Startup....

echo;
echo http://qss.xuanyuv.com:8800/

call frpc.exe -c frpc.yaml

也可安装成 Win10 服务:https://www.xuanyuv.com/blog/20130908/centos-develop.html#安装win10服务

唯一区别是下面的配置

<service>
    <id>frp</id>
    <name>frp</name>
    <description>本地的FRP客户端服务</description>
    <executable>D:\Develop\frp_0.65.0_client\frpc.exe</executable>
    <arguments>-c frpc.yaml</arguments>
    <logpath>D:\Develop\frp_0.65.0_client\logs\</logpath>
    <logmode>roll</logmode>
</service>

服务端 和 客户端 均启动后,通过 http://服务端的公网IP:8802/ 就可以登录到 FRP 后台,查看代理情况

然后访问:http://qss.xuanyuv.com:8800/,就能看到 http://127.0.0.1:1100/ 对应的服务了

下面补充几个网络相关的注意事项:

  • 代理本地 HTTP 服务时,还要将 xuanyuv.com 解析到 服务端 的公网IP,且域名已备案
  • 服务端 的 bindPort 端口,应开放,且,仅开放给 frpc.exe 所在的 客户端
  • 服务端 的 vhostHTTPPort 端口,开放给需要访问本地服务的互联网用户
  • 服务端 的 webServer.port 端口,开放给管理员即可

远程Windows

下面介绍一下,如何实现连接远程 Windows(用起来很丝滑,一点不输向日葵、ToDesk、TeamViewer)

服务端不用改,还是用上面的配置,客户端的话,出于安全考虑,建议采用 sctp 的方式

  • tcp 的方式,不需要 secretKey 就能连,不太安全
  • xtcp 的方式,不同的网络下,不一定每次都能点对点穿透成功

由于采用 stcp 的方式,那么,就客户端而言,还要细分为 被控端(远程 Windows)和 主控端(本地 Windows)

被控端

serverAddr: 服务端的公网IP
serverPort: 8801
auth:
  method: token
  token: xuanyuv_token

log:
  to: ./logs/frpc.log
  level: info
  maxDays: 300

transport:
  tls:
    enable: false

proxies:
  - name: rdp-remote-xuanyuv   # 被控端名称(可随便定义)
    type: stcp
    secretKey: nothingNoMatter # 被控端密钥(可随便定义)
    localIP: 127.0.0.1
    localPort: 3389
    transport:
      useCompression: true         # 流量压缩传输,减少带宽占用
      # bandwidthLimit: 2MB        # 限制带宽使用,避免占满3M
      # bandwidthLimitMode: client # 限制带宽使用,由客户端进行限制

主控端

serverAddr: 服务端的公网IP
serverPort: 8801
auth:
  method: token
  token: xuanyuv_token

log:
  to: ./logs/frpc.log
  level: info
  maxDays: 300

transport:
  tls:
    enable: false

visitors:
  - name: rdp-local-xuanyuv
    type: stcp
    serverName: rdp-remote-xuanyuv # 需要访问的被控端名称
    secretKey: nothingNoMatter     # 需要访问的被控端密钥
    bindAddr: 127.0.0.1
    bindPort: 8389

启动 被控端 和 主控端,远程桌面连接:127.0.0.1:8389 即可(被控端需要在控制面板启用远程桌面)

如果 服务端 带宽是 3M,那么下载速度最多为 3Mbps = 3 * 128KB/s = 384KB/s实际也就 300KB/s 左右

实测通过 3M 的服务端连接远程桌面,界面会卡的一动不动,此时像下面这样设置,便可纵享丝滑了:

  • 远程桌面连接 — 显示 — 颜色 — 增强色(16 位) 默认为:最高质量(32 位),带宽占用翻倍
  • 远程桌面连接 — 本地资源 — 远程音频 — 设置 — 远程音频播放 — 不要播放
  • 远程桌面连接 — 本地资源 — 本地设备和资源 — 打印机和剪贴板都不勾选
  • 远程桌面连接 — 体验 — 性能 — 低速宽带(256 kbps - 2Mbps)
  • 远程桌面连接 — 体验 — 性能 — 持久位图缓存不勾选

上一篇 Git命令小结

下一篇 儿时的哈尔滨

Content