考虑到世界上有这么多严苛的防火墙,我有什么理由不应该在端口 80 上运行服务器软件来保证最大可能的可访问性?似乎最常见的防火墙例外是允许端口 80 上的出站连接。我知道任何类型的数据包检查仍会阻止我的非 HTTP 流量,但如果是这种情况,我确信防火墙不会有任何无论如何,其他开放的传出端口。
如果服务器已经在端口 80 上有一个网络服务器,是否可以在端口 80 上使用某种虚拟主机(即同一台机器上的myDomain.com:80和myApp.myDomain.com:80)?
考虑到世界上有这么多严苛的防火墙,我有什么理由不应该在端口 80 上运行服务器软件来保证最大可能的可访问性?似乎最常见的防火墙例外是允许端口 80 上的出站连接。我知道任何类型的数据包检查仍会阻止我的非 HTTP 流量,但如果是这种情况,我确信防火墙不会有任何无论如何,其他开放的传出端口。
如果服务器已经在端口 80 上有一个网络服务器,是否可以在端口 80 上使用某种虚拟主机(即同一台机器上的myDomain.com:80和myApp.myDomain.com:80)?
如果您需要这样做,为什么不用 SOAP 接口或 HTTPHandler 封装您的网络通信代码呢?
然后你的数据包将符合 HTTP,你会通过防火墙,每个人都开心吗?
这比解决您从多用途端口 80 获得的所有安装和操作问题要容易得多。
我可以想到两个原因:首先,如果您这样做是为了绕过公司防火墙,您将违反安全策略,其次,您将使用未注册协议的保留端口这可能会给尝试与您的系统交互的客户(例如,谷歌)造成严重的混乱,并在他们这样做时给您的应用程序带来严重的麻烦。
编辑在 Unix 系统上,低编号端口需要特权帐户才能运行。这将是避免在该环境中执行此操作的另一个原因,因为您的应用程序可能需要比其他方式更高的权限。
要回答您的第二个问题“是否可以使用某种虚拟主机侦听端口 80”:
是的,有,它称为虚拟主机,由大多数现代网络服务器处理。但是,来自您的应用程序的所有请求都必须从 HTTP 协议 1.1 开始,其中指定了主机。您的应用程序可能必须是 CGI 应用程序。但这可能不是你想要的。
另一种方法是让您的应用程序控制端口 80 并将所有 http 查询重定向到网络服务器。它很混乱,如果您的应用程序出现故障,网络服务器也会出现问题。
解决方案是在您的服务器上拥有多个 IP 地址(您可以在 nic 上绑定多个 IP 地址)。然后,您可以将地址 1 的 mydomain.com:80 绑定到 Web 服务器,并将地址 2 的 myapp.mydomain.com 绑定到应用程序,但它们仍然在同一台服务器上。
并回答您的第一个问题:“我有什么理由不应该在端口 80 上运行服务器软件”:是的,这是不好的做法。预计会从自动扫描中获得大量 http 查询。您可以选择使用正确的 http-header 来回答它们或忽略它们。
无法为侦听端口 80 的其他域进行虚拟托管。只有一个进程可以侦听端口。虚拟主机基于 HTTP 标头发生在应用层。
您可能遇到的另一个问题是代理服务器。不是用户设置的那种,而是公司或 ISP 的自动代理。这些将无法理解您的应用程序的协议,并且可能会失败。
最后,如果您的应用程序在 Unix/Linux 变体上运行,则端口 80 将需要 root 权限。
我承认通过让 ssh 服务器在家里的 80 端口上侦听并使用ssh 隧道提供对其他服务器和服务的访问来绕过严酷的防火墙。我赶紧补充说,我在管理防火墙的人的支持下做到了这一点——我们都同意这是解决手头问题的最佳方法。
我赶紧补充说,这种策略使端口 80 无法用于其预期目的,这对我来说很好,因为它无论如何都是我的个人工作站。如果您的域中只有一台机器,那将是一个问题。但是拥有一台我可以专用于从端口 80 提供 ssh 的机器不会产生安装或操作问题。我只是跑了/etc/init.d/apache stop
,然后跑了一个sshd
来监听端口 80。然后我很高兴在我需要这样做的几个月里去。
敲我个人工作站 80 端口的自动扫描仪可能会挂掉 :-)