.net - 如何在单个 IP 和端口后面隐藏 http 服务器、restful http 服务和 websocket 服务器

标签 .net ssl proxy router tls1.2

现状

服务器打开了三个端口:

  1. 用于传送 HTML5 内容的 Web 服务器(使用 System.Net 中的 HttpListener)
  2. 用于提供请求/响应接口(interface)的 RESTful 服务(使用 WCF 中的 wsHttpBinding)
  3. 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/

相关文章:

.net - 获取类属性名称

ssl - 如何将非通配符证书用于 Bluemix?

java - JDBC 无法建立到 SQL Server 的 SSL 连接(Domino Java Agent FP 9)

android - Codenameone Google Play 警告 : SSL Error Handler Vulnerability

linux - 如何从 Google Chrome for Linux(Fedora) 的代理中排除某些域或 IP 地址?

java - 绕过 TLS 证书不匹配

c# - 正则表达式只允许 .net 中的某些字符

c# - 以编程方式将一组图像连接在一起以形成背景

java - Rally Java Lookback api 无法在 Proxy 后面工作

.NET 正则表达式替换组内的字符