网络地址转换

网络地址转换 (NAT) 是一种在 IP 数据包在传输过程中修改其头部中的源或目标地址的过程。通常,发送方和接收方应用程序并不知道 IP 数据包正在被操作。

NAT 通常由路由器实现,因此我们将执行 NAT 的主机称为NAT 路由器。但是,在 OpenStack 部署中,通常是 Linux 服务器实现 NAT 功能,而不是硬件路由器。这些服务器使用 iptables 软件包来实现 NAT 功能。

NAT 有多种变体,在这里我们描述了 OpenStack 部署中常见的三种类型。

SNAT

源网络地址转换 (SNAT) 中,NAT 路由器修改 IP 数据包中发送方的 IP 地址。SNAT 通常用于允许具有私有地址的主机与公共互联网上的服务器进行通信。

RFC 1918 保留以下三个子网作为私有地址

  • 10.0.0.0/8

  • 172.16.0.0/12

  • 192.168.0.0/16

这些 IP 地址不可公开路由,这意味着公共互联网上的主机无法将 IP 数据包发送到这些地址中的任何一个。私有 IP 地址广泛用于住宅和企业环境。

通常,在具有私有 IP 地址的主机上运行的应用程序需要连接到公共互联网上的服务器。例如,用户想要访问公共网站,如 www.openstack.org。如果到达 www.openstack.org 网站服务器的 IP 数据包的源地址是私有 IP 地址,则网站服务器无法将数据包发送回发送方。

SNAT 通过将源 IP 地址修改为在公共互联网上可路由的 IP 地址来解决此问题。SNAT 有不同的变体;在 OpenStack 部署使用的形式中,NAT 路由器在发送方和接收方之间的路径上将数据包的源 IP 地址替换为路由器的公共 IP 地址。路由器还会将源 TCP 或 UDP 端口修改为另一个值,并且路由器会维护发送方的真实 IP 地址和端口的记录,以及修改后的 IP 地址和端口。

当路由器收到具有匹配 IP 地址和端口的数据包时,它会将这些地址转换回私有 IP 地址和端口,并沿着路径转发数据包。

由于 NAT 路由器修改了端口以及 IP 地址,因此这种形式的 SNAT 有时被称为端口地址转换 (PAT)。它有时也被称为NAT 超载

OpenStack 使用 SNAT 来允许在实例内部运行的应用程序连接到公共互联网。

DNAT

目标网络地址转换 (DNAT) 中,NAT 路由器修改 IP 数据包头部中的目标 IP 地址。

OpenStack 使用 DNAT 将数据包从实例路由到 OpenStack 元数据服务。在实例内部运行的应用程序通过向 IP 地址为 169.254.169.254 的 Web 服务器发出 HTTP GET 请求来访问 OpenStack 元数据服务。在 OpenStack 部署中,没有具有此 IP 地址的主机。相反,OpenStack 使用 DNAT 更改这些数据包的目标 IP,以便它们到达正在侦听的元数据服务的网络接口。

一对一 NAT

一对一 NAT 中,NAT 路由器在私有 IP 地址和公共 IP 地址之间维护一对一映射。OpenStack 使用一对一 NAT 来实现浮动 IP 地址。