国内很多主机都只分配一个IPV4 IP,哪怕是国外的主机一般也就给 5 个IP,而内网服务较多时则会出现很不方便的情况。
一般的博客上面讲的都是用个脚本,使用 iptables 来转发端口到内网,这样做大部分情况下没有问题,但是在内网机通过母机端口访问内网服务时会出现问题,无法连接,造成部分服务无法使用。
最近突发奇想找到一种最好的方式来解决:使用 NGINX 代理来访问内网服务。
我选择的是在母机上安装 nginx-proxy-manager 来代理内网服务,应该是全网首发采用这种方式的。
1. 优势
- 图形化 web 界面配置。
- Docker 管理,不污染主机。
- 解决了 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
- 新建一个Streams 转发
- 端口 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 能尽快改进。
Comments powered by Disqus.