NAT原理总结

1、NAT原理总结

1.1 NAT的产生

由于网络的飞速发展和网络应用的极速增多,致使IPv4可用地址空间逐渐枯竭。尽管IPv6可以在根本上解决地址枯竭问题,但IPv4发展到IPv6还需要一个过渡,而这便产生了NAT。

1.2 NAT的作用

IP地址分为公网IP与私网IP。一般情况下,在互联网中,公网IP可直接访问,私网IP无法直接访问。而NAT则是将私网IP地址转换为公网IP地址(将IP报文头部的私网IP地址改为可以提供访问的公网IP地址),从而实现用户上网功能或服务器在互联网上提供服务。NAT还可以使得一个公网IP代表多个不同的内网IP,这样便节省了IP地址资源。

1.3 NAT的类型与分类

NAT分为静态转换、动态转换、端口转换

  1. 静态转换:私有地址与公有地址进行一对一的映射。这种一对一映射无法缓解可用公有地址短缺的问题。
  2. 动态转换:私有地址与公有地址进行一对多的映射。首先建立公有地址地址池,私有地址向外通信时,会从公有地址地址池中选择非在用的公有地址进行映射,当通信结束时,释放映射关系,公有地址重新恢复到地址池中待用。弊端:若私有地址向外通信,而公有地址地址池中无可用公有地址时,会等待公有地址释放后在进行通信。
  3. 端口转换:在大多数网络中,一般都使用的是IP上的某个端口(如80、443、3389等),所以不需要进行全地址映射,只需要私有地址端口映射到公有地址端口上,直接访问公有地址加端口号的形式便可以。这样可以使得一个公有地址可以对应多个私有地址,从而大大缓解了公有地址紧缺的问题。
  4. Easy IP:为小型网络,一般为家庭、小型网吧、办公室等内部主机不多的地方。通过拨号方式获取一个临时公网IP地址进行外网的访问。

1.4 扩展:SNAT与DNAT区别

  1. SNAT是私网访问外网时,报文中源IP地址(私网IP地址)转换为公网IP地址过程。此转换可以使用静态、动态等转换方式,且内部的多台主机共用同一公网IP地址进行外网访问。
  2. DNAT是外网访问私网时,报文中目的IP地址(公网IP地址)转换为私网IP地址过程。此转换过程可以使用静态、动态、端口等转换方式。

1.5 实例

公司(有固定公网IP地址)上网访问某网站简易过程

  1. PC访问 www.xxxxxxx.com ,由于存在域名会通过DNS服务器解析域名从而获得公网IP地址。
  2. PC收到此网站的公网IP地址后,封装数据。源IP为PC的IP地址;目的地址为解析获得的公网IP地址;目的端口号为80。并且将此报文发送给网关设备, 网关设备收到数据报文后通过路由关系发送到出口设备。
  3. 出口设备配置有NAT转换关系,将报文中的源IP地址转换为公网IP地址。重新封装数据报文后发出。(这一步为SNAT)
  4. 数据报文到达公有网络上,由于目的IP地址为公网IP地址,通过公网路由关系转发到网站端(服务端)。
  5. 服务端收到报文后,检查到目的地址为公网IP地址。通过本端配置的NAT映射关系,与公网IP地址相匹配的映射关系中寻找私网IP地址。找到映射关系后,将目的地址转换为私网IP地址(这一步为DNAT)。在通过内部网络路由关系将数据报文转发至相应的服务器。
  6. 服务器将收到的报文通过相关计算,重新封装报文,发送给用户PC。原理不变,经过多次数据交互。最后用户PC接收到数据报文,网站就被打开了。

2、iptables实现SNAT和DNAT,并对规则持久保存

实现SNAT和DNAT都需要开启内核数据转发功能

[root@localhost ~]# vim /etc/sysctl.conf
# 把下列选项改正1
net.ipv4.ip_forward=0
...
net.ipv4.ip_forward=1

