今天遇到一个网友的问题:
1.电脑A处于内网无外网,提供web服务(http://192.168.1.150),无权限。
2.电脑B处于内网可连接外网,有权限。
3.电脑C处于外网有公网固定IP。
需要在外网访问电脑A的web服务(后来实际情况为A提供两个不同的web服务)。
当时我的第一个想法是ngrok映射。后来看A没有权限又考虑在B上用nginx做反向代理把B的80端口反向到http://192.168.1.150,然后再用ngrok映射B的80端口到外网。
只是一个想法,苦于没做过估计跟网友介绍的也不详细,于是开始了自己的试验之路
模拟问题的环境:
电脑A:192.168.1.150 提供内网HFS的文件服务(基于web下载扫描文件的服务)
电脑B:树莓派处于内网,然后安装nginx、编译ngrok。
电脑C:处于公网,运行ngrok服务端。
简单的介绍下各个配置:
电脑A无权限不做配置,保证web服务正常访问。
电脑C的ngrok服务端
运行命令:
ngrokd -domain="http://n.example.com" -httpAddr=":8080" -httpsAddr=":8081"
其中8080和8081分别为对外转发用的端口,如果你的服务器没有使用80端口可以用80端口提供服务,我的例子里因为电脑C运行着其他服务就改用8080端口了。

正常会出现上图的文字。
电脑B的nginx:(/etc/nginx/sites-available/default)
server {
listen 80;
listen [::]:80;
location / {
proxy_pass http://192.168.1.150;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
电脑B的ngrok:
/home/pi/ngrok/ngrok.cfg
server_addr: "电脑C绑定的域名(我的实例:http://n.example.com):4443"
trust_host_root_certs: false
运行命令:
pi@raspberrypi:~/ngrok $ ./ngrok -subdomain hfs -config=ngrok.cfg 80
其中hfs为子域名 80为本地需要转发的端口,4443为ngrok默认提供服务的端口。

出现类似上面的 online 就为成功映射。
现在外网访问http://nfs.n.example.com:8080即可打开内网的nfs服务。
扩展一下:如果内网有多个web服务,可以配置电脑B的nginx按照域名配置多个server。同时后台对应域名开启多个ngrok客户端即可。(据说ngrok可以转发到本地局域网的其他机器我试验未成功)

