内网穿透+反向代理实现外网访问内网网页服务

内网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

 

config  [kənˈfɪɡ]  详细X
基本翻译
n. 配置,布局;显示配置信息命令
网络释义
Config: 配置
Proxy auto-config: 代理自动配置
config-register: 定义设置寄存器
posted @ 2022-10-16 20:00  evtricks  阅读(3117)  评论(0编辑  收藏  举报