网络延迟是最核心的网络性能指标。 受网络传输、网络分组处理等各种因素的影响,网络延迟不可避免。 但是,如果网络延迟过大,将直接影响用户的体验。
NAT原理NAT技术能够改写IP分组的源IP或目的地IP,一般用于解决公共网的IP地址不足的问题。 其主要原理是网络中的多个主机通过共享同一公共IP地址来访问外部网资源。 同时,由于NAT中断了内部网,当然为局域网内的设备提供了安全的隔离。
NAT可以配置在支持网络地址转换的路由器(称为NAT网关)上,也可以配置在Linux服务器上。 如果采用第二种方法,Linux服务器实际上充当“软”路由器。
NAT的主要目的是实现地址转换。 根据实现方法的不同,NAT可以分为三类:
静态NAT,即内联网IP和公共网络IP是一对一的永久映射关系; 动态NAT,即内联网IP,动态地从公共IP池中选择一个进行映射; 网络地址端口转换napt (网络地址转换端口转换),即将内部网IP映射到公共网络IP上的不同端口,其中多个内部网IP是同一公共网络NAPT是目前最受欢迎的NAT类型,在Linux上配置的NAT也是这种类型。 根据变换方式的不同,也可以将NAPT分为3种。
第一个是源地址转换SNAT。 也就是说,目标地址不会更改,仅替换源IP或源端口。 SNAT主要用于多个内部网IP共享同一公共IP以访问外部网资源的情况。
第二个是目标地址转换DNAT。 这意味着源IP不会更改,仅替换目标IP或目标端口。 DNAT主要通过公共IP的不同端口号访问内部网的多个服务,以隐藏后端服务器的实际IP地址。
第三种是双向地址转换,同时使用SNAT和DNAT。 在接收到网络分组时,执行DNAT并将目的地IP转换为内部网IP; 另一方面,在发送网络分组时,执行SNAT,并将源IP替换为外部IP。
由于双向地址转换实际上是外联网IP和内联网IP的一对一映射关系,因此在虚拟化环境中,虚拟机通常被分配有浮动的公共网络IP地址。
为了让你理解NAPT,我画了图。 我们假设:
本地服务器的内部网IP地址为192.168.0.2; NAT网关的公共网络IP地址为100.100.100.100; 访问目标服务器baidu.com的地址为123.125.115.110。 SNAT和DNAT过程如下图所示。
从图中可以看出,可以看出以下内容。
服务器访问baidu.com时,NAT网关将源地址从服务器的内部网IP 192.168.0.2替换为公用IP地址100.100.100.100,然后将该源地址当baidu.com发送回响应包时,NAT网关还将目标地址从公用网络IP地址100.100.100替换为服务器中的网络IP 192.168.0.2,然后单击iptables和NAT Linux内核提供的Netfilter框架允许更改网络数据包(如NAT )和过滤防火墙。 在此基础上,iptables、ip6tables和ebtables等工具提供了更易于使用的命令行界面,使系统管理员能够配置和管理NAT和防火墙规则。
其中,iptables是最常用的配置工具之一。 为了掌握iptables的原理和使用方法,最核心的是明确网络数据包通过Netfilter时的工作流程。 下图说明了这个过程。
在此图中,绿色背景框表示用于管理链的表(table )。 Linux支持四种类型的表:过滤器、nat、mangle和raw。
与table一起的白色背景框表示管理特定iptables规则的链(chain )。 每个表可以包含多个链,例如:
过滤器表包含内置的INPUT、OUTPUT和前向链; nat表内置了PREROUTING、POSTROUTING、OUTPUT等。 当然,如果需要,也可以建立自己的链条。
灰色conntrack表示到跟踪模块的连接。 通过内核中的连接跟踪表,即哈希表记录网络连接的状态是实现iptables状态过滤(-m state )和NAT的基础。
所有iptables规则都位于这些表和链中,并按照图的顺序和规则的优先级执行。
关于今天的主题,要实现NAT功能,主要在NAT表中操作。 nat表内置了三个链。
PREROUTING用于在路由判断之前执行的规则,例如,对接收的包进行DNAT。 POSTROUTING用于在路由确定后运行的规则,如SNAT或MASQUERADE发送或转发的包。 OUTPUT类似于PREROUTING,但只处理本地发送的数据包。 熟悉iptables表和链后
,相应的 NAT 规则就比较简单了。我们还以 NAPT 的三个分类为例,来具体解读一下。
SNAT
根据刚才内容,我们知道,SNAT 需要在 nat 表的 POSTROUTING 链中配置。我们常用两种方式来配置它。
第一种方法,是为一个子网统一配置 SNAT,并由 Linux 选择默认的出口 IP。这实际上就是经常说的 MASQUERADE:
$ iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE
第二种方法,是为具体的 IP 地址配置 SNAT,并指定转换后的源地址:
$ iptables -t nat -A POSTROUTING -s 192.168.0.2 -j SNAT –to-source 100.100.100.100 DNAT
再来看 DNAT,显然,DNAT 需要在 nat 表的 PREROUTING 或者 OUTPUT 链中配置,其中, PREROUTING 链更常用一些(因为它还可以用于转发的包)。
$ iptables -t nat -A PREROUTING -d 100.100.100.100 -j DNAT –to-destination 192.168.0.2 双向地址转换
双向地址转换,就是同时添加 SNAT 和 DNAT 规则,为公网 IP 和内网 IP 实现一对一的映射关系,即:
$ iptables -t nat -A POSTROUTING -s 192.168.0.2 -j SNAT –to-source 100.100.100.100$ iptables -t nat -A PREROUTING -d 100.100.100.100 -j DNAT –to-destination 192.168.0.2
在使用 iptables 配置 NAT 规则时,Linux 需要转发来自其他 IP 的网络包,所以你千万不要忘记开启 Linux 的 IP 转发功能。
你可以执行下面的命令,查看这一功能是否开启。如果输出的结果是 1,就表示已经开启了 IP 转发:
$ sysctl net.ipv4.ip_forwardnet.ipv4.ip_forward = 1
如果还没开启,你可以执行下面的命令,手动开启:
$ sysctl -w net.ipv4.ip_forward=1net.ipv4.ip_forward = 1
当然,为了避免重启后配置丢失,不要忘记将配置写入 /etc/sysctl.conf 文件中:
$ cat /etc/sysctl.conf | grep ip_forwardnet.ipv4.ip_forward=1
讲了这么多的原理,那当碰到 NAT 的性能问题时,又该怎么办呢?结合我们今天学过的 NAT 原理,你先自己想想,动手试试,下节课我们继续“分解”。
总结
今天,我们一起学习了 Linux 网络地址转换 NAT 的原理。
NAT 技术能够重写 IP 数据包的源 IP 或目的 IP,所以普遍用来解决公网 IP 地址短缺的问题。它可以让网络中的多台主机,通过共享同一个公网 IP 地址,来访问外网资源。同时,由于 NAT 屏蔽了内网网络,也为局域网中机器起到安全隔离的作用。
Linux 中的 NAT ,基于内核的连接跟踪模块实现。所以,它维护每个连接状态的同时,也会带来很高的性能成本。具体 NAT 性能问题的分析方法,我们将在下节课继续学习。