V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
moon255
V2EX  ›  NGINX

nginxproxymanager 遇到几个问题,求助

  •  
  •   moon255 · 56 天前 · 1327 次点击
    这是一个创建于 56 天前的主题,其中的信息可能已经有所发展或是发生改变。
    可能都是比较基础的问题,因为接触的时间不久,用词可能不太专业。我的云服务器是 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 来搭建服务?有没有更好的方法?
    希望各位大佬能指点一下
    16 条回复    2024-03-05 12:11:15 +08:00
    cdlnls
        1
    cdlnls  
       55 天前
    我理解的是,你这里的 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
        2
    moon255  
    OP
       55 天前
    @cdlnls
    现在难受的是,前两个本机部署的服务,如果监听 127.0.0.1 ,nginx 就无法代理宿主机的服务,虽然没暴露端口,但公网上也访问不了(因为那个聊天服务会分享给认识的人用)。如果监听 0.0.0.0 (公网地址),那么 ip+端口直接就能访问,就不安全了。
    我试过用 host 模式,这个模式不能指定端口了,nginx 管理面板用不了。其实我现在也用 docker 搭了个密码管理服务,加入了 docker 网络,只暴露了 docker 内部端口,也只能用域名来访问,这样隔离还挺好用的,还是不想放弃 bridge 模式。主要是不知道怎么代理宿主机服务,能解决就挺舒服的。
    mulu
        3
    mulu  
       55 天前 via Android
    可以设置 iptables 只开放 80 、443 和 ssh 端口,或者各种后端服务监听本地 IP ,比如你的服务器内网 IP 是 10.0.0.1 ,docker 启动参数 -p 10.0.0.1:3000:3000
    moon255
        4
    moon255  
    OP
       55 天前
    @mulu
    我把能监听本地的服务都设置成监听本地了,比如各种管理面板。现在 docker 容器都可以不暴露端口了,但是非 docker 服务如果监听本地就没办法发布出去
    zhzy0077
        5
    zhzy0077  
       54 天前 via Android
    docker 默认 container 在单独的一个子网里 你如果要访问宿主机的服务要加 --network host
    dode
        6
    dode  
       54 天前
    再单独为 ip 访问放一个空服务
    Laysan
        7
    Laysan  
       54 天前   ❤️ 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 证书就能直接通过这两个域名访问了,也不用加端口号的
    waringid
        8
    waringid  
       54 天前
    @Laysan 正解
    morota
        9
    morota  
       54 天前
    借楼问一下,nginx 能在同一个端口同时转发 http 和 tcp 吗?
    moon255
        10
    moon255  
    OP
       54 天前
    @Laysan 感谢,将地址设置成 docker0 的 ip ( 172.17.0.1 )就可以访问了,但是我用防火墙屏蔽服务的端口后就登不上去,请问是什么原因呢?而且我把服务都设置成监听本地,开不开放端口都无法访问了,怎样才能实现只暴露 443 呢?
    moon255
        11
    moon255  
    OP
       54 天前
    另外,我进入 npm 容器 ping host.docker.internal ,ip 就是 docker0 的地址,但是我用这个主机名代替 ip 就无法访问,搞不懂...
    Laysan
        12
    Laysan  
       54 天前
    @moon255 #10 云服务器一般都有安全组策略配置,把 443 端口开放就行
    Laysan
        13
    Laysan  
       54 天前
    @moon255 #11 这个你检查下 hosts 配置吧
    moon255
        14
    moon255  
    OP
       53 天前
    @Laysan 我的云服务商没有提供安全组配置,只在服务器上安装 ufw 控制端口开关。我找到这篇文章 https://llxx.cc/bt-ban-ip/,博主也是这样操作就 ok 了,如果没有的话是不是就不能实现了?
    Laysan
        15
    Laysan  
       53 天前
    @moon255 #14 就用防火墙放行就可以吧
    moon255
        16
    moon255  
    OP
       53 天前
    @Laysan 防火墙放行就相当于暴露端口了呀 @@
    ip+端口能直接访问到服务的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2902 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:43 · PVG 20:43 · LAX 05:43 · JFK 08:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.