2.1 SNAT

基于nat表的target,适用于固定的公网IP

SNAT选项:

  • --to-source [ipaddr[-ipaddr]][:port[-port]]
  • --random

语法:

iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP

范例:

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.122.103

2.2 DNAT

nat表的target,适用于端口映射,即可重定向到本机,也可以支持重定向至不同主机的不同端口,但不支持多目标,即不支持负载均衡功能

DNAT选项:

  • --to-destination [ipaddr[-ipaddr]][:port[-port]]

DNAT语法:

iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --todestination InterSeverIP[:PORT]

范例:

[root@localhost ~]# iptables -t nat -A PREROUTING -d 192.168.122.103 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.6:80

2.3 iptables规则持久保存:

CentOS 7、8

iptables-save > /PATH/TO/SOME_RULES_FILE

CentOS 6

# 将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables save

2.4 加载规则

2.4.1 CentOS 7、8 重新载入预存规则文件中规则:
iptables-restore < /PATH/FROM/SOME_RULES_FILE

iptables-restore选项

  • -n, --noflush:不清除原有规则
  • -t, --test:仅分析生成规则集,但不提交
2.4.2 CentOS 6:
service iptables  restart       
#会自动从/etc/sysconfig/iptables 重新载入规则

2.5 开机自动重载规则

2.5.1 用脚本保存各iptables命令;让此脚本开机后自动运行
/etc/rc.d/rc.local文件中添加脚本路径 /PATH/TO/SOME_SCRIPT_FILE

用规则文件保存各规则,开机时自动载入此规则文件中的规则

在/etc/rc.d/rc.local文件添加

iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
2.5.2 定义Unit File, CentOS 7,8 可以安装 iptables-services 实现iptables.service

范例: CentOS 7,8 使用 iptables-services

[root@centos8 ~]# yum -y install iptables-services
 
[root@centos8 ~]# cp /etc/sysconfig/iptables{,.bak}
 
#保存现在的规则到文件中方法1
 
[root@centos8 ~]# /usr/libexec/iptables/iptables.init save
 
#保存现在的规则到文件中方法2
 
iptables-save > /etc/sysconfig/iptables
 
#开机启动
 
[root@centos8 ~]# systemctl enable iptables.service 

3、LVS调度算法总结

3.1 LVS的结构

LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群。当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。

3.2 LVS内核模型

1.当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。

2.当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。

3.LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将被放行至用户空间。

4.如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。

5.最后经由POSTROUTING链发往后端服务器。

3.3 LVS的包转发模型

3.3.1 NAT模型:
  1. 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。
  2. 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
  3. 报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。
  4. 然后lvs将此报文的源地址修改为本机并发送给客户端。

注意:在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端。

3.3.2 DR模型:
  1. 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
  2. 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。
  3. RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。

注意:需要设置lo接口的VIP不能响应本地网络内的arp请求。

3.3.3 TUN模型:

①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。

③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。

注意:需要设置lo接口的VIP不能在共网上出现。

3.4 LVS的调度算法

LVS的调度算法分为静态与动态两类。

3.4.1 静态算法(4种):只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况
  1. RR:轮叫调度(Round Robin)
      调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
  2. WRR:加权轮叫(Weight RR)
      调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
  3. DH:目标地址散列调度(Destination Hash )
      根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
  4. SH:源地址 hash(Source Hash)
      源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
3.4.2 动态算法(6种):前端的调度器会根据后端真实服务器的实际连接情况来分配请求
  1. LC:最少链接(Least Connections)
      调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
  2. WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)
      在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
  3. SED:最短延迟调度(Shortest Expected Delay )
      在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。
  4. NQ永不排队/最少队列调度(Never Queue Scheduling NQ)
      无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。
  5. LBLC:基于局部性的最少链接(locality-Based Least Connections)
      基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
  6. LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)
      带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

你可能感兴趣的:(NAT原理总结)