内网穿透

参照 http://www.hackliu.com/?p=363

使用ngrok进行内网穿透
前提必需品:

  1. 有公网ip的服务器
  2. 域名

域名解析情况:

*.ngrok.wangzhaojin.top  --> 106.14.146.125
ngrok.wangzhaojin.top  --> 106.14.146.125

ngrok分为客户端和服务端, 服务端放到公网服务器上, 客户端放到自己的电脑上

1. 服务端操作(公网服务器)

1.1 安装环境
  1. 基础环境

    yum update
    yum install gcc -y
    yum install git -y
    
  2. 安装go语言, 不要使用yum安装, 使用源码或二进制包安装, 安装完成以后配置GOPATH, GPROOT什么的

1.2 ngrok安装
  1. 获取软件包

    git clone https://github.com/inconshreveable/ngrok.git
    
  2. 生成证书

    cd ngrok
    
    export NGROK_DOMAIN="ngrok.wangzhaojin.top"  #修改成自己的二级域名
    
    openssl genrsa -out rootCA.key 2048
    
    openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
    
    openssl genrsa -out device.key 2048
    
    openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
    
    openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
    
  3. 将新生成的证书替换,1. 执行下面命令后 “y” 回车 一行一行执行代码!

    cp rootCA.pem assets/client/tls/ngrokroot.crt
    
    cp device.crt assets/server/tls/snakeoil.crt
    
    cp device.key assets/server/tls/snakeoil.key
    
  4. 编译生成ngrokd

    make release-server
    
    报错1:没有go-bindata
    将GOPATH目录下的bin/go-bindata复制到ngrok/bin/下,若没有bin则mkdir
    如果GOPATH目录下也没有, 百度安装go-bindata
    不要使用yum或apt安装, 要用go get装
    
    还有什么deps乱七八糟的报错, 只会是一下三个原因
    1. go环境没配好
    2. 所下载的资源被墙
    3. 重新克隆软件包, 重新生成证书再编译
    
    生成的ngrokd文件则为服务端,所在位置可能在以下两处
    1. ngrok/bin/下
    2. GOPATH目录/bin/下
    取决于你有没有cp go-bindata文件, 若有, 则在1下
    
1.3 启动服务端
./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" \
-tlsCrt="assets/server/tls/snakeoil.crt" \
-domain="ngrok.wangzhaojin.top"  \
-httpAddr=":80" \
-httpsAddr=":8082" \
-tunnelAddr=":443"
命令过长, 手动换行的
参数介绍:
tlsCrt 证书位置
domain 你自己的二级域名
httpAddr 监听的公网http请求的端口
httpsAddr监听的公网https请求的端口
tunnelAddr 隧道的端口,即与客户端通信的端口

到这一步就能通过http://ngrok.wangzhaojin.top:80https://ngrok.wangzhaojin.top:443访问ngrok提供的转发服务了

如图所示显示 Tunnel ngrok.wangzhaojin.top not found则服务器启动成功

1.3.1 systemctl接管

由1.3启动的服务端无法后台运行, 且启动, 关闭. 重启不方便
由systemctl接管后可以通过以下命令管理
systemctl start ngrok 启动
systemctl stop ngrok 关闭
systemctl restart ngrok 重启
systemctl status ngrok 查看运行状态
注意路径

vi /etc/systemd/system/ngrok.service

[Unit]
Description=ngrok
After=network.target

[Service]
ExecStart=/root/ngrok/bin/ngrokd -tlsKey=/root/ngrok/assets/server/tls/snakeoil.key -tlsCrt=/root/ngrok/assets/server/tls/snakeoil.crt -domain=ngrok.wangzhaojin.top -httpAddr=:80 -httpsAddr=:8082 -tunnelAddr=:443

[Install]
WantedBy=multi-user.target
1.4 编译客户端
make release-client 
编译之后的文件位置同服务端一样, 文件名为ngrok

