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