内网穿透的原理
内网穿透的实现
使用一位博主的代码
#!/bin/bash# -*- coding: UTF-8 -*-##############################################作者网名:Tommy ##作者博客:www.iyunw.cn ##作者QQ:351937287 ############################################### 获取当前脚本的路径。为什么不直接用pwd,pwd是打印当前执行这条脚本所在的绝对路径。SELFPATH=$(cd "$(dirname "$0")"; pwd)#echo '请输入你的域名'#read DOMAIN#安装ngrok需要的依赖包install_yilai(){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}#git可以使用yum安装,并无差别# 安装gitinstall_git(){unstall_gitif [ ! -f $SELFPATH/git-2.6.0.tar.gz ];thenwget http://img.iyunw.cn/git-2.6.0.tar.gzfitar zxvf git-2.6.0.tar.gzcd git-2.6.0./configure --prefix=/usr/local/gitmakemake installln -s /usr/local/git/bin/* /usr/bin/rm -rf $SELFPATH/git-2.6.0}# 卸载gitunstall_git(){rm -rf /usr/local/gitrm -rf /usr/local/git/bin/gitrm -rf /usr/local/git/bin/git-cvsserverrm -rf /usr/local/git/bin/gitkrm -rf /usr/local/git/bin/git-receive-packrm -rf /usr/local/git/bin/git-shellrm -rf /usr/local/git/bin/git-upload-archiverm -rf /usr/local/git/bin/git-upload-pack}#### 安装goinstall_go(){cd $SELFPATHuninstall_go# 动态链接库,用于下面的判断条件生效ldconfig# 判断操作系统位数下载不同的安装包#int型在32和64位系统中都是4给字节,但是64位中long型是8个字节if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '64' ];then# 判断文件是否已经存在if [ ! -f $SELFPATH/go1.7.6.linux-amd64.tar.gz ];thenwget http://img.iyunw.cn/go1.7.6.linux-amd64.tar.gzfitar zxvf go1.7.6.linux-amd64.tar.gzelseif [ ! -f $SELFPATH/go1.7.6.linux-386.tar.gz ];thenwget http://img.iyunw.cn/go1.7.6.linux-386.tar.gzfitar zxvf go1.7.6.linux-386.tar.gzfimv go /usr/local/ln -s /usr/local/go/bin/* /usr/bin/}# 卸载gouninstall_go(){rm -rf /usr/local/gorm -rf /usr/bin/gorm -rf /usr/bin/godocrm -rf /usr/bin/gofmt}# 安装ngrokinstall_ngrok(){echo '请输入你的域名'read DOMAINGOOS=`go env | grep GOOS | awk -F\" '{print $2}'` #转义"# GOOS=`go env | grep GOOS | awk -F '"' '{print $2}'` 单引号内内容,shell不做处理,两者效果一致GOARCH=`go env | grep GOARCH | awk -F\" '{print $2}'`uninstall_ngrokcd /usr/localif [ ! -f /usr/local/ngrok.zip ];thencd /usr/local/wget http://img.iyunw.cn/ngrok.zip #资源是博主网站的fiunzip ngrok.zipexport GOPATH=/usr/local/ngrok/export NGROK_DOMAIN=$DOMAINcd ngrokopenssl genrsa -out rootCA.key 2048openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pemopenssl genrsa -out server.key 2048openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csropenssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000cp rootCA.pem assets/client/tls/ngrokroot.crtcp server.crt assets/server/tls/snakeoil.crtcp server.key assets/server/tls/snakeoil.key# 替换下载源地址 s 替换动作允许其他字符作为分割符,#代替/ 避免歧义。-i 直接修改源文件sed -i 's#github.com/alecthomas/log4go#github.com/keepeye/log4go#' /usr/local/ngrok/src/ngrok/log/logger.gocd /usr/local/go/srcGOOS=$GOOS GOARCH=$GOARCH ./make.bashcd /usr/local/ngrokGOOS=$GOOS GOARCH=$GOARCH make release-serverecho "install done"# /usr/local/ngrok/bin/ngrokd -domain=$NGROK_DOMAIN -httpAddr=":80" &# echo "/usr/local/ngrok/bin/ngrokd -domain=$NGROK_DOMAIN -httpAddr=':80' &" >>/etc/rc.local}# 卸载ngrokuninstall_ngrok(){rm -rf /usr/local/ngrok}# 编译客户端compile_client(){GOOS=`go env | grep GOOS | awk -F\" '{print $2}'`GOARCH=`go env | grep GOARCH | awk -F\" '{print $2}'`cd /usr/local/go/srcGOOS=$1 GOARCH=$2 ./make.bashcd /usr/local/ngrok/GOOS=$1 GOARCH=$2 make release-client}# 生成客户端client(){echo '请输入你的域名'read DOMAINecho "1、Linux 32位"echo "2、Linux 64位"echo "3、Windows 32位"echo "4、Windows 64位"echo "5、Mac OS 32位"echo "6、Mac OS 64位"echo "7、Linux ARM"read numcase "$num" in[1] )compile_client linux 386;;[2] )compile_client linux amd64;;[3] )compile_client windows 386;;[4] )compile_client windows amd64;;[5] )compile_client darwin 386;;[6] )compile_client darwin amd64;;[7] )compile_client linux arm;;*) echo "选择错误,退出";;esac}echo "请输入下面数字进行选择"echo "------------------------"echo "1、全新安装"echo "2、安装依赖"echo "3、安装git"echo "4、安装go环境"echo "5、安装ngrok"echo "6、生成客户端"echo "7、卸载"echo "8、启动服务"echo "9、查看配置文件"echo "------------------------"read numcase "$num" in[1] )install_yilaiinstall_gitinstall_goinstall_ngrok;;[2] )install_yilai;;[3] )install_git;;[4] )install_go;;[5] )install_ngrok;;[6] )client;;[7] )unstall_gituninstall_gouninstall_ngrok;;[8] )echo "输入启动域名"read domainecho "启动端口"read port/usr/local/ngrok/bin/ngrokd -domain=$domain -httpAddr=":$port";;[9] )echo "输入启动域名"read domainecho server_addr: '"'$domain:4443'"'echo "trust_host_root_certs: false";;*) echo "";;esac
服务器启动ngrokd
nohup ./ngrokd -domain=home.xxxxx.top -tunnelAddr=':4443' -httpAddr=":99" -httpsAddr=":999" $//后台运行,终端关闭也不影响进程
后来我发现即使使用上面的方法,进程会自己挂掉,不确定是不是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
~
~
