您的位置:

NGINX 内网穿透

随着技术的发展,内网穿透已经越来越成为了一种非常重要的技术,在很多场合下需要访问内网或者局域网,例如,远程控制、远程办公、家庭IP访问等等。在这个过程中,NGINX 内网穿透是其中非常重要的一种技术。

一、内网穿透的概念

内网穿透是通过外部网络与内部网络之间的安全隧道,将本地服务暴露给公网访问或通过公网访问内网资源的一种技术。开发人员通过内网穿透能够轻易地把本地开发环境或者局域网上的资源对外开放,方便外界进行访问。

在技术细节上,内网穿透需要解决两个问题,其一是如何将公网请求转发到内网,其二是如何解决内网服务的 IP 不具备公网访问能力。

二、NGINX 内网穿透的实现

从技术实现上,NGINX 的内网穿透主要是通过两个模块来进行实现的:

1. upstream 模块

upstream 模块可以将后端服务初始化为一个群组,它可以代表多个服务器。这个功能使得NGINX可以将请求自动转发到可用服务器上。

upstream my_backend {
  server backend1.example.com:8080;
  server backend2.example.com:8080;
  server backend3.example.com:8080;
}

2. stream 模块

stream 模块可以通过 TCP、UDP 或者 SSL/TLS 协议来代理连接。当我们需要穿透时,它能够帮助我们将请求发送到内网指定端口并进行转发。

stream {
  upstream my_backend {
    hash $remote_addr consistent;
    server backend1.example.com:443;
    server backend2.example.com:443;
  }
  server {
    listen 8443;
    proxy_pass my_backend;
  }
}

三、NGINX 内网穿透的应用实例

1. 将内网服务部署到公网

我们可以通过后端的 upsteam 模块,将内网服务器的端口绑定到外网的端口上,实现内网服务器访问公网的能力:

upstream local_backend {
  server 127.0.0.1:8080;
}

server {
  listen 80;
  location / {
    proxy_pass http://local_backend;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Nginx-Proxy true;
  }
}

2. 内网穿透 Websocket 服务

Websocket 是一种前端通信协议,它能够与服务器进行实时的数据通信。我们可以通过 stream 模块将 websocket 服务部署到公网,并将 websocket 服务的请求进行转发。

stream {
  upstream websocket {
    hash $remote_addr consistent;
    server backend:8080;
  }
  
  server {
    listen 443;
    proxy_pass websocket;
  }
}

server {
  listen 8080;
  root /var/www/html;
  index index.html;
}

3. 内网穿透 SSH 服务

SSH 是一种远程登录协议,它能够在不同的设备之间进行加密的远程登录。我们可以通过 stream 模块将内网服务器的 SSH 服务穿透到公网,并进行转发。

stream {
  upstream ssh {
    hash $remote_addr consistent;
    server backend:22;
  }

  server {
    listen 2222;
    proxy_pass ssh;
  }
}

四、总结

NGINX 的内网穿透技术已经被广泛应用于不同的场合,可以帮助我们将内网服务器暴露出来,方便外部的访问。在实现上,upstream 和 stream 模块都是非常重要的技术点,它们可以帮助我们更加方便地进行 NGINX 内网穿透的实现。