Ngrok内网穿透

qboy1987 · · 460 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

为什么要用

至于为什么要用内网穿透技术,网上一大堆,也有很多收费的网站进行内网穿透,比如花生壳等等。

这里我们选择的是一个开源项目ngrok来自己搭建开源内网穿透环境,以下服务器和客户端都是在ubuntu下编译使用.

编译

  1. 安装编译环境

由于Ngrok采用Go语言编写,因此需要下载 Go,可以直接下载编译的的包来使用。

  1. 获取源码

git clone https://github.com/inconshreveable/ngrok.git ngrok

  1. 生成key
NGROK_DOMAIN="xxx.com"
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

cp base.pem assets/client/tls/ngrokroot.crt

最好在服务器上生成以上Key,当时不清楚在客户端生成了这些Key在服务端一直提示公私钥对不上。

  1. 编译
sudo make release-server release-client

直接使用apt-get install golang安装的go环境好像是版本太旧了,是1.6的,当前最新的版本是1.11 所以需要第1步安装go环境。

如果一切正常,ngrok/bin 目录下应该有 ngrok、ngrokd 两个可执行文件。ngrokd是服务端软件,ngrok是客户端软件

服务端

运行服务端程序

sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="xxx.com" -httpAddr=":9081" -httpsAddr=":9082"

到这一步,ngrok 服务已经跑起来了,可以通过屏幕上显示的日志查看更多信息。httpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,可以随意指定。ngrokd 还会开一个 4443 端口用来跟客户端通讯(可通过 -tunnelAddr=":xxx" 指定),如果你配置了iptables 规则或者其他安全规则,需要放行这三个端口上的 TCP 协议。
在这里我使用的是<b>supervisor</b>来管理进程的,很简单。在这里就不介绍了

与Nginx结合

由于我的服务器的80端口被其他服务占用了,无法使用80端口来使用ngrok,本来想使用80端口来进行转发,但是一时没配合,因此使用nginx的80端口来进行端口跳转。

nginx配置文件如下

upstream ngrok {
    server 127.0.0.1:9081;
    keepalive 64;
}

server {
    listen 80;
    server_name "*.pub.xxx.com";
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host  $http_host:9081;
        proxy_set_header X-Nginx-Proxy true;
        proxy_set_header Connection "";
        proxy_pass      http://ngrok ;
    }
}

由于使用了域名,因此在域名解析处时需要配置成泛解析,这里我使用的<b>*.pub</b>来泛解析域名,采用泛解析之后针对多个客户端时可以不需要再单独去配置不同的域名解析

客户端

Ngrok客户端配置文件

server_addr: "xxx.com:4443"
trust_host_root_certs: false
tunnels:
  http:
    subdomain: "test.pub"
    proto:
      http: "9091"
  ssh:
    remote_port: 3322
    proto:
      tcp: "22"

客户端启动命令:

启动http ngrok -config ngrok.conf start http

启动ssh ngrok -config ngrok.conf start ssh

如果启动ssh,那么远端端口3322也要在安全规则中启用。
那么可以在外网使用ssh 穿透时内网了。我觉得这个有时比teamviewer方便一些,毕竟有一些是服务器无法使用teamviewer客户端

连上之后在控制台输出

Tunnel Status   online
Version
Forwarding
……

如果没有连上或者服务器断开 online会显示成reconnecting

本文来自:简书

感谢作者:qboy1987

查看原文:Ngrok内网穿透

入群交流(和以上内容无关):Go中文网 QQ 交流群:729884609 或加微信入微信群:274768166 备注:入群;关注公众号:Go语言中文网

460 次点击  
加入收藏 微博
上一篇:go常识
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传