使用nginx和路由器进行内网免端口进行应用访问

2022-10-05 19:52:41 68点赞 862收藏 34评论

我家里一个软路由,一个unraid 和一个威联通,家里的设备倒是没增加了,但是网络应用在不断增加。
每增加一个应用肯定需要一个端口,有些还必须要有一个IP。
ip 加端口本身是很难进行记忆,对一些访问频次比较高的应用还好,能够记得住,但是对于一些不常用的应用,访问的时候就需要先打开控制台,我这里是unraid ,找到安装的位置,在找配置,然后在拼一个访问地址进行访问。整个过程很繁琐,会直接导致应用的使用效率打折扣。

部分设备部分设备

下图是我unraid 中的应用

部分应用部分应用

还有在不同机器的威联通,黑群,两个软路由以及一些开发服务,如git、rabbitmq等应用。

以我目前的知识范围,有两种方式可以解决这个问题,一个是搭建导航页,一个是自定义访问域名。

作为一个成年人,并且为了提高文章的质量,我选择都要。

自定义域名

首先是自定义一个域名

这个域名可以是域名服务商托管的,也可以自己定的。域名服务商托管的好处就是可以在外网访问时也可以直接通过域名进行访问。当然,对于自定义的内容就只能自己家里网络访问。
这里我们假设你的一级域名为 abc.com

首先我们有一个路由器,可以是软路由也可以是硬路由,但都必须要有一个自定义host 的功能,或者说能够进行dns 拦截的能力。
我使用的是爱快,设置起来要稍微复杂一些,在dns 设置中按照图中的设置即可,当然,首选DNS和备选DNS按照自己的喜好填就是,剩下的就是必须开启DSN代理,然后自己电脑的DNS 需要指定为网关的地址,我这里是爱快的地址。

爱快的设置爱快的设置

对于其他的路由器,往往都有自定义host 或者自定义挟持域名的功能。

openwrt 的设置openwrt 的设置

需要注意的是,如果有旁路由,需要同时在主路由以及旁路由进行自定义域名的配置。

接下来我们进行第一个域名访问的配置,这里我们以jellyfin 的配置举例
首先在自定义域名的位置新增一项,域名填写video.abc.com,备注为jellyfin 。最重要的是ip ,ip 地址需要填写一个具有nginx的服务器地址,具体的用途下文讲解。

添加一条记录添加一条记录

需要注意的是,对于端口固定为80的应用,如unraid控制台,爱快控制台等,此处的ip 可以直接填写为所在的ip ,可以直接实现自定义域名访问。
我这里是把所有的的域名全部执行了同一个ip 地址,为以后做自定义dns 做准备。

安装nginx服务

首先创建一个linux的虚拟机,我这里使用的unraid ,安装的ubuntu20,具体的安装方式不展开介绍,安装配置如图所示:

虚拟机配置虚拟机配置

其他使用默认即可。
安装完成之后,我们登录到虚拟机,创建nginx 的配置文件
第一步:创建配置文件夹,执行以下命令

mkdir -p ~/docker/nginx/conf.d

第二步:创建配置文件nginx.conf,执行以下命令
注意,以下命令为单条命了,全部复制后,一次执行。

tee ~/docker/nginx/nginx.conf <<-'EOF'user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

worker_rlimit_nofile 65535;

