【问题标题】:Why shouldn't I run my non-web server software on port 80?为什么我不应该在端口 80 上运行我的非 Web 服务器软件?
【发布时间】:2010-09-27 11:07:45
【问题描述】:

考虑到世界上有这么多严苛的防火墙,我有什么理由不应该在端口 80 上运行服务器软件来保证最大可能的可访问性?似乎最常见的防火墙例外是允许端口 80 上的出站连接。我知道任何类型的数据包检查仍会阻止我的非 HTTP 流量,但如果是这种情况,我确信防火墙不会有任何其他开放的传出端口。

如果服务器已经在端口 80 上有一个网络服务器,是否可以使用某种虚拟主机监听端口 80(即 myDomain.com:80 myApp.myDomain.com:80 on同一台机器)?

【问题讨论】:

    标签: sockets tcp client-server


    【解决方案1】:

    回答你第二个问题“是否可以使用某种虚拟主机监听 80 端口”:

    是的,有,它称为虚拟主机,由大多数现代网络服务器处理。但是,来自您的应用程序的所有请求都必须从 HTTP 协议 1.1 开始,其中指定了主机。您的应用程序可能必须是 CGI 应用程序。但这可能不是你想要的。

    另一种方法是让您的应用程序控制端口 80 并将所有 http 查询重定向到网络服务器。它很混乱,如果您的应用程序出现故障,网络服务器也会出现故障。

    解决方案是在您的服务器上拥有多个 IP 地址(您可以在 nic 上绑定多个 IP 地址)。然后您可以将地址 1 的 mydomain.com:80 绑定到 Web 服务器,将地址 2 的 myapp.mydomain.com 绑定到应用程序,但它们仍然在同一台服务器上。

    并回答您的第一个问题:“我有什么理由不应该在端口 80 上运行服务器软件”: 是的,这是不好的做法。预计会从自动扫描中获得大量 http 查询。您可以选择使用正确的 http-header 来回答它们或忽略它们。

    【讨论】:

      【解决方案2】:

      我可以想到两个原因:首先,如果您这样做是为了绕过公司防火墙,那么您将违反安全策略;其次,您将使用 reserved port 作为它的协议未注册,这可能会给尝试与您的系统交互的客户(例如 Google)带来严重的困惑,并在他们这样做时给您的应用程序带来极大的麻烦。

      编辑 在 Unix 系统上,低编号端口需要特权帐户才能运行。这将是避免在该环境中执行此操作的另一个原因,因为您的应用程序可能需要比其他方式更高的权限。

      【讨论】:

      • 您的编辑仅在 *NIX 类型系统上有效;据我所知,微软还没有实施这种限制。作为澄清,低编号是 1024 以下的任何内容
      • @monoxide -- 已修复。尽管我现在是 C#/.NET 程序员,但在我心中我是 Unix 人。
      【解决方案3】:

      无法为侦听端口 80 的其他域进行虚拟托管。只有一个进程可以侦听端口。虚拟主机基于 HTTP 标头发生在应用层。

      您可能遇到的另一个问题是代理服务器。不是用户设置的那种,而是公司或 ISP 的自动代理。这些将无法理解您的应用程序的协议,并且可能会失败。

      最后,如果您的应用程序在 Unix/Linux 变体上运行,端口 80 将需要 root 权限。

      【讨论】:

        【解决方案4】:

        如果您需要这样做,为什么不用 SOAP 接口或 HTTPHandler 封装您的网络通信代码?

        那么你的数据包将符合 HTTP,你会通过防火墙并且每个人都开心吗?

        这比解决您从多用途端口 80 获得的所有安装和操作问题要容易得多。

        【讨论】:

        • 正确。即使是 http 上的二进制文件也可以。 HTTP 是一种非常合适的行格式。
        • 通过 HTTP 发送二进制数据会损失多少性能?如果它不是太糟糕,这可能是要走的路。某种 HTTP 压缩系统会有助于提高性能吗?
        • @Luke:这取决于您传输的信息量。 HTTP 标头为每个请求添加一个小标头。但是如果你的请求只打开一次,那就可以忽略了。
        • 我有一个应用程序可以分发 >50MB 的远程数据库更新。我用 DEFLATE 压缩它们并通过 HTTPHandler 发送它们。非常快速且对防火墙透明。
        【解决方案5】:

        我承认我曾通过让 ssh 服务器侦听家乡的 80 端口并使用 ssh 隧道提供对其他服务器和服务的访问来绕过严酷的防火墙。我赶紧补充说,我是在防火墙管理人员的祝福下做到这一点的——我们都同意这是解决手头问题的最佳方法。

        我赶紧补充说,这种策略使端口 80 无法用于其预期目的,这对我来说很好,因为它是我的个人工作站。如果您的域中只有一台机器,那将是一个问题。但是拥有一台我可以专门从端口 80 提供 ssh 服务的机器没有安装或操作问题。我刚刚运行/etc/init.d/apache stop,然后运行sshd 来监听端口80。然后我很高兴在我需要这样做的几个月里继续前进。

        敲我个人工作站 80 端口的自动扫描仪可能会挂掉 :-)

        【讨论】:

        • 是的,我也做过同样的事情,但我从为可能不知道如何隧道的用户提供很棒的服务(恰好不在 HTTP 之上)的角度考虑通过 ssh。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 1970-01-01
        • 2022-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多