Docker项目——内网穿透,FRP+NPM+VPS
Docker项目——内网穿透,FRP+NPM+VPS
大家好,欢迎来到老码牛频道。
随着生活水平的提高,我们每个人拥有了越来越多的电脑和数码设备,如台式机、笔记本电脑、NAS、各种Android盒子以及托管的服务器等等。这些设备提供了各种各样的服务,例如SSH连接、Web服务、远程桌面、以及不同类型的数据库服务,如MySql和SqlServer等等。
有没有一种解决方案可以将所有这些设备通过网络连接起来,组织成一个虚拟的局域网,并且非常方便地使用域名访问每个设备提供的服务呢?答案是肯定的。今天,我们将使用FRP、NPM和VPS来实现内网穿透,并通过域名来访问这些服务。
系统简图
首先,我们看一下要搭建的系统简单图示。
从左而右,我们可以看到:
- 用户通过DNS将域名解析到Nginx Proxy Manager所部署的主机的公网IP;
- Nginx Proxy Manager按照配置的规则,反向代理对应的服务。包括Frp中暴露和中转的服务;
- Frp专注于内网穿透,支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并安全、便捷地将内网服务暴露到公网;
搭建此系统的条件如下:
- 具有公网IP主机,我们推荐并演示的是Linux主机。
- 一个域名,并解析指向到以上主机的IP地址。
接下来,我们就开始搭建这套系统吧。
服务器基本配置,安装Docker
我们的演示服务器是一台香港的Debian服务器,配置是1核1G,公网IP是154.91.177.93。
首先,我们通过SSH登录到服务器。
由于此服务器系统的软件源配置有问题,我们将恢复到官方源。
将sources.list文件修改为以下内容
mv /etc/apt/sources.list /etc/apt/sources.list.old
cat > /etc/apt/sources.list << EOF
deb http://deb.debian.org/debian/ bullseye main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye main contrib non-free
deb http://deb.debian.org/debian/ bullseye-updates main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye-updates main contrib non-free
deb http://deb.debian.org/debian/ bullseye-backports main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye-backports main contrib non-free
deb http://deb.debian.org/debian-security/ bullseye-security main contrib non-free
deb-src http://deb.debian.org/debian-security/ bullseye-security main contrib non-free
EOF
然后更新系统。
apt update -y
使用LinuxMirrors提供的Docker安装脚本,拷贝粘贴。
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
回车运行。选择y,安装最新的版本; 因为是香港的服务器,所以选官方1; 选择香港的注册源,17;
等待安装完成,安装完成。
Frp服务器端搭建、配置
下面,我们来安装Frp服务器端。
创建服务器端目录,转到此目录。
mkdir /www/dk_project/frps
cd /www/dk_project/frps
新建docker-compose.yml文件,输入vi docker-compose.yml。
vi docker-compose.yml
拷贝yaml内容,粘贴;保存文件。
version: '3.3'
services:
frps:
container_name: frps # 容器名称
image: snowdreamtech/frps # 容器映像
restart: always # 永远重启
network_mode: host # 网络:主机模式
volumes:
- './frps.toml:/etc/frp/frps.toml' # 配置文件
新建frps.toml文件,输入vi frps.toml。
vi frps.toml
粘贴frps.toml内容。
此文件配置了服务器端口值,以及Token的字符串值,请保存这些值以供它处使用。
bindPort = 93 # 绑定端口
auth.token = "MyToken123456"
运行Frp服务器端容器
docker compose up -d
等待拉取镜像,拉取镜像完成,容器运行成功
注意:
请在服务器的防火墙,又或者安全组中放行相关的端口,以便配置起效。
Frp客户端搭建、配置
下面,我们来搭建Frp客户端。如下表:
Frpc | 服务 | URL地址 | Frps端口 | 域名 |
NAS | SSH | 127.0.0.1:223 | 94 | |
管理网站 | 127.0.0.1:50603 | 95 | nas | |
Ali99 | Wordpress | 172.0.17.1:8080 | 96 | wordpress |
PHPMyAdmin | 172.0.17.1:88 | 97 | myadmin |
可以看到,我们打算搭建两个客户端。
一个客户端是我家里的群晖的NAS。我想在公网通过IP和端口来连接到SSH,运行终端命令;通过域名登录到管理站点,方便地管理整个NAS。
另一个是阿里99元服务器,2核2G。由于没有做备案,所以80和443端口是锁住的,一般的Nginx的反向代理也反代不了。我想通过内网穿透将Wordpress网站和MySq管理站点映射到香港服务器,不需要备案,也可以善用服务器资源。
NAS
我们先处理我的NAS,先通过SSH登录,输入密码。
ssh 192.168.2.233 -p 223
切换到root用户,输入密码。
sudo -i
创建Frpc目录,并转到此目录。
mkdir -p /root/dk/frpc
cd /root/dk/frpc
新建docker-compose.yml文件,输入vi docker-compose.yml。
vi docker-compose.yml
拷贝yaml内容,粘贴;保存文件
version: '3.3'
services:
frps:
container_name: frpc # 容器名称
image: snowdreamtech/frpc # 容器映像
restart: always # 永远重启
network_mode: host # 网络:主机模式
volumes:
- './frpc.toml:/etc/frp/frpc.toml' # 配置文件
新建frpc.toml文件,输入vi frpc.toml。
vi frpc.toml
粘贴frpc.toml内容。其中,
serverAddr填入服务器的IP;serverPort填入服务器的端口;token输入与服务器同样的字符;
余下就是两个服务的定义:
一个是SSH和NAS服务。请按照实际情况填写,在保存。
# frpc.toml
serverAddr = "154.91.177.93" # 服务器IP
serverPort = 93 # 服务器端口
auth.token = "MyToken123456" # Token
[[proxies]]
name = "ssh" # 服务名称
type = "tcp" # 服务类型
localIP = "127.0.0.1" # 本地IP
localPort = 223 # 本地端口
remotePort = 94 # 远程端口
[[proxies]]
name = "nas" # 服务名称
type = "tcp" # 服务类型
localIP = "127.0.0.1" # 本地IP
localPort = 50603 # 本地端口
remotePort = 95 # 远程端口
运行Frp客户端容器
docker-compose up -d
等待拉取镜像,拉取镜像完成,容器运行成功
阿里99元
下面我们搭建阿里99服务器,先登录。
此服务器是一个Ubuntu的Linux服务器,已经安装了版本24.0.5的Docker。
创建Frpc目录,并转到此目录。
mkdir -p /www/dk_project/frpc
cd /www/dk_project/frpc
新建docker-compose.yml文件,输入vi docker-compose.yml。
vi docker-compose.yml
粘贴文件内容,保存文件
version: '3.3'
services:
frps:
container_name: frpc # 容器名称
image: snowdreamtech/frpc # 容器映像
restart: always # 永远重启
network_mode: host # 网络:主机模式
volumes:
- './frpc.toml:/etc/frp/frpc.toml' # 配置文件
新建frpc.toml文件,输入vi frpc.toml。
vi frpc.toml
粘贴frpc.toml内容。和NAS一样,
serverAddr填入服务器的IP;serverPort填入服务器的端口;token输入与服务器同样的字符;
接下来就是Wordpress和MySql管理服务。
# frpc.toml
serverAddr = "154.91.177.93" # 服务器IP
serverPort = 93 # 服务器端口
auth.token = "MyToken123456" # Token
[[proxies]]
name = "wordpress" # 服务名称
type = "tcp" # 服务类型
localIP = "172.17.0.1" # 本地IP
localPort = 8080 # 本地端口
remotePort = 96 # 远程端口
[[proxies]]
name = "phpmyadmin" # 服务名称
type = "tcp" # 服务类型
localIP = "172.17.0.1" # 本地IP
localPort = 88 # 本地端口
remotePort = 97 # 远程端口
运行Frp客户端容器
docker-compose up -d
等待拉取镜像,拉取镜像完成,容器运行成功
到此,我们已经通过Frp的将以上的服务暴露到公网供访问。只不过使用IP地址以及端口就可以访问了,例如:NAS的SSH就可以直接连接了。为了更加优雅地,通过域名来访问,我们需要搭建Nginx Proxy Manager。
Nginx Proxy Manager搭建、配置
下面我们来搭建Nginx Proxy Manager,回到香港服务器,登录。
创建NPM目录,并转到此目录。
mkdir -p /www/dk_project/npm
cd /www/dk_project/npm
新建docker-compose.yml文件,输入vi docker-compose.yml。
vi docker-compose.yml
粘贴NPM配置文件内容。
请注意,为了方便,我们使用的是汉化的映像,你可以自行修改为官方的映像。
请确保防火墙,或者安全组放行80、81、443等端口。
version: '3.8'
services:
npm:
#image: 'jc21/nginx-proxy-manager:latest' # 官方
image: 'chishin/nginx-proxy-manager-zh:latest' # 汉化
restart: unless-stopped
container_name: 'npm'
network_mode: bridge
ports: # 请确定放行以下端口
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
运行Nginx Proxy Manager容器
docker compose up -d
下面我们可以通过154.91.177.93端口81来访问Nginx Proxy Manager管理网站。
输入默认用户,admin@example.com,密码changeme来登录。
第一次登录,会要求更改登录信息、密码。
我们这里修改为ln,Email:ln@zlmix.com
密码11111111,保存
注意:我们必须将绑定的域名zlyum.com指向到154.91.177.93
npm.zlyum.com
下面我们继续配置,先把npm.zlyum.com,反向代理到NPM的站点。
点击仪表盘页面,点击代理服务
新建一个代理服务。
转发主机/IP输入172.17.0.1,就是docker默认绑定的IP
转发端口输入81,就是NPM容器运行的暴露的管理端口
点击SSL。选择请求一个新的SSL证书,开启强制SSL,输入电子邮箱点击同意,保存。
现在我们就可以通过npm.zlyum.com这个域名来访问Nginx Proxy Manager。
新建一个标签,访问npm.zlyum.com,登录。下一步,我们反向代理配置余下的服务。
点击仪表盘页面,点击代理服务。
新建一个代理服务。
转发主机/IP输入172.17.0.1。
转发端口输入95,就是NAS服务内网穿透映射的端口
点击SSL。选择请求一个新的SSL证书,开启强制SSL,输入电子邮箱点击同意,保存。
wordpress.zlyum.com
再新建一个代理服务。
转发主机/IP输入172.17.0.1。
转发端口输入96,就是NAS服务内网穿透映射的端口
点击SSL。选择请求一个新的SSL证书,开启强制SSL,输入电子邮箱点击同意,保存。
再新建一个代理服务。
转发主机/IP输入172.17.0.1。
转发端口输入97,就是myadmin服务内网穿透映射的端口
点击SSL。选择请求一个新的SSL证书,开启强制SSL,输入电子邮箱点击同意,保存。
验证效果
可以直接点击上图的链接验证访问效果。