现状
服务器打开了三个端口:
- 用于传送 HTML5 内容的 Web 服务器(使用
System.Net
中的HttpListener
) - 用于提供请求/响应接口(interface)的 RESTful 服务(使用
WCF
中的wsHttpBinding
) - WebSocket 服务器(使用
Alchemy
WebSocket Server
)提供发布/订阅接口(interface)
由于服务器将托管在 Windows 7/10 操作系统上,.NET 4.5
中的 WebSocket
将无济于事,因为没有为 Windows 实现完整的框架7/10。我可能错了。
预期情况
应该只有一个端口被暴露,即 SSL/TLS 上的 Web 服务器端口。
我们可以将 Web 服务器和 RESTful 接口(interface)合二为一,不使用 WCF
,而是通过实现嵌入到 Web 服务器中的 RESTful 接口(interface)。但这将需要对代码进行重大更改(在服务器端和客户端)。我们希望通过一种涉及最少代码更改的方法来解决这种情况。
问题
如何将这三台服务器安全地隐藏在一个暴露的 Web 服务器端口后面? 从安全角度来看,实现这种情况的一般最佳做法是什么。
最佳答案
通过 HTTP/S 请求使用 RESTful 应用程序。您的网络服务器可能会监听标准端口 80 或 8080 之一来处理请求。
如果“隐藏”是指限制/阻止与这些端口的连接,您可以:
1) 通过防火墙规则将到此端口的连接限制为已知 IP 地址列表。在 Linux 上,使用 iptables 实用程序是标准做法。
2) 要使上述方法起作用,连接的客户端需要固定的IP地址才能起作用。如果您的 ISP 没有分配静态 IP 地址,或者您的客户端需要从其他网络连接,那么此方法将无法始终如一地工作。
3) 为解决上述问题,您可以要求客户端在使用您的 API 之前先通过 VPN 隧道进行身份验证。
不过,老实说,我不推荐上述内容,除非您试图隐藏(比如说)僵尸网络 API。比隐藏服务器端口更重要的是保护业务资源,方法是编写自定义身份验证层逻辑以授予客户端对您的 API 的访问权限。可以使用基于 token 的方法(例如 OAuth )、公钥-私钥或基于 session 的登录来实现身份验证层。这为您提供了比防火墙规则和服务器配置更大的灵 active ,并且是 RESTful 应用程序设计中的“一般最佳实践”。
正如您提到的,您必须强制使用 HTTPS 对客户端-服务器数据进行加密。
编辑: 因为您使用的是单个服务器,所以已经指定您的端口 (80/8080) 将绑定(bind)到单个静态 IP 地址。
关于.net - 如何在单个 IP 和端口后面隐藏 http 服务器、restful http 服务和 websocket 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36171610/