当前位置: 首页 > 科技观察

搭建ngrok服务实现内网穿透

时间:2023-03-18 00:26:26 科技观察

通常是通过路由器上的端口映射实现内网穿透。但是,并不是每个人都有访问和配置路由器的权限,可能存在多级路由器的复杂网络结构。端口映射也是不可能的。这个需要ngrok来实现。其原理是ngrok建立隧道,将主机A的http请求传递给主机B,从而实现内网穿透。Ngrok分为客户端(ngrok)和服务端(ngrokd)。实际使用中的部署如下:客户端安装在图中的内网主机上。在公网主机上安装服务器。clientpublic代表访问您计算机的用户或朋友。实践现在是云时代,各种服务都可以找到供应商。内网渗透也是如此。ngrok服务器相当笨重。如果你只是简单的渗透,没有任何敏感信息,你可以找到很多服务商。下载客户端根据您的PC系统下载匹配的客户端。下载地址:https://ngrok.com/downloadStart./ngrokhttp4444ngrokby@inconshreveable(Ctrl+Ctoquit)SessionStatusonlineSessionExpires7hours,59minutesVersion2.2.8RegionUnitedStates(us)WebInterfacehttp://127.0.0.1:4040Forwardinghttp://ada02116.ngrok.io->localhost:4444Forwardinghttps://ada02116.ngrok.io->localhost:4444Connectionssttlopnrt1rt5p50p90000.000.000.000.00如果此时访问http://ada02116.ngrok.io,相当于访问localhost:4444。自建的ngrok服务使用了别人的服务。有一些限制。比如不稳定、安全问题、价格昂贵等等。因此,您可能需要自己构建ngrok服务器。自建服务所需条件:1、有独立ip的服务器一台。例如阿里云、腾讯云等。2.需要一个域名。如果是国内的,就需要备案。配置域名,添加2条A记录,指向你的服务器。添加安全组。打开3个端口。这里我选择端口4443、4444和8081。其中4443是ngrok用于自身通信的。4444稍后用于tcp端口转发。8081用于http请求转发。默认是80,但是这里我给nginx分配了80端口。屏幕截图中缺少4444的配置。编译服务器。这里使用docker镜像来实现。登录服务器,创建文件夹ngrok-server,里面有2个文件。文件Dockerfile内容如下FROMgolang:1.7.1-alpineADDbuild.sh/RUNapkadd--no-cachegitmakeopensslRUNgitclonehttps://github.com/inconshreveable/ngrok.git--depth=1/ngrokRUNsed-i"109,109s/tcp/tcp4/g"/ngrok/src/ngrok/server/tunnel.goRUNsed-i"57,57s/tcp/tcp4/g"/ngrok/src/ngrok/conn/conn.goRUNsh/build.shEXPOSE8081VOLUME["/ngrok"]CMD["/ngrok/bin/ngrokd"]build.sh文件内容如下keyrootCA.key-subj"/CN=$NGROK_DOMAIN"-days5000-outrootCA.pemopensslgenrsa-outdevice.key2048opensslreq-new-keydevice.key-subj"/CN=$NGROK_DOMAIN"-outdevice.csropensslx509-req-indevice。csr-CArootCA.pem-CAkeyrootCA.key-CAcreateserial-outdevice.crt-days5000cprootCA.pemassets/client/tls/ngrokroot.crtcpdevice.crtassets/server/tls/snakeoil.crtcpdevice.keyassets/server/tls/snakeoil.keymakerrelease-serverGoos=LinuxGoarch=386makerElease-ClientGoos=linuxGoarch=amd64makerelease-clientgoos=WindowsGoarch=386makerelease-clientgoos=amd64md64mmakerelease-clientgoos=darwingoarch=darwingoeal=386mmaker-clort-client-clientgoos=darient=darient=darient=amdlient=darwingorarch。="ngrok.xxxx.com"修改为自己的域名构建镜像。运行dockerbuild-tngrok。注意最后一个。不要错过它。启动容器并运行dockerrun-it-p8081:8081-p4443:4443-p4444:4444-dngrok/ngrok/bin/ngrokd-domain="ngrok.xxxx.com"-httpAddr=":8081"这里的ngrok服务器有已完成。下载应用程序。进入上面启动的容器,下载对应的客户端。比如容器idc71b99a242fa,运行dockerinspectc71查看这个容器的具体信息。进入图中带下划线的目录,然后输入Bin。这是客户端。不同系统对应的版本。386表示32个系统。amd64表示64位。linux和windows就不用多说了。下载命令可以通过多种方式完成。例如ftp或scp命令。scp-P你的服务器端口-rroot@你的服务器ip地址:/var/lib/docker/volumes/6e5383924c5caf1b1b61250f31aa002308dcb371ebd9a7efad2419e20107a362/_data/bin/darwin_amd64/ngrok./ngrok这里要注意权限,如果你不是root的话,可能无法复制。配置客户端创建配置文件config.yml,内容如下server_addr:"ngrok.xxxx.com:4443"trust_host_root_certs:falsetunnels:webapp:proto:http:8081subdomain:testtcp12345:remote_port:4444proto:tcp:12345这里有2个配置隧道。一个http请求,一个tcp转发。启动客户端。/ngrok-config=config.ymlstart-all在浏览器中访问上图中的地址,可以看到本地内容。添加tcp转发的屏幕截图。测试12345端口功能,监听12345端口,执行nc-l12345,在其他电脑或本地执行ncngrok.xxxx.com4444。输入和输出都显示。如图所示