内网穿透

简介

  • 内网穿透,即NAT穿透,让外网用户可通过公网ip访问到内网服务。有时想要让其他人通过域名访问或者测试我们在本地搭建的 web 服务,但是由于本地机器没有公网 IP,无法将域名解析到本地的机器,通过内网穿透就可以实现这一功能
  • 常见的内网穿透工具如ngrok(国外)、花生壳(需要支付8元)、NATAPP(和ngrok类似,2-3天会更新二级域名)
    • 仅需下载其客户端即可
  • 自建内网穿透frp
    • 缺点:仍然需要一台公网IP的服务器,如阿里云服务器

ngrok

  • 官网
  • 说明: 免费支持一个HTTPS固定随机域名(可以注册多个账号解决), 其他均为HTTPS动态随机域名
  • 使用
    • 安装ngrok客户端
    • 修改配置文件/Users/xxx/Library/Application Support/ngrok/ngrok.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动全部`ngrok start --all` 或启动某个服务 `ngrok start api`
version: "3"
agent:
authtoken: xxx
endpoints:
# https的固定域名
- name: api
url: xxx.ngrok-free.app
upstream:
url: 8080
# https类型的随机域名
- name: http
upstream:
url: 8080
- 启动ngrok
    - `ngrok http 80` 直接启动随机URL域名映射到本地80端口
    - `ngrok start --all`基于配置文件启动
    - `ngrok --config /Users/xxx/ngrok2.yml start --all` 使用多个账号指定配置文件启动多个服务
  • 配合mac脚本编辑器一次启动多个Tab命令窗口(start.sh)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

osascript -e '
tell application "iTerm"
activate
set myWindow to (create window with default profile)

-- 创建第一个标签页
tell myWindow
tell current session
write text "ngrok start --all"
end tell

-- 创建第二个标签页
create tab with default profile
tell current session
write text "ngrok --config /Users/xxx/ngrok2.yml start --all"
end tell
end tell
end tell
'

花生壳

  • 说明
    • windows安装或下文linux安装花生壳,都是把设备(对应一个SN码)报告给花生壳官方
    • linux安装成功后可在后台-花生壳-设备列表中添加设备,输入SN码即可(需求提前启动客户端),然后给设备绑定登录账户(一个设备只能对应一个登录账户)
    • 由于一个设备只能对应一个登录账户,因此可以创建子账号来进行上述绑定(即达到一个子账号对应一台设备)
      • 绑定后需要重启客户端phddns restart
      • 但是,新创建的子账号如果做HTTP内网穿透,则必须重新支付6元认证费
    • 购买的顶级壳域名可将其子域名共享给某一个子账号,从而达到一个子域名或多个子域名对应一台设备
  • 限制
    • 免费账号仅支持2个域名解析,且只支持HTTP固定端口
    • HTTPS必须购买99/年的证书费
1
2
3
4
5
6
# 安装花生壳(对应后台管理的设备),安装成功后会显示其SN: oray9bb205bbcxx,默认密码为admin
wget https://down.oray.com/hsk/linux/phddns-5.1.0.amd64.rpm
rpm -ivh phddns-5.1.0.amd64.rpm

# 查看命令帮助
phddns -h

frp实现内网穿透

frp介绍

  • 开源项目,支持TCPUDPHTTPHTTPS,支持自定义域名绑定
  • github链接中文文档
  • 实现内网穿透仍然需要一台公网IP的服务器,如阿里云服务器

frp使用

  • 本文配合nginx使用(本文公网服务器不是主要用于内网穿透,且解析了多个域名,所以有些端口,如80被占用)
  • 本文以微信公众号H5开发为例(微信H5开发需要绑定回调地址,此回调地址必须是备案的域名,因此本地开发比较麻烦故使用内网穿透解决)
  • 下载最新frp版本,本文使用v0.13.0
    • 需要下载公网IP服务器(以下简称”服务器”)适用版(如frp_0.13.0_linux_amd64.tar.gz)和本地适用版(如frp_0.13.0_windows_amd64.zip)
  • 服务端

    • 解压后含有frps.ini(配置文件)、frps(可执行文件)
    • frps.ini进行配置

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      [common]
      bind_port = 7000
      # 使用泛域名*.frp.aezo.cn(需要将*.frp解析到此服务器)(不使用泛域名可忽略)
      subdomain_host = frp.aezo.cn
      # 访问本地服务需要映射公网ip的端口(所有的都走此端口)
      vhost_http_port = 7070

      # dashboard(后台可视化管理)访问地址和用户名密码
      dashboard_port = 7500
      dashboard_user = smalle
      dashboard_pwd = smalle
    • 后台运行frp服务端:nohup sudo -b ./frps > my.log 2>&1 &

    • 服务器将开放相应端口:7000、7070、7050(入);7000(出)
    • 服务器nginx配置如下

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      server {
      listen 80;
      server_name test.aezo.cn;

      location / {
      proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      if (!-f $request_filename) {
      proxy_pass http://test.aezo.cn:7070;
      break;
      }
      }
      }
    • 需要将域名test.aezo.cn解析到此服务器(101.1.1.1)

  • 客户端

    • 解压后含有frpc.ini(配置文件)、frpc(可执行文件)
    • frpc.ini进行配置

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      [common]
      # 服务器公网ip
      server_addr = 101.1.1.1
      server_port = 7000

      [web]
      type = http
      # 访问本地服务的端口
      local_port = 80
      custom_domains = test.aezo.cn

      # 不使用泛域名可忽略
      [web01]
      type = http
      local_port = 80
      # 使用泛域名进行解析(映射到http://test.frp.aezo.cn)
      subdomain = test
    • cmd运行frpc -c ./frpc.ini(可写成start.bat文件方便快速运行)

    • 客户端也可配合使用nginx
  • 请求流程
  • 微信h5开发:将test.aezo.cn绑定到对应的回调地址上即可

其他


ChatGPT开源小程序