一,需求与ngrok简介
1)需求
有时我们需要进行内网穿透,也就是说我们需要去访问和使用一些内网的机器;比方说,我在实验室有一台机器,而实验室的网络是内网(192.168.0.48),这个时候我想在宿舍的机器(172.18.61.246)去上对它进行ssh登录是做不到的,因为我宿舍的机器是跟实验室的网关是在同一个网段,但是跟实验室里面的机器不是在同一个网段的;所以为了方便我对实验室的机器进行ssh登录,需要使用内网穿透的工具;
2)ngrok
ngrok它是一个反向代理,可以实现一个本地运行的服务被外网访问。用上面的例子说就是,虽然我宿舍的机器A(172.18.61.246)无法直接ssh登录到我实验室的机器B(192.168.0.48),但是我现在有一台有公网IP的机器C(222.200.181.58),机器A可以访问机器C,同样机器B也可以访问机器C,这个时间我就可以通过机器C,让机器A去间接ssh登录到机器B了。而ngrok就可以实现这个工作。
虽然ngrok v2.x官方已经闭源,但是ngrok v1.x是开源的,代码托管在github上
?0?2
二,环境
需要安装如下的软件支持
git
go环境
?0?2
三,服务端操作(机器C)
在服务端的工作主要是下载ngrok开源包,然后进行环境搭建,并将生成的ngrok客户端发送给客户端使用;
1)下载ngrok开源包
git clone https://github.com/inconshreveable/ngrok.git cd ngrok/
2)为Base域名生成自签名证书
ngrok需要一个域名作为base域名,ngrok会为客户端分配base域名的子域名
使用ngrok官方服务时,base域名是ngrok.com,并且使用默认的SSL证书。现在自建ngrok服务器,所以需要重新为自己的base域名生成证书。因为我没有公网的域名,所以是使用修改本地host的方式(假设我使用的域名是sysu.workflow.edu.cn)命令如下
#为base域名tunnel.mydomain.com生成证书 openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=sysu.workflow.edu.cn" -days 5000 -out rootCA.pem openssl genrsa -out device.key 2048 openssl req -new -key device.key -subj "/CN=sysu.workflow.edu.cn" -out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
如果正常的话,会得到六个文件,如下图所示
使用这些文件去替换ngrok源码中assets中的某些证书就可以了,命令如下
#assets是ngrok源码中的assets目录 cp rootCA.pem assets/client/tls/ngrokroot.crt cp device.crt assets/server/tls/snakeoil.crt cp device.key assets/server/tls/snakeoil.key
3)编译服务端ngrokd
ngrokd就是ngrok服务器端,默认Linux的执行文件,命令如下
#执行目录是ngrok的源码目录 make release-server
编译成功后,我们可以在ngrok的源码目录的bin下面找到ngrokd,测试运行如下,命令如下
#表示使用30001端口启动http服务,不使用https服务 ./bin/ngrokd -domain="sysu.workflow.edu.cn" -httpAddr=":30001" -httpsAddr=""
成功的话,如下所示
到这里服务端就编译完成了,Ctrl+C退出ngrokd,接下来是编译ngrok客户端
4)编译客户端ngrok
#在ngrok源码目录 make release-client
如果没有报任何错误的话,我们在源码的bin目录下面就可以找到ngrok的可执行文件了;
如下图所示
5)启动服务
./bin/ngrokd -domain="sysu.workflow.edu.cn" -httpAddr=":30001" -httpsAddr="" # 如果需要后台运行可以使用screen或nohup # 使用nohup,保存到nohub.out # nohup ./bin/ngrokd -domain="sysu.workflow.edu.cn" -httpAddr=":30001" -httpsAddr="" & # 不要日志的话如下 # nohup ./bin/ngrokd -domain="sysu.workflow.edu.cn" -httpAddr=":30001" -httpsAddr="" >/dev/null 2>&1 & #查看pid #lsof -i:4443
四、客户端操作(机器B)
将之前在服务端,也就是机器C生成的可执行文件ngrok复制到机器B上
1)建立配置文件ngrok.yml
server_addr: "sysu.workflow.edu.cn:4443" trust_host_root_certs: false tunnels: ssh: remote_port: 6666 proto: tcp: 22
上述配置文件表示说,服务端的地址与端口是"sysu.workflow.edu.cn:4443",这个域名是我们在一开始设置的,而4443是ngrokd启动的默认端口,可以从ngrokd启动的输出看到
2)修改hosts
为了让上面的配置生效,我们还需要修改本地host,命令如下
sudo vim /etc/hosts #在文件中添加 #222.200.181.58 sysu.workflow.edu.cn #编辑后,重新启动网络 /etc/init.d/networking restart #测试下 ping sysu.workflow.edu.cn
3)启动
#给运行权限 chmod +x ngrok ./ngrok -config=ngrok.yml start ssh
成功的话,会显示如下
如果你的状态显示的是reconnecting,表示问题,可以在运行ngrok时加入-log=stdout
来进行debug。可能有以下几方面原因:
可能是服务器端口未开放,在服务器上使用
sudo iptables --list
查看当前规则查看是否网络问题,
ping
到对应的地址检查可能是编译的时候证书没有覆盖或者版本不对,重新编译试试
(上面的原因分析来自:https://luozm.github.io/ngrok)
这里说一下具体的操作,我在这里主要使用了两个机器C的端口,分别是监听端口4443和代理端口6666,具体操作如下
#确认host无误 ping sysu.workflow.edu.cn #确认端口4443开放 telnet sysu.workflow.edu.cn 4443 #确认端口6666开放 telnet sysu.workflow.edu.cn 6666
如果发现有端口没有开放的话,可以在服务端(机器C)上进行如下操作
#假设6666没有开放 sudo iptables -I INPUT -p tcp --dport 6666 -j ACCEPT
?0?2
五、远程登录(机器A)
现在我就可以通过机器C(222.200.181.58)进行远程登录到机器B(192.168.0.48)了
#下面的ip地址就是222.200.181.58,端口号就是6666 ssh 用户名@IP地址 -p 端口号
六、参考
https://my.oschina.net/dingdayu/blog/736911
本文链接:https://www.kinber.cn/post/305.html 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝: