上一节,咱们探究了网络延迟增大问题的分析方法,并经过一个案例,掌握了如何用hping三、tcpdump、Wireshark、strace 等工具,来排查和定位问题的根源。后端
简单回顾一下,网络延迟是最核心的网络性能指标。因为网络传输、网络包处理等各类因素的影响,网络延迟不可避免。但过大的网络延迟,会直接影响用户的体验。安全
因此,在发现网络延迟增大的状况后,你能够先从路由、网络包的收发、网络包的处理,再到应用程序等,从各个层级分析网络延迟,等到找出网络延迟的来源层级后,再深刻定
位瓶颈所在。bash
今天,我再带你来看看,另外一个可能致使网络延迟的因素,即网络地址转换(NetworkAddress Translation),缩写为 NAT。服务器
接下来,咱们先来学习 NAT 的工做原理,并弄清楚如何优化 NAT 带来的潜在性能问题网络
NAT 技术能够重写 IP 数据包的源 IP 或者目的 IP,被广泛地用来解决公网 IP 地址短缺的问题。它的主要原理就是,网络中的多台主机,经过共享同一个公网 IP 地址,来访问外网资源。同时,因为 NAT 屏蔽了内网网络,天然也就为局域网中的机器提供了安全隔离。框架
你既能够在支持网络地址转换的路由器(称为 NAT 网关)中配置 NAT,也能够在 Linux服务器中配置 NAT。若是采用第二种方式,Linux 服务器实际上充当的是“软”路由器的角色。tcp
NAT 的主要目的,是实现地址转换。根据实现方式的不一样,NAT 能够分为三类:工具
NAPT 是目前最流行的 NAT 类型,咱们在 Linux 中配置的 NAT 也是这种类型。而根据转换方式的不一样,咱们又能够把 NAPT 分为三类。
性能
第一类是源地址转换 SNAT,即目的地址不变,只替换源 IP 或源端口。SNAT 主要用于,多个内网 IP 共享同一个公网 IP ,来访问外网资源的场景。学习
第二类是目的地址转换 DNAT,即源 IP 保持不变,只替换目的 IP 或者目的端口。DNAT主要经过公网 IP 的不一样端口号,来访问内网的多种服务,同时会隐藏后端服务器的真实IP 地址。
第三类是双向地址转换,即同时使用 SNAT 和 DNAT。当接收到网络包时,执行DNAT,把目的 IP 转换为内网 IP;而在发送网络包时,执行 SNAT,把源 IP 替换为外部IP。
双向地址转换,其实就是外网 IP 与内网 IP 的一对一映射关系,因此经常使用在虚拟化环境中,为虚拟机分配浮动的公网 IP 地址。
为了帮你理解 NAPT,我画了一张图。咱们假设:
那么 SNAT 和 DNAT 的过程,就以下图所示:
从图中,你能够发现:
了解了 NAT 的原理后,咱们再来看看,如何在 Linux 中实现 NAT 的功能。
Linux 内核提供的 Netfilter 框架,容许对网络数据包进行修改(好比 NAT)和过滤(好比防火墙)。在这个基础上,iptables、ip6tables、ebtables 等工具,又提供了更易用
的命令行接口,以便系统管理员配置和管理 NAT、防火墙的规则。
其中,iptables 就是最经常使用的一种配置工具。要掌握 iptables 的原理和使用方法,最核心的就是弄清楚,网络数据包经过 Netfilter 时的工做流向,下面这张图就展现了这一过程。
在这张图中,绿色背景的方框,表示表(table),用来管理链。Linux 支持 4 种表,包括filter(用于过滤)、nat(用于 NAT)、mangle(用于修改分组数据) 和 raw(用于原
始数据包)等。
跟 table 一块儿的白色背景方框,则表示链(chain),用来管理具体的 iptables 规则。每一个表中能够包含多条链,好比:
固然,你也能够根据须要,建立你本身的链。
灰色的 conntrack,表示链接跟踪模块。它经过内核中的链接跟踪表(也就是哈希表),记录网络链接的状态,是 iptables 状态过滤(-m state)和 NAT 的实现基础。
iptables 的全部规则,就会放到这些表和链中,并按照图中顺序和规则的优先级顺序来执行。
针对今天的主题,要实现 NAT 功能,主要是在 nat 表进行操做。而 nat 表内置了三个链:
熟悉 iptables 中的表和链后,相应的 NAT 规则就比较简单了。咱们还以 NAPT 的三个分类为例,来具体解读一下。
根据刚才内容,咱们知道,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 须要在 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_forward net.ipv4.ip_forward = 1
若是还没开启,你能够执行下面的命令,手动开启:
sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1
固然,为了不重启后配置丢失,不要忘记将配置写入 /etc/sysctl.conf 文件中:
cat /etc/sysctl.conf | grep ip_forward net.ipv4.ip_forward=1
讲了这么多的原理,那当碰到 NAT 的性能问题时,又该怎么办呢?结合咱们今天学过的NAT 原理,你先本身想一想,动手试试,下节课咱们继续“分解”。
今天,咱们一块儿学习了 Linux 网络地址转换 NAT 的原理。
NAT 技术可以重写 IP 数据包的源 IP 或目的 IP,因此广泛用来解决公网 IP 地址短缺的问题。它可让网络中的多台主机,经过共享同一个公网 IP 地址,来访问外网资源。同时,
因为 NAT 屏蔽了内网网络,也为局域网中机器起到安全隔离的做用。
Linux 中的 NAT ,基于内核的链接跟踪模块实现。因此,它维护每一个链接状态的同时,也会带来很高的性能成本。具体 NAT 性能问题的分析方法,咱们将在下节课继续学习。