内网穿透的原理

image.png

内网穿透的实现

使用一位博主的代码

  1. #!/bin/bash
  2. # -*- coding: UTF-8 -*-
  3. #############################################
  4. #作者网名:Tommy #
  5. #作者博客:www.iyunw.cn #
  6. #作者QQ:351937287 #
  7. #############################################
  8. # 获取当前脚本的路径。为什么不直接用pwd,pwd是打印当前执行这条脚本所在的绝对路径。
  9. SELFPATH=$(cd "$(dirname "$0")"; pwd)
  10. #echo '请输入你的域名'
  11. #read DOMAIN
  12. #安装ngrok需要的依赖包
  13. install_yilai(){
  14. 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
  15. }
  16. #git可以使用yum安装,并无差别
  17. # 安装git
  18. install_git(){
  19. unstall_git
  20. if [ ! -f $SELFPATH/git-2.6.0.tar.gz ];then
  21. wget http://img.iyunw.cn/git-2.6.0.tar.gz
  22. fi
  23. tar zxvf git-2.6.0.tar.gz
  24. cd git-2.6.0
  25. ./configure --prefix=/usr/local/git
  26. make
  27. make install
  28. ln -s /usr/local/git/bin/* /usr/bin/
  29. rm -rf $SELFPATH/git-2.6.0
  30. }
  31. # 卸载git
  32. unstall_git(){
  33. rm -rf /usr/local/git
  34. rm -rf /usr/local/git/bin/git
  35. rm -rf /usr/local/git/bin/git-cvsserver
  36. rm -rf /usr/local/git/bin/gitk
  37. rm -rf /usr/local/git/bin/git-receive-pack
  38. rm -rf /usr/local/git/bin/git-shell
  39. rm -rf /usr/local/git/bin/git-upload-archive
  40. rm -rf /usr/local/git/bin/git-upload-pack
  41. }
  42. ###
  43. # 安装go
  44. install_go(){
  45. cd $SELFPATH
  46. uninstall_go
  47. # 动态链接库,用于下面的判断条件生效
  48. ldconfig
  49. # 判断操作系统位数下载不同的安装包
  50. #int型在32和64位系统中都是4给字节,但是64位中long型是8个字节
  51. if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '64' ];then
  52. # 判断文件是否已经存在
  53. if [ ! -f $SELFPATH/go1.7.6.linux-amd64.tar.gz ];then
  54. wget http://img.iyunw.cn/go1.7.6.linux-amd64.tar.gz
  55. fi
  56. tar zxvf go1.7.6.linux-amd64.tar.gz
  57. else
  58. if [ ! -f $SELFPATH/go1.7.6.linux-386.tar.gz ];then
  59. wget http://img.iyunw.cn/go1.7.6.linux-386.tar.gz
  60. fi
  61. tar zxvf go1.7.6.linux-386.tar.gz
  62. fi
  63. mv go /usr/local/
  64. ln -s /usr/local/go/bin/* /usr/bin/
  65. }
  66. # 卸载go
  67. uninstall_go(){
  68. rm -rf /usr/local/go
  69. rm -rf /usr/bin/go
  70. rm -rf /usr/bin/godoc
  71. rm -rf /usr/bin/gofmt
  72. }
  73. # 安装ngrok
  74. install_ngrok(){
  75. echo '请输入你的域名'
  76. read DOMAIN
  77. GOOS=`go env | grep GOOS | awk -F\" '{print $2}'` #转义"
  78. # GOOS=`go env | grep GOOS | awk -F '"' '{print $2}'` 单引号内内容,shell不做处理,两者效果一致
  79. GOARCH=`go env | grep GOARCH | awk -F\" '{print $2}'`
  80. uninstall_ngrok
  81. cd /usr/local
  82. if [ ! -f /usr/local/ngrok.zip ];then
  83. cd /usr/local/
  84. wget http://img.iyunw.cn/ngrok.zip #资源是博主网站的
  85. fi
  86. unzip ngrok.zip
  87. export GOPATH=/usr/local/ngrok/
  88. export NGROK_DOMAIN=$DOMAIN
  89. cd ngrok
  90. openssl genrsa -out rootCA.key 2048
  91. openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
  92. openssl genrsa -out server.key 2048
  93. openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
  94. openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
  95. cp rootCA.pem assets/client/tls/ngrokroot.crt
  96. cp server.crt assets/server/tls/snakeoil.crt
  97. cp server.key assets/server/tls/snakeoil.key
  98. # 替换下载源地址 s 替换动作允许其他字符作为分割符,#代替/ 避免歧义。-i 直接修改源文件
  99. sed -i 's#github.com/alecthomas/log4go#github.com/keepeye/log4go#' /usr/local/ngrok/src/ngrok/log/logger.go
  100. cd /usr/local/go/src
  101. GOOS=$GOOS GOARCH=$GOARCH ./make.bash
  102. cd /usr/local/ngrok
  103. GOOS=$GOOS GOARCH=$GOARCH make release-server
  104. echo "install done"
  105. # /usr/local/ngrok/bin/ngrokd -domain=$NGROK_DOMAIN -httpAddr=":80" &
  106. # echo "/usr/local/ngrok/bin/ngrokd -domain=$NGROK_DOMAIN -httpAddr=':80' &" >>/etc/rc.local
  107. }
  108. # 卸载ngrok
  109. uninstall_ngrok(){
  110. rm -rf /usr/local/ngrok
  111. }
  112. # 编译客户端
  113. compile_client(){
  114. GOOS=`go env | grep GOOS | awk -F\" '{print $2}'`
  115. GOARCH=`go env | grep GOARCH | awk -F\" '{print $2}'`
  116. cd /usr/local/go/src
  117. GOOS=$1 GOARCH=$2 ./make.bash
  118. cd /usr/local/ngrok/
  119. GOOS=$1 GOARCH=$2 make release-client
  120. }
  121. # 生成客户端
  122. client(){
  123. echo '请输入你的域名'
  124. read DOMAIN
  125. echo "1、Linux 32位"
  126. echo "2、Linux 64位"
  127. echo "3、Windows 32位"
  128. echo "4、Windows 64位"
  129. echo "5、Mac OS 32位"
  130. echo "6、Mac OS 64位"
  131. echo "7、Linux ARM"
  132. read num
  133. case "$num" in
  134. [1] )
  135. compile_client linux 386
  136. ;;
  137. [2] )
  138. compile_client linux amd64
  139. ;;
  140. [3] )
  141. compile_client windows 386
  142. ;;
  143. [4] )
  144. compile_client windows amd64
  145. ;;
  146. [5] )
  147. compile_client darwin 386
  148. ;;
  149. [6] )
  150. compile_client darwin amd64
  151. ;;
  152. [7] )
  153. compile_client linux arm
  154. ;;
  155. *) echo "选择错误,退出";;
  156. esac
  157. }
  158. echo "请输入下面数字进行选择"
  159. echo "------------------------"
  160. echo "1、全新安装"
  161. echo "2、安装依赖"
  162. echo "3、安装git"
  163. echo "4、安装go环境"
  164. echo "5、安装ngrok"
  165. echo "6、生成客户端"
  166. echo "7、卸载"
  167. echo "8、启动服务"
  168. echo "9、查看配置文件"
  169. echo "------------------------"
  170. read num
  171. case "$num" in
  172. [1] )
  173. install_yilai
  174. install_git
  175. install_go
  176. install_ngrok
  177. ;;
  178. [2] )
  179. install_yilai
  180. ;;
  181. [3] )
  182. install_git
  183. ;;
  184. [4] )
  185. install_go
  186. ;;
  187. [5] )
  188. install_ngrok
  189. ;;
  190. [6] )
  191. client
  192. ;;
  193. [7] )
  194. unstall_git
  195. uninstall_go
  196. uninstall_ngrok
  197. ;;
  198. [8] )
  199. echo "输入启动域名"
  200. read domain
  201. echo "启动端口"
  202. read port
  203. /usr/local/ngrok/bin/ngrokd -domain=$domain -httpAddr=":$port"
  204. ;;
  205. [9] )
  206. echo "输入启动域名"
  207. read domain
  208. echo server_addr: '"'$domain:4443'"'
  209. echo "trust_host_root_certs: false"
  210. ;;
  211. *) echo "";;
  212. esac

服务器启动ngrokd

  1. nohup ./ngrokd -domain=home.xxxxx.top -tunnelAddr=':4443' -httpAddr=":99" -httpsAddr=":999" $
  2. //后台运行,终端关闭也不影响进程

后来我发现即使使用上面的方法,进程会自己挂掉,不确定是不是ngrokd自身的原因,所以我把启动语句写成脚本,并制作成service.
ngrokd.service放在下面两个文件夹下,后续就可以使用system管理脚本的启动、关闭、自启动
/etc/systemd/system
/usr/lib/systemd/system/

#ngrokd.service 
[Unit]
Description=The ngrokd Intranet penetration server

[Service]
Type=simple
PIDFile=/run/ngrokd.pid
ExecStart=/root/ngrokd.sh
[Install]
WantedBy=multi-user.target
~                                                                                                                                                                           
~