![NAT 后面的 Web 服务器如何监听公共 IP 地址](https://linux22.com/image/617304/NAT%20%E5%90%8E%E9%9D%A2%E7%9A%84%20Web%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%A6%82%E4%BD%95%E7%9B%91%E5%90%AC%E5%85%AC%E5%85%B1%20IP%20%E5%9C%B0%E5%9D%80.png)
我有一个 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 地址为不同的站点提供服务,大多数现代客户端都支持此功能,但并非全部。