events {
worker_connections 10240;
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on; #tcp_nopush on;

keepalive_timeout 300s;
client_header_buffer_size 8192k;
large_client_header_buffers 4 8192k;

gzip on;
client_max_body_size 5000m;
map $http_upgrade $connection_upgrade {
default upgrade; '' close;
}

include /etc/nginx/conf.d/*.conf;
}

stream {
include /etc/nginx/conf.d/*.stream;
}
EOF

第三步:创建配置文件vidoe.abc.com的域名映射文件 video.conf,执行以下命令
后面每新增一个自定义域名,我们就需要新增一个对应的xxx.conf 文件,并分别替换
命令中的server_name 后面的内容以及 proxy_pass的内容。

tee ~/docker/nginx/conf.d/video.conf <<-'EOF'server {
listen 80;
server_name video.abc.com;
client_max_body_size 50M; #charset koi8-r;
#access_log /var/log/nginx/host.access.log main;

location / { # 此处跟换为自己的jellyfin 的访问ip 加端口
proxy_pass http://[更换为自己的jellyfin的ip和端口];
proxy_connect_timeout 10s;
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

}
EOF

最后,创建nginx 的docker 容器

docker run --name nginx -v ~/docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -v ~/docker/nginx/conf.d:/etc/nginx/conf.d -p 80:80 -d nginx:1.20-alpine --restart=always

新增域名以及配置文件后,需要重启nginx 服务,重启命令为:

docker restart nginx

自定义导航页

我的导航页我的导航页

自定义导航我使用的是最近站内很火的heimdall ,这里我把导航页安装在了和nginx同一台虚拟机中,也是通过docker 的进行安装

第一步创建配置文件夹

mkdir -p ~/docker/heimdall/config

第二步创建heimdall 容器

docker run -d
--name=heimdall
-e PUID=1000
-e PGID=1000
-e TZ=Europe/London
-p 8000:80
-v /home/zrc/docker/heimdall/config:/config
--restart unless-stopped
lscr.io/linuxserver/heimdall:latest

第三步,把导航页作为 abc.com 的根域名进行访问
首先,把abc.com 在路由器中进行指定,具体参考上文
然后,把abc.com 作为nginx 的默认配置,也就是说在 ~/docker/nginx/conf.d 中增加一个default.conf ,并指定域名
具体的命令为:
同样的,以下命令为单行,需要复制后一次执行。

tee ~/docker/nginx/conf.d/default.conf <<-'EOF'server {
listen 80;
server_name abc.com;
client_max_body_size 50M; #charset koi8-r;
#access_log /var/log/nginx/host.access.log main;

location / {
proxy_pass http://172.17.0.1:8000;
proxy_connect_timeout 10s;
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

}
EOF

需要注意的是,我把nginx 和heimdall 都是采用了docker并安装到了同一个虚拟机,所以我这里的proxy_pass 的ip 为docker0 的ip ,也就是docker 默认的网桥地址。
最后一步,重启nginx 即可。

docker restart nginx

剩下的域名按照文中的步骤进行添加即可,路由器中添加一个域名,新增一个nginx 的配置文件,重启nginx ,导航页中添加即可。

FAQ

  1. 为什么不直接使用docker 创建nginx
    我测试过用unraid 直接创建一个nginx ,使用新的ip ,但是我发现创建出的容器无法访问局域网内的设备,是直接无法连接,可能可以通过路由表的方式进行映射,我觉得也挺麻烦,就直接新增了一个虚拟机,并把闲置调整到最低

  2. 为什么把导航页和nginx 放到同一个虚拟机中
    这里有两个目的,第一个是nginx 和导航页作为同一类应用,按照职责来说他们是一样的,所以放到了一起
    另外一个为了进行演示,docker 之间互相访问,需要使用的ip

  3. 为什么不使用unraid 自带的nginx 进行配置
    unraid 自带的nginx我验证过,首先是重启后会还原,当然可以用挂载的方式,然后是我也验证过,不知道是版本的问题还是别的原因,配置始终不成功。

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起

QNAP 威联通 TS-464C2 四盘位 NAS网络存储(赛扬N5095、8GB)黑色

QNAP 威联通 TS-464C2 四盘位 NAS网络存储(赛扬N5095、8GB)黑色

2599元起

QNAP 威联通 TS-466C 四盘位NAS(奔腾N6005、8GB)

QNAP 威联通 TS-466C 四盘位NAS(奔腾N6005、8GB)

3199元起

QNAP 威联通 TS-464C 4盘位NAS(赛扬N5095、8GB)

QNAP 威联通 TS-464C 4盘位NAS(赛扬N5095、8GB)

1999元起

QNAP 威联通 TS-216 双盘位NAS (ARM Cortex A55、2GB)

QNAP 威联通 TS-216 双盘位NAS (ARM Cortex A55、2GB)

1199元起

QNAP 威联通 TS-464C2 4盘位NAS(赛扬N5095、8GB)

QNAP 威联通 TS-464C2 4盘位NAS(赛扬N5095、8GB)

2699元起

QNAP 威联通 TS-462C 4盘位NAS(赛扬N4505、4GB)

QNAP 威联通 TS-462C 4盘位NAS(赛扬N4505、4GB)

1899元起

QNAP 威联通 TS-564 五盘位NAS (N5105、8GB)

QNAP 威联通 TS-564 五盘位NAS (N5105、8GB)

1825元起

QNAP 威联通 TS-416 四盘位NAS(Cortex-A55、4GB)

QNAP 威联通 TS-416 四盘位NAS(Cortex-A55、4GB)

1599元起

QNAP 威联通 TS-262C 双盘位NAS(赛扬N4505、4GB)

QNAP 威联通 TS-262C 双盘位NAS(赛扬N4505、4GB)

1699元起

QNAP 威联通 TS-264C-4G 双盘位 NAS存储(N5105、4GB)

QNAP 威联通 TS-264C-4G 双盘位 NAS存储(N5105、4GB)

1899元起

QNAP 威联通 TS-264C 宇宙魔方 8G内存2盘位四核心处理器网络存储服务器内置双 M.2 插槽NAS私有云

QNAP 威联通 TS-264C 宇宙魔方 8G内存2盘位四核心处理器网络存储服务器内置双 M.2 插槽NAS私有云

1899元起

QNAP 威联通 TS-464C 4盘位NAS 黑色(赛扬N5095、8GB)

QNAP 威联通 TS-464C 4盘位NAS 黑色(赛扬N5095、8GB)

3499元起

QNAP 威联通 TS-464C 4盘位8G内存四核心处理器网络存储服务器内置双M.2插槽NAS(含企

QNAP 威联通 TS-464C 4盘位8G内存四核心处理器网络存储服务器内置双M.2插槽NAS(含企

2099元起

QNAP 威联通 TS-873A 8盘NAS(V1500B、8GB)

QNAP 威联通 TS-873A 8盘NAS(V1500B、8GB)

7480元起

QNAP 威联通 TS-212P3 双盘位NAS(Realtek RTD1295、1GB)

QNAP 威联通 TS-212P3 双盘位NAS(Realtek RTD1295、1GB)

799元起

QNAP 威联通 TS-453Bmini 4盘位NAS(J3455、4GB)

QNAP 威联通 TS-453Bmini 4盘位NAS(J3455、4GB)

1899元起
34评论

  • 精彩
  • 最新
  • 对于普通用户,感觉还是nginx proxy manager中文版更加适合

    校验提示文案

    提交
    对于普通用户,还是网络收藏夹算了

    校验提示文案

    提交
    图形界面操作,确实合适,对unraid ,filebrowser 等使用websocket的应用要打开 websocket ,我这里是全部打开了

    校验提示文案

    提交
    还有2条回复
    收起所有回复
  • npm很好用,文中说的不能访问局域网其他ip可能是unraid一个bug,重启后有概率发生,开关docker功能可恢复,我自己是每次停电不安全关机后,系统开机后会出现这个现象

    校验提示文案

    提交
    那是我这里不严谨,我以为是和爱快的docker 类似,都是一个子网的方式,我回头试试看

    校验提示文案

    提交
    收起所有回复
  • 我用的是heimdall和群晖自带的反代。

    校验提示文案

    提交
  • 无法访问别的容器是用了默认的容器网络?需要访问别的容器话需要自己新建网络.容器设置里把保留用户自定义网络的钩子打上,不然重启就没了

    校验提示文案

    提交
  • 羡慕你家的公网没封80/443端口,我这里都封了,要想无端口访问家里设备与服务只能用frp或者cloudflare穿透,但是frp极度依赖服务器的访问速度与带宽,cloudflare的访问速度太感人,只能备用。

    校验提示文案

    提交
  • 有公网的话 可以试试猫咪分流 [观察] [观察]

    校验提示文案

    提交
    这是啥 百度不到啊

    校验提示文案

    提交
    请问可以通过这个实现外网免端口访问内网应用吗,可以的话我就去入个软路由 [高兴]

    校验提示文案

    提交
    还有2条回复
    收起所有回复
  • 还有一个思路,工信部备案域名之后ddns显性解析就可以了

    校验提示文案

    提交
    不可能,80和443端口被封

    校验提示文案

    提交
    开始造词了,先不说怎么打通80端口,您能先给大家讲讲什么叫显性解析吗? 孟德尔杂交试验?

    校验提示文案

    提交
    还有3条回复
    收起所有回复
  • 你们ipv4的80和443不屏蔽吗

    校验提示文案

    提交
    我也在想

    校验提示文案

    提交
    收起所有回复
  • 我偶然发现,原来heimdall其实也是用了nginx 做代理,按照这个思路来说,其实是可以直接使用hemidall 的nginx ,虚拟机只装一个hemidall 即可

    校验提示文案

    提交
  • 技术贴收藏

    校验提示文案

    提交
  • 用了一段时间unraid感觉想换群晖了。

    校验提示文案

    提交
  • chrome同步收藏夹不就行囖,我家50多个应用,都用heimdall的话就会很乱。

    校验提示文案

    提交
  • 同时有主路由和旁路由的话,看你dns服务在哪个上,然后域名劫持只需要在哪个路由器上做就行了,有自建dns服务的话,就自建的上做,实在不行改本地host文件

    校验提示文案

    提交
  • 其实豆做了导航页面了,那就直接导航页面解析ip+端口就行了,再做域名解析有点多余了

    校验提示文案

    提交
    是的,我就是这么操作的,新建容器的话,新增端口转发就可以,然后海姆达上增加链接

    校验提示文案

    提交
    收起所有回复
  • 嫌麻烦,NAS自带反向代理后,浏览器装itab插件,一样的可视化效果

    校验提示文案

    提交
  • 买了域名之后可以做一下工信部认证,然后就能在dns服务商那里做二级域名了

    校验提示文案

    提交
  • 好吧,一个导航页解决这个问题不好吗

    校验提示文案

    提交
  • npm就够了,还是esxi简单

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关好价推荐
查看更多好价

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
862
扫一下,分享更方便,购买更轻松