来源: https://www.javachmapi.com/
本节开始说下内网穿透教程,Ngrok是一款国外免费开源的内网穿透工具,本节讲解需要依赖服务器作为服务端:
第一步、域名解析
1、下面解析两条域名记录
解析:
①、配置 local.javachmapi.com 是用来为ngrok服务器本身提供外部访问。
②、配置 *.local.javachmapi.com 是用来映射到我的笔记本,CNAME的方式解析到local.javachmapi.com;这里三级域名配置*是为了方便后面让客户端自定义三级域名,同时为了扩展更多隧道,网上内网穿透有些隧道收费也是这样做的。
第二、安装gcc环境
1、安装脚本
yum install gcc -y
2、检查是否安装成功
gcc -v 或者 gcc --version
第三、安装git环境
由于Ngrok存放在GitHub开源仓库,所以需要安装git用来下载ngrok源码,当然,你也可以直接下载,不过不推荐手动下载:
1、安装脚本
yum install git -y
2、检查是否安装成功
git --version
第三、安装go语言环境
1、安装脚本
yum install -y mercurial git bzr subversion golang golang-pkg-windows-amd64 golang-pkg-windows-386
2、检查是否安装成功
go version
3、如果安装失败的话,按照如下方式
①、下载安装源
安装官网教程https://golang.google.cn/dl/
②、解压安装源
cd /usr/local //进入目录
wget https://dl.google.com/go/go1.12.5.linux-amd64.tar.gz //下载
tar -C /usr/local -xzf go1.12.5.linux-amd64.tar.gz //解压
③、配置环境
vim /etc/profile
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/root/go
第四、安装Ngrok
1、下载源码到指定位置
cd /usr/local/
git clone https://github.com/inconshreveable/ngrok.git
2、生成证书
cd ngrok
export NGROK_DOMAIN="local.javachmapi.com"
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 device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
3、替换证书
一行一行执行,然后会提示是否覆盖,输入 “y” 回车就可以了
[root@izuitw8m4m8yvpz ngrok]# cp rootCA.pem assets/client/tls/ngrokroot.crt
[root@izuitw8m4m8yvpz ngrok]# cp device.crt assets/server/tls/snakeoil.crt
[root@izuitw8m4m8yvpz ngrok]# cp device.key assets/server/tls/snakeoil.key
第五、生成服务端和客户端
1、生成服务端
[root@izuitw8m4m8yvpz ngrok]# GOOS=linux GOARCH=amd64 make release-server
2、生成客户端
[root@izuitw8m4m8yvpz ngrok]# GOOS=windows GOARCH=amd64 make release-client
生成客户端的各种设备命令
- GOOS=windows GOARCH=amd64 make release-client //windows 64位
- GOOS=windows GOARCH=amd64 make release-client //windows 32位
- GOOS=darwin GOARCH=386 make release-client //Mac OS 32位
- GOOS=darwin GOARCH=amd64 make release-client //Mac OS 64位
- GOOS=linux GOARCH=amd64 make release-client //Linux 64位
- GOOS=linux GOARCH=arm make release-client //ARM 平台
服务端和客户端会在/usr/local/ngrok/bin文件夹中生成如下文件:
第六、启动服务端
1、普通方式启动
cd /usr/local/ngrok
./bin/ngrokd -domain="local.javachmapi.com" -httpAddr=":800" -httpsAddr=":4430" -tunnelAddr=":44300"
//或者
./bin/ngrokd -domain="local.javachmapi.com"
说明:
-domain : 域名
-httpAddr : ngrok 用来转发http服务的端口,默认80端口
-httpsAddr : ngrok 用来转发https服务的端口,默认443端口
-tunnelAddr :ngrok用来跟客户端通讯的端口,默认4443端口
注意:
①、如果无法正常启动,可以看下是否被占用或者防火墙没有放行端口,至于防火墙需要在阿里云服务器的防火墙配置以及服务器的防火墙配置哦!
②、这里也可以后端启动,在结尾加上&,不过更加建议使用开机服务启动方式哦!
2、开机服务启动
cd /usr/lib/systemd/system //进入目录
cat >>ngrok.service //创建文件夹,回车后直接按`ctrl+d`
vim ngrok.service //编辑文件
文件内容
- [Unit]
- Description=Share local port(s) with ngrok
- After=syslog.target network.target
- [Service]
- PrivateTmp=true
- Type=simple
- Restart=always
- RestartSec=1min
- StandardOutput=null
- StandardError=null
- ExecStart=/usr/local/ngrok/bin/ngrokd -domain=local.javachmapi.com -httpAddr=:800 -httpsAddr=:4430 -tunnelAddr=:44300 %i
- ExecStop=/usr/bin/killall ngrok
- [Install]
- WantedBy=multi-user.target
然后运行:
[root@izuitw8m4m8yvpz system]# systemctl daemon-reload
[root@izuitw8m4m8yvpz system]# systemctl restart ngrok.service
[root@izuitw8m4m8yvpz system]# systemctl status ngrok.service
更多命令解析:
systemctl 命令
- systemctl enable ngrok.service #加入开机启动
- systemctl daemon-reload #重新载入 systemd,扫描新的或有变动的单元
- systemctl is-enabled iptables.service
- systemctl is-enabled ngrok.service #查询服务是否开机启动
- systemctl enable ngrok.service #开机运行服务
- systemctl disable ngrok.service #取消开机运行
- systemctl start ngrok.service #启动服务
- systemctl stop ngrok.service #停止服务
- systemctl restart ngrok.service #重启服务
- systemctl reload ngrok.service #重新加载服务配置文件
- systemctl status ngrok.service #查询服务运行状态
- systemctl --failed #显示启动失败的服务
文件参数说明:
[Unit]部分主要是对这个服务的说明
Description 用于描述服务
After 用于描述服务类别
[Service]部分是服务的关键,是服务的一些具体运行参数的设置
Type=forking是后台运行的形式;
User=users是设置服务运行的用户;
Group=users是设置服务运行的用户组;
PIDFile为存放PID的文件路径;
ExecStart为服务的具体运行命令;
ExecReload为重启命令;
ExecStop为停止命令;
PrivateTmp=True表示给服务分配独立的临时空间
[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!
[Install]部分是服务安装的相关设置,可设置为多用户的
systemctl 是管制服务的主要工具, 它整合了chkconfig 与 service功能于一体。
第七、启动客户端
1、下载客户端
在前面生成的客户端,具体位置在/usr/local/ngrok/bin/windows_amd64,把里面的文件下载到本地来,我放在了本地G:\windows_amd64文件夹里面:
然后在同级目录中创建ngrok.cfg和start.bat文件。
2、配置ngrok.cfg文件内容
server_addr: "local.javachmapi.com:44300"
trust_host_root_certs: false
3、start.bat文件内容
ngrok -config=./ngrok.cfg -subdomain=tomcat 8080
// tomcat就是你想要访问域名的前缀
// 8080表示本地需要穿透的端口
4、启动客户端
双击start.bat,下面可以看到内网ngrok启动了:
5、访问效果
①、启动Window本地Tomcat,访问本地Tomcat没问题:
②、访问内网穿透显示的地址:
访问http://tomcat.local.javachmapi.com:800,可以看到如下界面:
③、手机访问内网穿透显示的地址,下面手机访问也没问题:
第八、配置反向代理,隐藏端口
一般情况下,我们Linux服务器都习惯装了别的软件,可能80端口就占用了,我们如何把上面800端口通过反向代理指向80端口呢,下面我们来看下最终的配置代码:
1、配置Nginx反向代理
由于前面配置*.local.javachmapi.com是用CNAME的方式解析到local.javachmapi.com,我们上面所配置服务端ngrok的HTTP端口为800,所以*.local.javachmapi.com:800等同local.javachmapi.com:800,如果想隐藏端口,只要利用反向代理把*.javachmapi.com指向local.javachmapi.com:800方可哦。
nginx配置信息
- server
- {
- listen 80;
- server_name *.javachmapi.com;
- index index.php index.html index.htm default.php default.htm default.html;
- root /www/wwwroot/local.javachmapi.com;
- location / {
- proxy_pass http://local.javachmapi.com:800; #此处二级域名可以随意填写
- proxy_set_header Host $host:800; # 这个是重点,$host 指的是与server_name相同的域名
- proxy_redirect off;
- client_max_body_size 10m;
- client_body_buffer_size 128k;
- proxy_connect_timeout 90;
- proxy_read_timeout 90;
- proxy_buffer_size 4k;
- proxy_buffers 6 128k;
- proxy_busy_buffers_size 256k;
- proxy_temp_file_write_size 256k;
- }
- #解决配置反向代理后js css文件无法加载问题
- location ~ .*\.(js|css|gif|jpg|jpeg|png|bmp|swf)$ {
- proxy_pass http://local.javachmapi.com:800; #此处二级域名可以随意填写
- proxy_set_header Host $host:800; # 这个是重点,$host 指的是与server_name相同的域名
- }
- access_log /www/wwwlogs/local.javachmapi.com.log;
- error_log /www/wwwlogs/local.javachmapi.com.error.log;
- }
2、配置实现效果
Copyright © 2016-2020 《Java开发学习大纲文档》系列. All Rights Reserved.