首先说一下,什么是内网穿透?我举个栗子,比如你在本地搭建的网站,想让局域网外的人访问,该怎么实现?,之前还好虽然说拨号上网,但是有外网IP,现在我用的某某网只有内网IP,所以要想让外网访问内网的测试服务器,需要做内网穿透。这里有个很多人都熟知的工具:花生壳。在后来偶尔知道了可以用linux搭建ngrok这个开源的双向代理,来实现内网穿透这个功能。
一台外网服务器,一个域名,并且域名泛解析解析到外网服务器,此处我用的服务器的操作系统为CentOS7
安装gcc和git(用于下载ngrok源码)
yum install gcc -y yum install git -y
yum install -y mercurial git bzr subversion golang golang-pkg-windows-amd64 golang-pkg-windows-386
git --version //( >= 1.7 ) go version
5.1.下载ngrok源码
git clone https://github.com/inconshreveable/ngrok.git
5.2.生成证书
cd ngrok 切换到ngrok目录
把aaa.com修改为自己的域名
export NGROK_DOMAIN="aaa.com"
生成证书
openssl genrsa -out rootCA.key 2048 openssl req -new -x509 -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 10000 -out rootCA.pem openssl genrsa -out server.key 2048 openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 10000
5.3.将新生成的证书替换,执行下面命令后 “y” 回车 一行一行执行代码!
cp rootCA.pem assets/client/tls/ngrokroot.crt cp server.crt assets/server/tls/snakeoil.crt cp server.key assets/server/tls/snakeoil.key
# 64位linux服务端: GOOS=linux GOARCH=amd64 make release-server
cd ngrok #前台运行 ./bin/ngrokd -domain="aaa.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":6666" & #后台运行 nohup ./bin/ngrokd -domain="aaa.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":6666" & # 指定TLS证书和密钥 ./bin/ngrokd -tlsKey="server.key" -tlsCrt="server.crt" -domain="aaa.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":6666"
# 32位linux客户端: GOOS=linux GOARCH=386 make release-client # 64位linux客户端: GOOS=linux GOARCH=amd64 make release-client #32位windows客户端: GOOS=windows GOARCH=386 make release-client #64位windows客户端: GOOS=windows GOARCH=amd64 make release-client #32位mac平台客户端: GOOS=darwin GOARCH=386 make release-client #64位mac平台客户端: GOOS=darwin GOARCH=amd64 make release-client #ARM平台linux客户端: GOOS=linux GOARCH=arm make release-client # 生成客户端文件位置 ./ngrok/bin
我只用到linux服务器端和win客户端,我只需要执行如下即可。
根据自己需要生成
# 64位linux服务端: GOOS=linux GOARCH=amd64 make release-server # 64位linux客户端: GOOS=linux GOARCH=amd64 make release-client
./ngrok/bin/windows_amd64/里的文件下载到本地Windows下,如D:\ngrok
文件中输入:
server_addr: "aaa.com:6666" trust_host_root_certs: false tunnels: http: subdomain: "www" proto: http: "80" https: subdomain: "www" proto: https: "443" ssh: remote_port: 2222 proto: tcp: "22" mstsc: remote_port: 3333 proto: tcp: "3389"
注意:一定要根据自己的实际情况在服务器后台安全组规则中开启或删除。
在Windows中D:\ngrok新建文件 改名 start.bat
输入:
ngrok -config=ngrok.cfg start http https ssh mstsc
直接双击运行start.bat
i /usr/lib/systemd/system/ngrok.service # 在CentOS 7上利用systemctl添加自定义系统服务 [Unit] Description=ngrok After=network.target [Service] Type=simple Restart=always RestartSec=1min ExecStart=/usr/local/ngrok/bin/ngrokd -domain=aaa.cn -httpAddr=:80 -httpsAddr=:443 -tunnelAddr=:6666 %i ExecStop=/usr/bin/killall ngrok PrivateTmp=true [Install] WantedBy=multi-user.target
#设置开机启动: systemctl enable ngrok.service #启动服务: systemctl start ngrok.service #停止服务: systemctl stop ngrok.service
附带一份 nginx.conf 配置文件
# ngrok upstream ngrok { server 127.0.0.1:800; keepalive 64; } # ngrok 穿透 server { listen 80; server_name *.aaa.com; location / { proxy_pass http://ngrok; proxy_redirect off; proxy_set_header Host $http_host:800; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; expires 5s; } }