内网穿透+反向代理实现外网访问内网网页服务
内网ip
首先要知道的是,公网ip是有限的,很多电脑是依托于某一个运营商提供的公网ip下的内网获取的上网服务,内网ip共有
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255
三个网段分别属于A、B、C三类IP地址,来自 《RFC 1918》。
除了以上的ip,都是公网ip,世界唯一的,任何网络访问的请求都是通过这个ip找到你的。如果要通过网址找到你,就需要DNS解析,这就是另说的了。
而内网ip实际上在不同的局域网里都是相同的,可能我也是192.168.0.2,你在你自己的局域网也是这个内网ip。这就导致如果只提供一个内网ip,你就必须要在这个提供网页服务的服务器相同的局域网中,才能够通过内网ip访问到。
如果我不在这个局域网中,又想访问局域网中的某台机器呢?就需要内网穿透了。
内网穿透
内网穿透有几种形式,如果你能在公司路由器上给你的电脑开个端口映射,让访问公网ip某个端口的直接转发到你电脑上的端口,那你牛,这也是最直接的方法
比如花生壳之类的就是做这个事的。如果能够修改路由的端口映射,我可以直接让外网的请求转发到内网对应的网页服务器上去,这样内网的网页服务也就对公网开放了。
但很多情况下我们并不是管理员,只是有内网中的一个可以访问内网服务的电脑,没有权限去修改公司的路由器,这时候就别想着端口映射去连接内网的电脑了。
可以使用natapp.cn这样的内网穿透服务提供商来访问内网中的员工电脑,使用免费的就行,尽管有速度限制,隔一段时间还会更换映射网址。
使用的方法见教程即可https://natapp.cn/article/natapp_newbie
需要注意的是在natapp.cn登陆修改为本地开放了网页服务的端口,比如tomcat的8080。
反向代理
那如果公司有个网页服务只能内网访问,我想要访问的网页服务在一个公司电脑上,但是我不是管理员无法登陆这个公司电脑,我只有个在公司局域网的普通电脑,在我出差时要怎么访问公司内网的网页服务呢?这时候就需要反向代理了,就像以下图的形式
我们要访问的网页服务器在内网,而我们有的只是内网的一个跳板机,而这种代理服务器在局域网的形式,称之为反向代理。
我们需要做的就是用natapp.cn使得你在外网通过访问xxx.natappfree.cc可以访问你在公司局域网中的一台电脑的某个端口,我们以8000为例(记得在natapp.cn修改端口)。虽然我们能够访问内网电脑了,但是对应的端口还没有网页服务,普通的方法是
以管理员身份打开命令行(cmd)输入并回车
netsh interface portproxy add v4tov4 listenport=8000 connectport=8000 connectaddress=10.xx.xx.xx(内网ip)
这是将内网电脑本地的8000端口映射到内网服务器的8000(服务器提供网页服务的端口)
输入并回车以查看端口状态
netsh interface portproxy show all
会显示
侦听 ipv4: 连接到 ipv4: 地址 端口 地址 端口 --------------- ---------- --------------- ---------- * 8000 10.xx.xx.xx 8000
启动natapp.exe查看Forwarding后面的网址,比如以下的样子
http://53fxxxx.natappfree.cc -> 127.0.0.1:8000
这时候通过外网访问http://53fxxxx.natappfree.cc应该就能通过内网的电脑转到内网服务器的8000端口了。
我用ip.cn解析了学校官网的ip,然后把本地的8000映射到学校官网ip的80(http)端口,就可以通过http://53fxxxx.natappfree.cc访问学校官网。
但当我尝试在一个内网电脑上尝试这一套时,会提示类似下面这样的端口尚未提供web服务,我推测是因为内网服务器对端口进行了限制。
Nginx反向代理
这时候可以使用nginx进行反向代理,使用的教程也比较多,主要讲一下要点,下载后解压,在conf文件夹找到nginx.conf文件,编辑其中的内容如下
server { listen 8000; server_name localhost; location / { proxy_pass http://10.xx.xx.xx:8000; } location /config-server { proxy_pass http://10.xx.xx.xx:9000; } ...(其他地方不用改) }
其中location后面单一个/表示单独访问这个端口会指定到哪个网址的哪个端口,关于nginx更多的代理设置可以参考nginx location正则匹配规则https://blog.csdn.net/u011999671/article/details/108055809
/config-server后面指定了一个不同的端口,这是因为8000端口提供的网页服务有一些资源是写死了内网访问地址的,比如http://10.xx.xx.xx:9000/config-server的,我们在外网访问时这个地址是找不到该指向哪里的,所以在外网我们需要给浏览器加个请求转发,把这样的网址转回内网的电脑http://53fxxxx.natappfree.cc去,直接转过去的话肯定是被解析到8000端口了,所以需要在nginx的配置文件中写清楚,如果是访问这些字段开头的页面的话,重定向到对应的端口去,这称之为多域名代理,即指向内网电脑的请求被分发到了不同的内网服务器端口(或其他地方)。
推荐的浏览器请求转发的方法为https://github.com/yize/xswitch,下载压缩包,解压后把文件夹拖进chrome的插件管理页面就可以安装,安装后点击插件设置替换目标
{ "proxy": [ [ "//10.xx.xx.xx:9000", "//rafxxx.natappfree.cc" ], [ "//10.xx.xx.xx:8000", "//rafxxx.natappfree.cc" ], }
使用这样的方法,我们就把外网的指向内网ip的请求转成了指向内网电脑对应的内网穿透网址的请求,内网电脑接到这些请求之后根据nginx定义的规则,把不同的请求转发到内网服务器不同的端口去,这样就能够愉快的访问内网资源了。
自动脚本
把这些集合起来,我们把natapp.exe和含有token的config文件放到nginx的文件夹里,创建一个批处理文件start.bat,之后只需要点击这个文件就可以启动内网穿透+反向代理了,cmd是为了避免窗口关掉
start nginx
natapp.exe
cmd
再建一个stop.bat文件,可以点击关闭nginx
nginx -s quit
cmd
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步