首页 PVE 单公网 IP 访问内网服务最优解
文章
取消

PVE 单公网 IP 访问内网服务最优解

国内很多主机都只分配一个IPV4 IP,哪怕是国外的主机一般也就给 5 个IP,而内网服务较多时则会出现很不方便的情况。

一般的博客上面讲的都是用个脚本,使用 iptables 来转发端口到内网,这样做大部分情况下没有问题,但是在内网机通过母机端口访问内网服务时会出现问题,无法连接,造成部分服务无法使用。

最近突发奇想找到一种最好的方式来解决:使用 NGINX 代理来访问内网服务。

我选择的是在母机上安装 nginx-proxy-manager 来代理内网服务,应该是全网首发采用这种方式的。

1. 优势

  1. 图形化 web 界面配置。
  2. Docker 管理,不污染主机。
  3. 解决了 iptables 转发时内网机通过母机端口访问内网服务时会出现问题。

2. 具体做法

2.1. 母机上安装 docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

2.2. 安装docker-compose

1
 wget  https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-linux-x86_64 -O /usr/local/bin/docker-compose && chmod a+x /usr/local/bin/docker-compose

2.3. 安装 nginx-proxy-manager

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      # These ports are in format <host-port>:<container-port>
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '8007:81' # Admin Web Port
      - '10000-10200:10000-10200'
      # Add any other Stream port you want to expose
      - '21:21' # FTP

    # Uncomment the next line if you uncomment anything in the section
    # environment:
      # Uncomment this if you want to change the location of
      # the SQLite DB file within the container
      # DB_SQLITE_FILE: "/data/database.sqlite"

      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'

    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

安装后的初始账号密码是:

1
2
Email:    [email protected]
Password: changeme

2.4. 配置 nginx-proxy-manager

  1. 新建一个Streams 转发
  2. 端口 Incoming Port 填写 docker 的端口,根据前面 docker-compose.yml 的映射端口来进行,比如我前面配置中的,要转发公网 IP 的 8007 端口,那么这里的Incoming Port 端口应该是 81. 如果你docker-compose.yml 中公网端口和docker 端口是一样的,那更加方便。

2.5. 小技巧

如果你跟我一样,希望 web 端口 80,443 端口不通过 nginx-proxy-manager 管理,而是直接映射到内网的web服务器上。可以直接更改docker-compose.yml中 80 和 443 端口为:

1
2
      - '80:8080' # Public HTTP Port
      - '443:4430' # Public HTTPS Port

这样你就可以在 nginx-proxy-manager 中的 Streams 中将 8080 和 4430 转发到内网的 web 服务器上。 这样访问母机的 80 和 443 端口就会直接都到内网的 web 服务器上了,跳过 nginx-proxy-manager 的分域名代理网站。避免每增加或者修改一个网站都需要在 nginx-proxy-manager 和 web 服务器上修改。 这样映射后只需要修改 web 服务器就好了。

3. 不足

nginx-proxy-manager 设置 Streams 代理时不可以设置端口范围,这样有点麻烦,比如要代理一个内网的 FTP 服务器,得建立好多个端口,希望 nginx-proxy-manager 能尽快改进。

4. 资源地址

Nginx Proxy Manager

本文由作者按照 CC BY-NC-SA 4.0 进行授权
热门标签
文章内容

记一次停电事故造成的服务器故障

-

Comments powered by Disqus.

热门标签