美文网首页nginxNetwork & More mq
如何利用nginx从外网访问内网的站点

如何利用nginx从外网访问内网的站点

作者: 一只神奇的小绵羊 | 来源:发表于2018-09-20 16:57 被阅读0次

现在很多公司都是区分内外网的,而从外网是无法直接访问内网部署的站点与API的,当一个部署在内网的站点(比如官网)需要向外部开放的时候就需要利用Nginx来进行代理转发。

以一个vue+springboot项目为例

【注】:本文假定前端以IP的形式访问后端api,例如:172.16.2.2:8081/a/b

外网(云)服务器IP:114.251.x.x

站点域名:a.aaa.com.cn(当前映射到172.16.2.1)
内网前端服务器IP:172.16.2.1
内网后端服务器IP:172.16.2.2

该项目的前后端都是部署在内网的,所以在内网直接访问不会有问题,而从外网访问当然也就访问不到。

步骤一:将域名在DNS上的IP映射由内网IP改为外网服务器IP,然后配置Nginx

a.aaa.com.cn 在DNS上的映射由内网IP(172.16.2.1)更改为外网服务器的IP(114.251.x.x),这样外网客户对 a.aaa.com.cn 的访问请求会被映射到 114.251.x.x 的80端口(域名映射到IP而不是端口,http默认访问80端口),而该服务器上的nginx会将打到80端口上的请求转发(配置监听转发即可)到内网前端服务器约定好的端口,比如 172.16.2.1:8080 ,这种方式可以通过80端口这一个外网端口用nginx把外网流量打到多个端口。

如果内网前端服务器上vue部署的tomcat/nginx监听的是8080端口,那这时已经可以通过域名访问到页面并看到页面的静态内容了。

但是请注意,当前是无法在前端直接以IP的形式(172.16.2.2:8081/a/b)调用api的,因为提供api的后端服务器是内网服务器,而此时在前端向后端发起的请求的host是a.aaa.com.cn(解析到外网IP),也就无法访问到后端服务器。

步骤二:更改vue中api请求形式,然后配置nginx

这一步的根本目的是改变请求的host。

假定原先vue中某个api的请求方式是 172.16.2.2:8081/a/b ,现在把它替换为 a.aaa.com.cn/a/b

const ipAddr = '172.16.2.2', domainAddr = 'a.aaa.com.cn';
export var demo = `${ipAddr}:8081/a/b`  ===>  export var demo = `${domainAddr}/a/b`

用这种域名的形式替换掉ip形式,把前端发出的请求打到前端172.16.2.1上唯一的公网端口,然后配置nginx,将路径为 /a/b 的请求转发到 172.16.2.2:8081/a/b 。这样,请求的host就从172.16.2.1变成了a.aaa.com.cn,这也就避免了内外网不通或是跨域的问题。

所以,整个过程的公网数据流向是:

外网域名 -> 外网服务器:80 -> 内网前端:8080(前端显示) -> (发出请求) -> 外网域名 -> 外网服务器:80 -> 内网前端:8080 -> nginx分发 -> 内网后端

(图片下面还有一种方案,也可以看一下)

数据流向

补充另外一种类似的思路(未验证):

这种方案的根本目的也是通过代理的方式更改host

基于webpack的vue自带代理,可以直接用,就不需要额外配置代理了,否则用node.js写一个简单的express也可以。webpack的代理配置在/config/index.js中,示例配置如下:

assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
  '/a': {
      target: 'http://172.16.2.2:8081',//目标接口地址
      changeOrigin: true,//是否跨域
      pathRewrite: {
      '/a': '/a'//重写接口
        }
      }
}

这种方案理论上是可行的,而且更简单一些。然而手里暂时没有可以做验证的资源,后续验证了再来更新吧。

相关文章

  • 如何利用nginx从外网访问内网的站点

    现在很多公司都是区分内外网的,而从外网是无法直接访问内网部署的站点与API的,当一个部署在内网的站点(比如官网)需...

  • iptables简单配置DMZ

    要求 内网可以访问外网 内网可以访问DMZ区 外网不能访问内网 外网能访问DMZ区的服务 DMZ区不能访问内网 D...

  • 搭建ssh反向隧道

    实现外网利用ssh反向隧道访问内网主机 准备 实现内网穿透都需要一台外网主机,而且是可以访问的 内网主机A IP:...

  • mac电脑内外网同时上网

    本教程通过网线访问内网,wifi访问外网,达到mac同时内外网上网的目的;网线访问外网,wifi访问内网亦可,原理...

  • centos7安装http代理tinyproxy

    简介 内网访问不了外网,通过pc做代理,令内网机器访问外网。 安装 no package available?那就...

  • SSH端口转发实现内网穿透

    我们局域网的机器能够访问外网,但是外网不能访问内网。因为内网访问互联网时候能确定外网的地址,外网却不能确定我们局域...

  • iMac如何使用frp穿透内网

    有时需要把内网部署的站点映射到外网,让其别人也能访问到,例如做微信相关开发时需要把内网映射到外网,让微信服务器能访...

  • 如何解决外网访问内网共享文件?

    外网如何访问内网服务器?当一台内网主机使用私有地址时,比如192.168.0.100,外部网络是无法直接访问内网中...

  • 想要做沉迷于工作的员工,你可能需要这样

    背景:笔者所在公司内外网是隔离的,在内网中的主机通过http代理访问外网,外网如果想要访问内网需要使用VPN,但是...

  • 公司内Mac内外网同时访问

    利用shell脚本来实现, 用到route命令 如果你的公司也跟我一样网线可以访问内网, WIFI可以访问外网, ...

网友评论

    本文标题:如何利用nginx从外网访问内网的站点

    本文链接:https://www.haomeiwen.com/subject/iklnnftx.html