【问题标题】:Prevent default redirection from port 80 to 5000 on Synology NAS (DSM 5)防止从 Synology NAS (DSM 5) 上的端口 80 到 5000 的默认重定向
【发布时间】:2024-01-10 18:33:01
【问题描述】:

我想在我的 Synology NAS 上使用 nginx 前端服务器来进行反向代理。目标是为托管 NAS 的不同网络服务器使用的非标准端口号提供一个外观。 nginx 应该监听 80 端口,否则这一切都没有任何意义。

然而,DSM 开箱即用的Apache 服务器已经在侦听端口 80。它所做的非常愚蠢:它只是重定向到端口 5000,这是 NAS Web 管理器的入口点(DSM )。

我想做的是禁用此功能,使端口 80 可用于我的nginx 服务器。我该怎么做?

【问题讨论】:

    标签: port nas synology


    【解决方案1】:

    由于 Google 也为最近的 Synology DSM 重定向到这里,所以我回答 DSM6(基于 http://tonylawrence.com/posts/unix/synology/freeing-port-80/

    从 DSM6 开始,nginx 被用作 HTTP 服务器和重定向的地方。以下命令将保留 ngingx,将其运行在端口 8880 而不是 80。

    1. SSH 到您的 Synology
    2. sudo -s
    3. cd /usr/syno/share/nginx
    4. 备份server.mustacheDSM.mustacheWWWService.mustache
      • cp server.mustache server.mustache.bak
      • cp DSM.mustache DSM.mustache.bak
      • cp WWWService.mustache WWWService.mustache.bak
    5. sed -i "s/80/8880/g" server.mustache
    6. sed -i "s/80/8880/g" DSM.mustache
    7. sed -i "s/80/8880/g" WWWService.mustache
    8. (可选)您还可以将443 移动到8881
      • sed -i "s/443/8881/g" server.mustache
      • sed -i "s/443/8881/g" DSM.mustache
      • sed -i "s/443/8881/g" WWWService.mustache
    9. 退出 shell(例如,通过 Ctrl+D
    10. 转到控制面板并更改任何设置(例如,应用程序门户 -> 反向代理将 http://YOURSYNOLOGYHOSTNAME:80 转发到 http://localhost:8181 - 8181 是 pi-hole on DSM tutorial 建议的端口)。

    【讨论】:

      【解决方案2】:

      tl;dr 编辑 /usr/syno/etc/synoservice.d/httpd-user.cfg 使其看起来像:

         {
              "init_job_map":{"upstart":["httpd-user"]},
              "user_controllable":"no",
              "mtu_sensitive":"yes",
              "auto_start":"no"
          }
      

      然后在/etc/init/httpd-user.conf 中将stop on runlevel 编辑为[0123456]

      Syno-Server> cat /etc/init/httpd-user.conf 
      description "start httpd-user daemon"
      author "Development Infrastructure Team"
      console log
      reload signal SIGUSR1
      
      start on syno.share.ready and syno.network.ready
      stop on runlevel [0123456]
      ...
      

      ...然后重新启动。

      背景信息

      Backslash36 给出的答案并不是最简单的解决方案,也可能更难维护。在这里,我给出了一个不涉及启动webstation 的解决方案,这是大多数其他解决方案所需要的。请注意,有关更新的文档,请参阅 here,它提供了有关 Synology 系统的大量信息。

      需要注意的是,新的 DSM (> 5.x) 现在使用 upstart,所以之前的很多文档都不正确。 Synology 机器上默认运行两个 httpd 作业:

      1. httpd-sys:提供管理页面,默认位于5000/5001
      2. httpd-user :这有点令人困惑,即使webstation 程序未启用,它总是运行。

      如果webstation:

      1. 已启用:则此程序为用户网页提供服务。
      2. 启用:然后此程序将/usr/syno/synoman/phpsrc/web 设置为其DocumentRoot (/usr/syno/synoman/phpsrc/web/index.cgi -> /usr/syno/synoman/webman/index.cgi),这意味着对http://address.of.my.dsm 的调用将调用index.cgi 文件。这个cgi 文件是驱动重定向到5000(或您设置的admin_port 的任何内容)的原因。

      从命令行,您可以检查[secure_]admin_port 的设置:

      Syno-Server> get_key_value /etc/synoinfo.conf admin_port
      5184
      Syno-Server> get_key_value /etc/synoinfo.conf secure_admin_port
      5185
      

      我的设置有所不同。

      好的,现在开始解决。最好的解决方案就是停止httpd-user 守护进程的启动。无论如何,这大概是您想要的(例如,在 docker 中启动另一个服务器,如“nginx”)。为此,请编辑相关的 upstart 配置文件:

      Syno-Server> cat /usr/syno/etc/synoservice.d/httpd-user.cfg 
      {
              "init_job_map":{"upstart":["httpd-user"]},
              "user_controllable":"no",
              "mtu_sensitive":"yes",
              "auto_start":"no"
      }
      

      所以"auto_start" 条目是"no"(如上所示)。默认情况下,它可能在您的机器上为"yes"。然后将stop on runlevel 中的[0123456] 编辑为/etc/init/httpd-user.conf

      Syno-Server> cat /etc/init/httpd-user.conf 
      description "start httpd-user daemon"
      author "Development Infrastructure Team"
      console log
      reload signal SIGUSR1
      
      start on syno.share.ready and syno.network.ready
      stop on runlevel [0123456]
      ...
      

      最后一步是确保httpd-user 服务确实真正启动,但随后自动停止。这是因为实际上有许多服务依赖于它的启动。重新启动您的机器,您现在将看到端口 80 上没有任何东西在侦听(或转发)。

      【讨论】:

      • 感谢您的意见。但是,httpd-user 服务在启动后立即停止,这不是问题吗?依赖它的服务实际上可能需要它来独立开展业务
      • 不,我不这么认为。唯一真正依赖它的服务是webstation。也有可能找到一个不需要它实际启动的解决方案,但我需要更多时间来挖掘。通过这个设置,我们运行了一个nginx docker 容器,代理多个后端连接并在端口 80 上提供服务。
      • 好的。顺便说一句,我的 NAS 是开箱即用的 nginx,所以我不需要将它放在 docker 容器中。
      • 确实,但我更容易使用我们控制的版本,并且我们也正在部署到其他非 Synology 服务器。
      • @MikeGM - 感谢您提供非常详细的答案。你在哪个版本的 DSM 上运行它,你知道它是否仍然适用于当前 (DSM 5.2.5644)? DSM 6 测试版怎么样(我有一个我计划在几周内更新到测试版)?此外,这是否会通过 DSM 更新持续存在,还是您每次都必须重做?非常感谢。
      【解决方案3】:

      完成!这很棘手,但现在我可以正常工作了。这是我的做法。

      以下内容需要使用 ssh 连接到 NAS,如果您想对您的产品进行保修,则可能不推荐使用(即使它是完全安全的恕我直言)

      TL;DR :在以下文件中,将所有出现的端口 80 替换为非标准端口(例如,8080)。这将释放端口80 并使其可供您想要的任何人使用。

      • /etc/httpd/conf/httpd.conf
      • /etc/httpd/conf/httpd.conf-user
      • /etc/httpd/conf/httpd.conf-sys
      • /etc.defaults/httpd/conf/httpd.conf-user
      • /etc.defaults/httpd/conf/httpd.conf-sys

      请注意,修改这些文件的一个子集可能就足够了(我可以观察到第一个实际上是从其他几个文件中计算出来的)。我想修改 /etc.defaults/ 中的文件就足够了,但如果没有,最坏的情况是修改所有这些文件,你会没事的。

      完成后,别忘了重启你的 NAS!


      对于那些对我如何发现感兴趣的人

      我对 Linux 文件系统不太熟悉,对Apache 配置更不熟悉。但我知道处理启动过程的脚本位于/etc/init。执行重定向的Apache 服务器肯定会从那里启动。

      • 这是我不得不弄脏手的地方。我为该目录中我认为相关的文件执行了一些cat <filename> | grep 80,希望找到一个将端口号设置为80的配置行。

      • 这种直觉得到了回报:/etc/init/httpd-user.conf 包含echo "DocumentRoot \"/usr/syno/synoman/phpsrc/web\"" >> "${HttpdConf}" #port 80 to 5000 这一行。宾果游戏!

      • 查看文件顶部,我发现HttpdConf 变量指的是/etc/httpd/conf/httpd.conf。这是进行实际配置的地方。

      从那里开始相对简单,即使对于那些对 Apache 配置一无所知的 John Snow 也是如此。诀窍是注意到httpd.conf 是在启动时从某个模板实例化的(因此更改此文件是不够的)。执行find / -name "*httpd.conf*",结合一些grep 80 给了我要修改的文件列表。

      当您回首往事时,这一切当然看起来很明显。 不过,我希望 Synology 能给我们更多的灵活性,这样我们就不必像那样进行肮脏的 hack...

      【讨论】:

      • 不幸的是,当我安装更新时设置又回到了 80
      • 请向 Synology 提交错误/功能请求。他们愿意让标准端口可配置,想要这个功能的用户越多,我们就越早得到它。
      • 我会的。顺便说一句,这个答案已经过时了,因为自从最新的 DSM 更新以来情况已经完全改变