为什么要用
至于为什么要用内网穿透技术,网上一大堆,也有很多收费的网站进行内网穿透,比如花生壳等等。
这里我们选择的是一个开源项目ngrok来自己搭建开源内网穿透环境,以下服务器和客户端都是在ubuntu下编译使用.
编译
- 安装编译环境
由于Ngrok采用Go语言编写,因此需要下载 Go,可以直接下载编译的的包来使用。
- 获取源码
git clone https://github.com/inconshreveable/ngrok.git ngrok
- 生成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在服务端一直提示公私钥对不上。
- 编译
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
有疑问加站长微信联系(非本文作者)