前言
网络传输的本质:类似收发快递,是在两点之间的网络中寻找目的地址的过程;
数据想要在数据链路层传输,需要被封装为数据帧,数据帧中包含源IP、目的IP、源MAC、目的MAC
当我们在浏览器中输入1个网站后,会通过公共的DNS服务可以查询到该域名对应的IP地址,也就是目的IP地址;
但目的MAC地址是怎么获取到的?
一、ARP协议
ARP协议全称:地址解析协议,简称ARP(Address Resolution Protocol),是根据IP地址获取物理MAC地址的1个TCP/IP协议。
1.ARP由来
如上图所示
在IP1和IP2之间进行网络传输的过程,是经过多个路由器分阶段完成的;
路由器中的路由表可以通过路由计算知道:去往目的IP地址需要经过哪个下一跳IP地址转发出去,但是不知道该下一跳具体的物理MAC地址?
在逐段传输的过程中目的IP地址和源IP地址一直不变(使用NAT除外)
路由器在同网段中发送ARP广播查询路由器接口(下一跳)的物理MAC地址,目的MAC和源MAC地址一直发生变化;
在网络中,采用路由IP逻辑寻址+ARP MAC物理地址寻址机制;
完成端到端,进入目的端后,继续点到点数据传输;
2.ARP缓存表
在网络中,只要具备发送和接收数据功能的设备都会维护1个ARP表,起到ARP信息缓存的作用;
ARP表中保存着主机和路由器IP地址与物理MAC地址的映射表;
接口: 192.168.56.1 --- 0xb Internet 地址 物理地址 类型 192.168.56.255 ff-ff-ff-ff-ff-ff 静态 224.0.0.2 01-00-5e-00-00-02 静态 224.0.0.22 01-00-5e-00-00-16 静态 224.0.0.251 01-00-5e-00-00-fb 静态 224.0.0.252 01-00-5e-00-00-fc 静态 239.255.255.250 01-00-5e-7f-ff-fa 静态 接口: 192.168.57.1 --- 0xf Internet 地址 物理地址 类型 192.168.57.255 ff-ff-ff-ff-ff-ff 静态 224.0.0.2 01-00-5e-00-00-02 静态 224.0.0.22 01-00-5e-00-00-16 静态 224.0.0.251 01-00-5e-00-00-fb 静态 224.0.0.252 01-00-5e-00-00-fc 静态 239.255.255.250 01-00-5e-7f-ff-fa 静态 接口: 192.168.0.168 --- 0x11 Internet 地址 物理地址 类型 192.168.0.1 64-e1-72-e3-e4-b3 动态 192.168.0.255 ff-ff-ff-ff-ff-ff 静态 224.0.0.2 01-00-5e-00-00-02 静态 224.0.0.22 01-00-5e-00-00-16 静态 224.0.0.251 01-00-5e-00-00-fb 静态 224.0.0.252 01-00-5e-00-00-fc 静态 239.255.255.250 01-00-5e-7f-ff-fa 静态 255.255.255.255 ff-ff-ff-ff-ff-ff 静态
ARP表中的每1条映射条目都可以设置过期时间,超过该时间该路由条目将从ARP缓存表中被删除;
当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,首先查询本机的ARP表中,也就是根据主机B的IP地址查找其对应的物理地址。
- 如找到,就将此物理MAC地址写入数据帧,然后通过局域网将该数据帧发送到此物理地址。
- 若没有找到主机 B 的 IP 地址的项目,主机 A 就启动 ARP,来找出主机 B 的物理地址。
3.ARP特点
通过以上对ARP的理解得出ARP具备以下特点
- ARP缓存
- ARP不会直接查询目的IP对应的目的MAC地址
- ARP同1网段中广播,被路由器隔断
4.总结
MAC地址+ARP:解决网络中点到点传输(完成短期目标)
IP地址+路由+MAC地址+ARP:完成网络中端到端的传输(完成长期目标)
二、ARP工作流程
ARP协议全称:地址解析协议,简称ARP(Address Resolution Protocol),是根据IP地址获取物理MAC地址的1个TCP/IP协议。
只要接入网络的设备,具备发送和接收数据的功能就会在该设备内部维护1张ARP表。
1.子网内通信
多个设备接入1个交换机, 它们之间的通信称为子网内通信;
数据发送方发送ARP广播通过交换机换发ARP广播到所以子网内设备
数据接收方通过单波应答自己的MAC地址给发送方;
2.跨子网通信
2个不同网段的局域网,通过1个3层路由器连接并配置路由,组成的局域网其实还是局域网,它们之间的通信称为跨子网通信;
通常情况下,在局域网中的设备都会配置1个默认网关;
数据发送方发送的ARP广播跨子网,由局域网内的默认网关修改源MAC为默认网关的物理MAC地址、目标MAC为默认网关下一跳的地址,封装成新的数据帧,进行物理层传输;
3.跨互联网通信
2个局域网,通过运营商网络连接,它们之间的通信称为跨互联网通信;
2个局域网想要跨互联网进行网络通信,必需使用公网IP,因为公网IP有限,运营商网络不干涉内网IP的路由配置,除非专线;
NAT-Network Address Translation是指网络地址转换;
NAT是用于在局域网络中使用私有IP地址,连接互联网时,转而使用全局IP地址的技术。
NAT实际上是为解决IPv4地址短缺而开发的技术。
如果我在家庭内网使用内网IP为192.168.1.10的PC,通过内网的默认网关(192.168.1.254) 访问了www.baidu.com;
默认网关会把我PC的内网IP(192.168.1.10)的源IP转换成了默认网关的公网IP;
当百度的服务器响应的数据包,再次回到内网的默认网关,那默认网关如何,把响应报文再次转发到内网中的PC呢?
这就需要默认网关支持NAT技术;
三、ARP攻击
采用手工配置静态ARP表可以防止ARP攻击;
1.ARP恶意代理
伪造网关响应ARP广播,所有传输数据都经过该恶意代理
2.篡改ARP表
篡改网络设备中的ARP表使其找不到代理网关,无法上网;
3.ARP欺骗(VIP自动切换)
KeepAlived的虚IP自动切换,其实现原理主要是靠TCP/IP的ARP协议。
IP地址只是1个动态的逻辑地址,在以太网中MAC地址才是固定且真正用来进行数据传输的物理地址;
每台主机中都有一个ARP高速缓存,存储同一个网络内的IP地址与MAC地址的对应关系;
以太网中的主机发送数据时会先从这个缓存中查询目标IP对应的MAC地址,然后向这个MAC地址发送数据。
操作系统会自动维护这个缓存,这就是实现VIP自动切换的关键。
1.当前客户端PC的ARP缓存表的内容。
(192.168.1.219) at 00:21:5A:DB:68:E8 [ether] on bond0
(192.168.1.217) at 00:21:5A:DB:68:E8 [ether] on bond0
(192.168.1.218) at 00:21:5A:DB:7F:C2 [ether] on bond0
192.168.1.217、192.168.1.218是2台数据库服务器的真实IP地址,
- 192.168.1.217为对外提供数据库服务的主机。
- 192.168.1.218为热备的机器。
- 192.168.1.219为虚IP。
大家注意红字部分:219、217的MAC地址是相同的。
再看看那217宕机后的arp缓存
(192.168.1.219) at 00:21:5A:DB:7F:C2 [ether] on bond0
(192.168.1.217) at 00:21:5A:DB:68:E8 [ether] on bond0
(192.168.1.218) at 00:21:5A:DB:7F:C2 [ether] on bond0
当218发现217宕机后会向网络广播1个ARP数据包;
告诉所有局域网中所有主机192.168.1.219这个IP对应的MAC地址是00:21:5A:DB:7F:C2;
这样所有发送到219的数据包都会发送到MAC地址为00:21:5A:DB:7F:C的机器,也就是92.168.1.218这台服务器。
4.免费ARP
当网络设备重启/网卡更新IP地址后,网卡会发送免费ARP请求,探测本机的IP地址在广播域内是否冲突?
告知其他网络节点自己的IP地址和MAC地址、更新其他网络节点的ARP缓存表;
四、LVS和ARP
LVS的DR模式下,每个RealServer都需要设置1个IP地址相同VIP;
如何保证在同1子网内,多个服务器网卡相同IP地址不造成IP地址冲突呢?
net.ipv4.conf.all.arp_ignore=1 net.ipv4.conf.all.arp_announce=2 net.ipv4.conf.all.rp_filter=2 3个内核参数齐用,实现每1块网卡上的IP,响应自身 MAC地址。
1.ip_forward
在LVS的NAT模式下需要开启此Linux内核设置;
ip_forward是开启Linux内核实现路由转发功能的参数;
出于安全考虑,Linux内核默认是禁止数据包转发的,毕竟服务器不是路由器。
所谓数据报转发即当1台主机拥有2块以上网卡时;
其中1块收到数据包,Linux内核会根据数据包中包含的目的IP地址,将该数据包发往本机另1块网卡中,该网卡根据路由表继续发送数据包。
2.arp_ignore
arp_ignore参数的作用是控制系统在收到外部的arp广播请求时,是否要返回arp响应?
参数值
0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。
1:只响应目的IP地址为接收网卡上的本地地址的arp请求。
2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。
3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
4~7:保留未使用
8:不回应所有的arp请求
示例
1.arp_ignore=0
当arp_ignore=0时,当eth1网卡收到目的IP地址为Lo环回网卡IP地址的arp请求,eth1网卡也会返回arp响应,把自己的MAC地址告诉对端;
2.arp_ignore=1
当arp_ignore=1时,eth1网卡上收到目的IP为环回网卡IP的arp请求,发现请求的IP不是自己网卡上的IP,不会回arp响应
3.arp_announce
arp_announce的作用是控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址。
参考值
0:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用数据包的源IP。
1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。
2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。
示例
1.arp_announce=0
当arp_announce参数配置为0时;
系统要发送的IP包源地址为eth1的IP地址,IP包目的地址根据路由表查询判断需要从eth2网卡发出;
这时会先从eth2网卡发起1个arp请求,用于获取目的IP地址的MAC地址。
该arp请求的源MAC是eth2网卡的MAC地址,但源IP地址会选择eth1网卡的地址。
2.arp_announce=2
当arp_announce参数配置为2时,eth2网卡发起arp请求时,源MAC是eth2网卡的MAC地址,源IP地址会选择eth2网卡自身的IP地址。
4.rp_filter
rp_filter参数用于控制系统是否开启对数据包源地址的校验。
即rp_filter参数有三个值,0、1、2,具体含义:
0:不开启源地址校验。
1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。
rp_filter参数示例
RP全程revores path,反向路由路径检查;
当Linux服务器其中1块网卡收到1个数据包时,会进行反向检测,检查本机否有路由可以响应该数据包的源IP地址?
假设机器有2个网口:
eth0: 192.168.1.100
eth1:200.153.1.122
数据包源IP:10.75.153.98,目的IP:200.153.1.122 eth1的IP地址
系统路由表配置为:
[root@localhost ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.234 0.0.0.0 UG 0 0 0 eth0
192.168.120.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.75.153.98 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Linux系统内核的rp_filter参数的配置为1:
[root@localhost ~]# sysctl -a | grep rp_filter
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
如上所示,数据包发到了eth1网卡,如果这时候开启了rp_filter参数,并配置为1,则系统会严格校验数据包的反向路径。
从路由表中可以看出,响应时该数据包要从eth0网卡出,接收数据包进的网卡,发送数据包出的网卡不是同1个网卡,这时候系统会判断该反向路径不是最佳路径,而直接丢弃该请求数据包。(业务进程也收不到该请求数据包)
开启rp_filter参数的作用
1. 减少DDoS攻击
校验数据包的反向路径,如果反向路径不合适,则直接丢弃数据包,避免过多的无效连接消耗系统资源。
2. 防止IP Spoofing
校验数据包的反向路径,如果客户端伪造的源IP地址对应的反向路径不在路由表中,或者反向路径不是最佳路径,则直接丢弃数据包,不会向伪造IP的客户端回复响应。
Ps:两种常见的非法攻击手段:
1. DDos攻击(Distribute Deny of Service)
分布式拒绝服务攻击。通过构造大量的无用数据包向目标服务发起请求,占用目标服务主机大量的资源,还可能造成网络拥塞,进而影响到正常用户的访问。
2. IP Spoofing(IP欺骗)
IP Spoofing指一个客户端通过伪造源IP,冒充另外一个客户端与目标服务进行通信,从而达到某些不可告人的秘密。
五、KeepAlived和ARP
KeeplAlived是实现HA集群的一种方式,一般采用2台机器同时完成一项功能,比如数据库/反向代理服务器;
平常只有1台机器对外提供服务,另1台机器作为热备,当这台机器出现故障时,自动动态切换到另一台热备的机器。
KeepAlived是怎么实现故障检测的?
心跳,采用定时发送1个数据包,如果机器多长时间没响应,就认为是发生故障,自动切换到热备的机器上去。
1.KeepAlived怎么实现虚IP在同1个局域网内自动切换的呢?
所有对外提供数据库服务的服务器除了有1个真实IP外还有1个统一的虚IP,使用这两个IP中的任意1个都可以连接到这台数据库服务器上;
所有项目中数据库链接一项配置的都是这1个虚IP,当服务器发生故障无法对外提供服务时,动态将这个虚IP切换到备用主机。
2.KeepAlived怎么实现虚IP跨互联网自动切换的呢?
VXLAN(Virtual Extensible Local Area Network)是1种虚拟的、可扩展的本地局域网络; 本质上是1种隧道技术;
VXLAN将L2数据链路层的以太帧,封装为传输层UDP报文(即L2overL4)中,并在L3网络层中,传输到对端,实现了虚拟的、可跨互联网扩展的本地局域网络;