这一步看网上的教程需要设置客户端的参数, 不同系统编译成不同客户端
如下
win 平台 64 位系统:GOOS=windows GOARCH=amd64 make release-client
Linux 平台 32 位系统:GOOS=linux GOARCH=386 make release-client
Linux 平台 64 位系统:GOOS=linux GOARCH=amd64 make release-client
Windows 平台 32 位系统:GOOS=windows GOARCH=386 make release-client
Windows 平台 64 位系统:GOOS=windows GOARCH=amd64 make release-client
MAC 平台 32 位系统:GOOS=darwin GOARCH=386 make release-client
MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64 make release-client
ARM 平台:GOOS=linux GOARCH=arm make release-client

我的服务端和客户端都是linux_64平台, 这样编译之后:
   客户端在centos7上显示版本1.7,可以使用
   客户端在Ubuntu16.04上显示版本1.6,一直报证书错误, 很迷
所以我说直接make release-client, 不加前面的参数

2. 客户端操作(内网服务器)

2.1 将服务端生成的ngrok客户端, 放到内网服务器上

客户端软件放上去之后可能没有执行权限

[root@wzj ~]# ll
-rw-r--r--  1 root root 10779349 7月  17 14:08 ngrok
[root@wzj ~]# chmod 777 ngrok
[root@wzj ~]# ll
-rwxrwxrwx  1 root root 10779349 7月  17 14:08 ngrok

执行chmod 777 ngrok即可

2.2 在同级目录下新建一个配置文件
vi ngrok.cfg

server_addr: "ngrok.wangzhaojin.top:443"
trust_host_root_certs: false

注意: 
  1.域名换成自己的
  2.这里的server_addr前面的域名与生成ssl证书以及启动服务端指定的domain一致
  3.server_addr后面的端口与启动服务端时的指定的tunnelAddr一致
2.3 启动客户端
ngrok -config=ngrok.cfg -subdomain=v1 80

参数介绍:
subdomain为子域名的前缀,例如我们之前一直用的是ngrok.wangzhaojin.top
    这样项目启动后地址就为v1.ngrok.wangzhaojin.top
80: 本地项目启动的端口

可能会报一下错误
[root@wzj ~]# ngrok -config=ngrok.cfg -subdomain=v1 80
-bash: /usr/bin/ngrok: 没有那个文件或目录

解决:
[root@wzj ~]# ln ngrok /usr/bin/
2.3.1 systemctl接管
vi /etc/systemd/system/ngrok.service

[Unit]
Description=ngrok
After=network.target

[Service]
ExecStart=/root/ngrok -subdomain=zs 5000

[Install]
WantedBy=multi-user.target

启动成功以后会显示status online如下图

此时就可以在浏览器通过http://v1.ngrok.wangzhaojin.top来访问内网的项目了如下图

这里是因为我本地没有跑在80端口的项目, 如果启动了nginx就会有welcome to nginx 如图

好吧, 我的nginx还没配好, 懒得配了, 反正ngrok是能用了

结语

搭了很久才搭出来, 图中各种报错, 最后把软件源码全部删了, 最后有clone一次就莫名其妙的好了

发现是编译的时候加了那个GOOS和GOARCH, 搭好之后有个惊为天人的发现, 原来ssh隧道一行命令就搞定了

原来一行命令就能搞定

远程服务器(公网服务器)修改ssh配置文件
修改一下配置文件

vim /etc/ssh/sshd_config
添加一行
GatewayPorts yes
重启sshd服务
systemctl restart sshd

在本机(内网服务器)执行如下命令


ssh -f -N -R 10003:localhost:80 root@106.14.146.125
解释:
  将公网的106.14.146.125:10003端口请求转发到本机的80端口

因为ssh会经常自动断开连接, 所以我将密码作为命令的参数
将命令写入脚本, 定时执行

wzj@wzj-dev:/home/ubuntu$ cat autocontent.sh 
sshpass -p [password]  ssh -f -N -R 10003:localhost:80 root@106.14.146.125

3. 补充socket映射

3.1 配置

vi /root/.ngrok

server_addr: ngrok.wangzhaojin.top:443
trust_host_root_certs: false
tunnels:
    vnc:
        remote_port: 4900
        proto:
            tcp: 4900

3.2 启动

/root/ngrok start vnc

image.png

3.3 systemctl 接管

vi /etc/systemd/system/ngrok.service

[Unit]
Description=ngrok
After=network.target

[Service]
ExecStart=/root/ngrok start vnc

[Install]
WantedBy=multi-user.target
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容