nginxproxymanager 遇到几个问题,求助

67 天前
 moon255
可能都是比较基础的问题,因为接触的时间不久,用词可能不太专业。我的云服务器是 debian12 ,装了 3 个服务,第一个是 frps ,代理家里 nas 的 jellyfin ,端口 8096 。第二个是个聊天服务,在 3000 端口。第三个是 docker 版的 nginxproxymanager 。用 nginx 反代前两个服务,设置了通信规则,可以用域名访问了。(我一开始以为所有服务都可以通过 https 来访问,就不用暴露服务本身的端口,结果用禁用端口后都没法访问了。。。囧)
有几个问题需要请教:
1.现在除了域名,也可以用 http://ip:端口的形式来访问服务,这样的话设置的通信规则就不起作用了,就觉得好别扭和奇怪。我想问能否禁用掉 ip+端口( http )的形式,只通过域名( https )访问,是要在高级规则里设置吗?我设置了一下发现命令是写在一个 server 块里的,没办法分开监听 80 和 443 ,不知道怎么搞。
2.第二个聊天服务可以设置监听 0.0.0.0:3000 或 127.0.0.1:3000 ,设置成前者正常访问没问题。然后我想不暴露端口,就设置成后者,查了文档,转发主机/ip 那里填了 host.docker.internal ,但是无法访问,502 。我用 ssh 的端口转发看是没问题的,就是说 nginxproxymanager 没办法代理宿主机的服务吗?
3.如果我暴露较少的端口,用 nginxproxymanager 能做到吗?还是说尽量用 docker 来搭建服务?有没有更好的方法?
希望各位大佬能指点一下
1410 次点击
所在节点    NGINX
16 条回复
cdlnls
67 天前
我理解的是,你这里的 nginx-proxy-manager 是监听了云服务器的 80/443 端口,然后你的域名 xxx.domain.com 解析到了你的服务器。你通过域名来访问你家里的 jellyfin 和 3000 端口的聊天服务。现在问题是,现在既可以用 ip:port 访问服务,也可以通过 domain.com 访问服务。

问题 1: frp 也是可以设置监听 127.0.0.1 这个地址的,这样外部就没法通过公网 IP+端口的方式访问了。或者你在云服务器的安全组里面设置一下规则,只允许特定的端口。

问题 2: 聊天服务监听的 127.0.0.1 是宿主机的 127.0.0.1 ,然后 host.docker.internal 指向是 docker 网桥在主机上的 IP ,两个 IP 不一样,所以访问它不通。

问题 3: 能做到,不一定要都用 docker 来搭建服务。

---

建议,你可以把 nginx-proxy-manager 改成使用 host 网络模式,和宿主机共用同一个网络命名空间,这样容器就能够直接访问宿主机上的网络了。

然后其他的服务在运行的时候,你就都监听 127.0.0.1 ,在 nginx-proxy-manager 里面配置后端的时候,统一都填写 127.0.0.1 。
moon255
67 天前
@cdlnls
现在难受的是,前两个本机部署的服务,如果监听 127.0.0.1 ,nginx 就无法代理宿主机的服务,虽然没暴露端口,但公网上也访问不了(因为那个聊天服务会分享给认识的人用)。如果监听 0.0.0.0 (公网地址),那么 ip+端口直接就能访问,就不安全了。
我试过用 host 模式,这个模式不能指定端口了,nginx 管理面板用不了。其实我现在也用 docker 搭了个密码管理服务,加入了 docker 网络,只暴露了 docker 内部端口,也只能用域名来访问,这样隔离还挺好用的,还是不想放弃 bridge 模式。主要是不知道怎么代理宿主机服务,能解决就挺舒服的。
mulu
67 天前
可以设置 iptables 只开放 80 、443 和 ssh 端口,或者各种后端服务监听本地 IP ,比如你的服务器内网 IP 是 10.0.0.1 ,docker 启动参数 -p 10.0.0.1:3000:3000
moon255
67 天前
@mulu
我把能监听本地的服务都设置成监听本地了,比如各种管理面板。现在 docker 容器都可以不暴露端口了,但是非 docker 服务如果监听本地就没办法发布出去
zhzy0077
66 天前
docker 默认 container 在单独的一个子网里 你如果要访问宿主机的服务要加 --network host
dode
66 天前
再单独为 ip 访问放一个空服务
Laysan
66 天前
服务器只需要暴露 443 端口,npm 通过域名转发到内部的端口,docker 内部访问主机 ip 你看下网段,一般是 172.17.0.1 ,比如你 jellyfin 就配置 jellyfin.xx.com 转发到 172.17.0.1:8096,聊天就配 chat.xx.com 转发到 172.17.0.1: 3000 ,然后配置好 ssl 证书就能直接通过这两个域名访问了,也不用加端口号的
waringid
65 天前
@Laysan 正解
morota
65 天前
借楼问一下,nginx 能在同一个端口同时转发 http 和 tcp 吗?
moon255
65 天前
@Laysan 感谢,将地址设置成 docker0 的 ip ( 172.17.0.1 )就可以访问了,但是我用防火墙屏蔽服务的端口后就登不上去,请问是什么原因呢?而且我把服务都设置成监听本地,开不开放端口都无法访问了,怎样才能实现只暴露 443 呢?
moon255
65 天前
另外,我进入 npm 容器 ping host.docker.internal ,ip 就是 docker0 的地址,但是我用这个主机名代替 ip 就无法访问,搞不懂...
Laysan
65 天前
@moon255 #10 云服务器一般都有安全组策略配置,把 443 端口开放就行
Laysan
65 天前
@moon255 #11 这个你检查下 hosts 配置吧
moon255
65 天前
@Laysan 我的云服务商没有提供安全组配置,只在服务器上安装 ufw 控制端口开关。我找到这篇文章 https://llxx.cc/bt-ban-ip/,博主也是这样操作就 ok 了,如果没有的话是不是就不能实现了?
Laysan
65 天前
@moon255 #14 就用防火墙放行就可以吧
moon255
64 天前
@Laysan 防火墙放行就相当于暴露端口了呀 @@
ip+端口能直接访问到服务的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1020099

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX