×

内网穿透-----ngrok服务器搭建

hqy hqy 发表于2019-03-12 11:04:39 浏览3077 评论0

抢沙发发表评论

一,需求与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。可能有以下几方面原因:

  1. 可能是服务器端口未开放,在服务器上使用sudo iptables --list查看当前规则

  2. 查看是否网络问题,ping到对应的地址检查

  3. 可能是编译的时候证书没有覆盖或者版本不对,重新编译试试

(上面的原因分析来自: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://luozm.github.io/ngrok


打赏

本文链接:https://www.kinber.cn/post/305.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客