NAT 后面的 Web 服务器如何监听公共 IP 地址

NAT 后面的 Web 服务器如何监听公共 IP 地址

我有一个 Debian Web 服务器 (nginx),在使用 NAT 的防火墙后面运行。该 Web 服务器托管多个需要 SSL 和其自己的 IP 地址的站点。我希望 SSL 站点仅监听其特定 IP 地址,而共享站点仅监听共享 IP。

目前,我正在监听所有域的通配符 *,我猜想这意味着它正在监听单个 LAN 地址并根据主机名而不是 IP 地址提供站点内容。我想更正这一点。

正确的做法是什么?是为每个 IP 地址创建 1:1 NAT,并将 LAN IP 添加到要监听的网络接口,然后将 LAN IP 分配给特定域吗?还是有更好的方法?有没有办法传递公共 IP 并据此采取行动?谢谢。

答案1

不可以,完成 NAT 之后,您无法通过原始目标 IP 地址,至少不能直接通过。

我将使用 192.0.2.0/24 作为您的外部 IP 块,并使用 198.51.100.0/24 作为您的内部 IP 块(参见 RFC5737)。

您可以做的一些事情包括:

  • 将每个外部 IP 上的目标端口通过 NAT 转换为内部 IP 上的不同端口集。例如,将 192.0.2.1:80 和 192.0.2.1:443 转换为 198.51.100.1:80 和 198.51.100.1:443,然后将 192.0.2.2:80 和 192.0.2.2:443 转换为 198.51.100.1:81 和 198.51.100.1:444。配置 Web 服务器以侦听不同端口以获取相应的服务。务必选择未用于其他用途的端口,并检查防火墙设置。
  • 为 Web 服务器分配其他内部 IP。例如,为 Web 服务器分配 198.51.100.1 和 198.51.100.2。将适当的外部 IP/端口对 NAT 到相应的内部 IP/端口对(例如 192.0.2.1 到 198.51.100.1,192.0.2.2 到 198.51.100.2)。指示 nginx 将适当的服务绑定到适当的内部 IP。

如果您采用后一种解决方案,您的环境将更简单且更符合标准,因为您无需处理不常见的端口号和端口转换,但您需要为每个 Web 服务器分配多个内部 IP(我猜您只有一个)。此外,如果您使用后一种解决方案,则可以使用 1:1 NAT。

也就是说,如果您没有任何理由将 Web 服务器置于 NAT 后面(NAT 不是防火墙),则只需监听外部 IP(这样做也需要更改拓扑)。

答案2

听起来你希望每个站点都有不同的公共 IP 地址。这意味着防火墙必须提供不同的公共 IP 地址。然后防火墙可以将对不同 IP 地址的请求转发到 nginx 服务器,或者可以将这些请求转发到同一 IP 地址上的不同端口。然后,你可以让 nginx 服务器做出相应的响应。

具体如何配置取决于你的防火墙。例如,使用 iptables,你可以在脚本中执行如下操作:

KINCAID=192.168.1.112
EXTIPJMN=50.60.70.80
iptables -t nat -A PREROUTING -d $EXTIPJMN -p tcp -i $EXT --dport 8081 -j DNAT --to-destination $KINCAID:8080

这会将来自 IP 地址 EXTIPJMN (50.60.70.80) 和端口 8081 的请求路由到 IP 地址为 KINCAID (192.168.1.112) 和端口 8080 的内部服务器

即使通过 https,也可以从同一 IP 地址为不同的站点提供服务,大多数现代客户端都支持此功能,但并非全部。

相关内容