ngrok 安装
何为内网穿透,内网穿透可以用哪些软件,见文章内网穿透
需要的材料:
1 域名
2 公网服务器
安装步骤
运行脚本,选择全新安装 ,即可。(脚本位置)
获取客户端 选择生成客户端 选择对应的系统即可。
域名解析(注意)
域名解析这里有些坑需要注意。
解析思路一
首先我们要确定我们要使用的域名,我们这里以baidu.com 为例子。我们想最后达成的效果是 我们通过 djx.baidu.com 就可以访问我们内网的web服务或者是主机,通过fy.baidu.com 就可以访问另外一个web服务和主机 ,如果是这样的话,我们在进行安装的时候填入的域名就应该为 baidu.com.
我们在解析的时候就需要添加以下两个解析:
-
泛域名解析
泛域名解析,也就是 *.baidu.com,也就无论是djx.baidu.com 和fy.baidu.com 都将解析到此配置对应的ip。 -
直接解析主域名
直接解析主域名,也就是我们客户端该去请求哪个服务端 也就是 @.baidu.com,注意此项一定得加,否则客户端请求会失败。
解析思路二
有些用户这个主域名已经在使用了,我们想要使用的是 ngrok.baidu.com .我们想最后达成的效果是 我们通过 djx.ngrok.baidu.com 就可以访问我们内网的web服务或者是主机,通过fy.ngrok.baidu.com 就可以访问另外一个web服务和主机 ,如果是这样的话,我们在进行安装的时候填入的域名就应该为 ngrok.baidu.com.
那么我们也需要进行泛域名解析和 直接解析主域名(ngrok.baidu.com)
-
泛域名解析
-
直接解析主域名
注意这里使用的不是@ ,而是ngrok。
启动服务端并更改绑定的端口
默认的绑定端口是 80 , 443, 4443
很多时候我们这些端口已经被服务给占用了。所以我们需要更改默认的端口.
/usr/local/ngrok/bin/ngrokd -domain="baidu.com" -httpAddr=":81" -httpsAddr=":8181" -tunnelAddr=":8182"
```
-domain="baidu.com" 绑定的域名
-httpAddr=":80" web服务 http 协议的端口
-httpsAddr=":8081" web服务 https协议的端口
-tunnelAddr=":443" 客户端和服务端进行通信的端口,在客户端配置文件中要修改为服务端设置的端口,否则无法通信
```
如果是使用的云服务厂商的服务器,注意要开放对应的端口和将端口添加到安全组。
启动成功
[root@exit ~]# /usr/local/ngrok/bin/ngrokd -domain=baidu.com -httpAddr=:80 -httpsAddr=":443" -tunnelAddr=":4443"
[09:38:35 CST 2018/12/18] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
[09:38:35 CST 2018/12/18] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[09:38:35 CST 2018/12/18] [INFO] (ngrok/log.Info:112) Listening for public http connections on 0.0.0.0:80
[09:38:35 CST 2018/12/18] [INFO] (ngrok/log.Info:112) Listening for public https connections on 0.0.0.0:443
[09:38:35 CST 2018/12/18] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on 0.0.0.0:4443
服务端后台运行
nohup /usr/local/ngrok/bin/ngrokd -log=/var/log/ngrok.log -domain=baidu.com -httpAddr=:80 -httpsAddr=":443" &
获取客户端
执行脚本后,选择要生成的对应平台的客户端,最后在文件夹/usr/local/ngrok/bin/ 下可以找到,linux平台是 ngrok ,windows是ngrok.exe 文件。
客户端连接
客户端配置文件
获取到客户端,我们需要在客户端存放的位置新建一个配置文件 ngrok.cfg.
注意点:客户端连接端口要与服务端的连接端口一致。域名也要与服务端绑定的一致。
ngrok.cfg
server_addr: baidu.com:4443
trust_host_root_certs: false
linux 运行
映射web服务
./ngrok -subdomain=tom -config=ngrok.cfg 81
-subdomain=tom # 指定要生成的域名的前缀。
-config=ngrok.cfg #指定配置文件
81 # 映射到本地的端口
映射tcp 端口(ssh,rdp)
./ngrok -config=ngrok.cfg -proto=tcp 22
运行成功
[root@localhost ngrok1]# ./ngrok -config=ngrok.cfg -proto=tcp 22
ngrok (Ctrl+C to quit)
Tunnel Status online
Version 1.7/1.7
Forwarding tcp://baidu.com:40305 -> 127.0.0.1:22
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms
windows 运行
windows 的不同之处在于 启动命令 其它一致.
进入到ngrok.exe 文件的目录下。
start ngrok.exe -subdomain=tom -config=ngrok.cfg 81
映射多个服务
在实际的使用过程中,我们一般映射的不仅仅只有一个服务,我们通常需要映射多个服务,虽然我们可以通过启动多个进程来解决这个问题,但是这里还有一个简单的办法,就是将配置写入到我们的配置文件中,一次映射多个服务。
编写配置文件需要遵循yaml 的语法
ngrok.cfg
内容:
server_addr: baidu.com:4443
trust_host_root_certs: false
tunnels:
http: #映射名称
proto:
http: 80 #指定协议为http 和映射的ip和端口
subdomain: pi #获取的域名pi.baidu.com
dx: #映射名称
remote_port: 3233 # 远程端口
proto:
tcp: 192.168.1.17:3389 #指定协议为http 和映射的ip和端口
yg:
remote_port: 3355
proto:
tcp: 192.168.1.2:3389
注意: 我们在这里设置的remote_port 的端口需要在服务端的安全组和防火墙进行添加
启动
./ngrok -config=ngrok.cfg start http dx yg
这样我们就可以映射多个服务了。
ngrok 客户端的一些其他命令
-log 指定日志文件 默认为空
-log-level 指定日志等级 默认为“DEBUG”
-proto 指定传输协议 默认为“http+https”
-subdomain 指定访问的域名的前缀 只能使用在http协议上。
ngrok start name 指定启动映射
ngork start-all 启动配置文件里所有的配置
ngork list 查看所有的映射
ngrok help 查看帮助
ngrok version 查看版本
客户端后台运行
方法一:
使用nohup &
方法二:
screen
脚本内容
#!/bin/bash
# -*- coding: UTF-8 -*-
# 获取当前脚本执行路径
SELFPATH=$(cd "$(dirname "$0")"; pwd)
install_yilai(){
yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ unzip
}
# 安装git
install_git(){
unstall_git
if [ ! -f $SELFPATH/git-2.6.0.tar.gz ];then
wget http://img.iyunw.cn/git-2.6.0.tar.gz
fi
tar zxvf git-2.6.0.tar.gz
cd git-2.6.0
./configure --prefix=/usr/local/git
make
make install
ln -s /usr/local/git/bin/* /usr/bin/
rm -rf $SELFPATH/git-2.6.0
}
# 卸载git
unstall_git(){
rm -rf /usr/local/git
rm -rf /usr/local/git/bin/git
rm -rf /usr/local/git/bin/git-cvsserver
rm -rf /usr/local/git/bin/gitk
rm -rf /usr/local/git/bin/git-receive-pack
rm -rf /usr/local/git/bin/git-shell
rm -rf /usr/local/git/bin/git-upload-archive
rm -rf /usr/local/git/bin/git-upload-pack
}
# 安装go
install_go(){
cd $SELFPATH
uninstall_go
# 动态链接库,用于下面的判断条件生效
ldconfig
# 判断操作系统位数下载不同的安装包
if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '64' ];then
# 判断文件是否已经存在
if [ ! -f $SELFPATH/go1.7.6.linux-amd64.tar.gz ];then
wget http://img.iyunw.cn/go1.7.6.linux-amd64.tar.gz
fi
tar zxvf go1.7.6.linux-amd64.tar.gz
else
if [ ! -f $SELFPATH/go1.7.6.linux-386.tar.gz ];then
wget http://img.iyunw.cn/go1.7.6.linux-386.tar.gz
fi
tar zxvf go1.7.6.linux-386.tar.gz
fi
mv go /usr/local/
ln -s /usr/local/go/bin/* /usr/bin/
}
# 卸载go
uninstall_go(){
rm -rf /usr/local/go
rm -rf /usr/bin/go
rm -rf /usr/bin/godoc
rm -rf /usr/bin/gofmt
}
# 安装ngrok
install_ngrok(){
echo '请输入你的域名'
read DOMAIN
GOOS=`go env | grep GOOS | awk -F\" '{print $2}'`
GOARCH=`go env | grep GOARCH | awk -F\" '{print $2}'`
uninstall_ngrok
cd /usr/local
if [ ! -f /usr/local/ngrok.zip ];then
cd /usr/local/
wget http://img.iyunw.cn/ngrok.zip
fi
unzip ngrok.zip
export GOPATH=/usr/local/ngrok/
export NGROK_DOMAIN=$DOMAIN
cd ngrok
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.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 rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key
# 替换下载源地址
sed -i 's#code.google.com/p/log4go#github.com/keepeye/log4go#' /usr/local/ngrok/src/ngrok/log/logger.go
cd /usr/local/go/src
GOOS=$GOOS GOARCH=$GOARCH ./make.bash
cd /usr/local/ngrok
GOOS=$GOOS GOARCH=$GOARCH make release-server
echo "install done"
/usr/local/ngrok/bin/ngrokd -domain=$NGROK_DOMAIN -httpAddr=":80" &
echo "/usr/local/ngrok/bin/ngrokd -domain=$NGROK_DOMAIN -httpAddr=':80' &" >>/etc/rc.local
}
# 卸载ngrok
uninstall_ngrok(){
rm -rf /usr/local/ngrok
}
# 编译客户端
compile_client(){
GOOS=`go env | grep GOOS | awk -F\" '{print $2}'`
GOARCH=`go env | grep GOARCH | awk -F\" '{print $2}'`
cd /usr/local/go/src
GOOS=$1 GOARCH=$2 ./make.bash
cd /usr/local/ngrok/
GOOS=$1 GOARCH=$2 make release-client
}
# 生成客户端
client(){
echo '请输入你的域名'
read DOMAIN
echo "1、Linux 32位"
echo "2、Linux 64位"
echo "3、Windows 32位"
echo "4、Windows 64位"
echo "5、Mac OS 32位"
echo "6、Mac OS 64位"
echo "7、Linux ARM"
read num
case "$num" in
[1] )
compile_client linux 386
;;
[2] )
compile_client linux amd64
;;
[3] )
compile_client windows 386
;;
[4] )
compile_client windows amd64
;;
[5] )
compile_client darwin 386
;;
[6] )
compile_client darwin amd64
;;
[7] )
compile_client linux arm
;;
*) echo "选择错误,退出";;
esac
}
echo "请输入下面数字进行选择"
echo "------------------------"
echo "1、全新安装"
echo "2、安装依赖"
echo "3、安装git"
echo "4、安装go环境"
echo "5、安装ngrok"
echo "6、生成客户端"
echo "7、卸载"
echo "8、启动服务"
echo "9、查看配置文件"
echo "------------------------"
read num
case "$num" in
[1] )
install_yilai
install_git
install_go
install_ngrok
;;
[2] )
install_yilai
;;
[3] )
install_git
;;
[4] )
install_go
;;
[5] )
install_ngrok
;;
[6] )
client
;;
[7] )
unstall_git
uninstall_go
uninstall_ngrok
;;
[8] )
echo "输入启动域名"
read domain
echo "启动端口"
read port
/usr/local/ngrok/bin/ngrokd -domain=$domain -httpAddr=":$port"
;;
[9] )
echo "输入启动域名"
read domain
echo server_addr: '"'$domain:4443'"'
echo "trust_host_root_certs: false"
;;
*) echo "";;
esac