operationhome

ngrok 安装

何为内网穿透,内网穿透可以用哪些软件,见文章内网穿透
需要的材料:

1 域名

2 公网服务器

安装步骤

运行脚本,选择全新安装 ,即可。(脚本位置)

获取客户端 选择生成客户端 选择对应的系统即可。

域名解析(注意)

域名解析这里有些坑需要注意。

解析思路一

    首先我们要确定我们要使用的域名,我们这里以baidu.com 为例子。我们想最后达成的效果是 我们通过 djx.baidu.com 就可以访问我们内网的web服务或者是主机,通过fy.baidu.com 就可以访问另外一个web服务和主机 ,如果是这样的话,我们在进行安装的时候填入的域名就应该为 baidu.com.
我们在解析的时候就需要添加以下两个解析:

  • 泛域名解析
    泛域名解析,也就是 *.baidu.com,也就无论是djx.baidu.com 和fy.baidu.com 都将解析到此配置对应的ip。
    image
  • 直接解析主域名
    直接解析主域名,也就是我们客户端该去请求哪个服务端 也就是 @.baidu.com,注意此项一定得加,否则客户端请求会失败。
    image

解析思路二

有些用户这个主域名已经在使用了,我们想要使用的是 ngrok.baidu.com .我们想最后达成的效果是 我们通过 djx.ngrok.baidu.com 就可以访问我们内网的web服务或者是主机,通过fy.ngrok.baidu.com 就可以访问另外一个web服务和主机 ,如果是这样的话,我们在进行安装的时候填入的域名就应该为 ngrok.baidu.com.

那么我们也需要进行泛域名解析和 直接解析主域名(ngrok.baidu.com)
  • 泛域名解析
    image
  • 直接解析主域名
    注意这里使用的不是@ ,而是ngrok。
    image

启动服务端并更改绑定的端口

默认的绑定端口是 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

分类:

技术点:

相关文章: