详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

本文详细介绍了交换机、路由器等网络设备的工作原理,包括MAC地址表的学习机制、ARP缓存表的作用及路由表的构建方式。

转自:http://www.educity.cn/net/1284034.html

一:MAC地址表详解

  说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的。在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的。

  交换机的工作原理

  交换机在接收到数据帧以后,首先、会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着、会检查自己的MAC表中是否有数据帧中目标MAC地址的信息,如果有则会根据MAC表中记录的对应接口将数据帧发送出去(也就是单播),如果没有,则会将该数据帧从非接受接口发送出去(也就是广播)。

  如下图:详细讲解交换机传输数据帧的过程
这里写图片描述
 1)主机A会将一个源MAC地址为自己,目标MAC地址为主机B的数据帧发送给交换机。

  2)交换机收到此数据帧后,首先将数据帧中的源MAC地址和对应的接口(接口为f 0/1) 记录到MAC地址表中。

  3)然后交换机会检查自己的MAC地址表中是否有数据帧中的目标MAC地址的信息,如果有,则从MAC地址表中记录的接口发送出去,如果没有,则会将此数据帧从非接收接口的所有接口发送出去(也就是除了f 0/1接口)。

  4)这时,局域网的所有主机都会收到此数据帧,但是只有主机B收到此数据帧时会响应这个广播,并回应一个数据帧,此数据帧中包括主机B的MAC地址。

  5)当交换机收到主机B回应的数据帧后,也会记录数据帧中的源MAC地址(也就是主机B的MAC地址),这时,再当主机A和主机B通信时,交换机根据MAC地址表中的记录,实现单播了。

  如下图:当局域网存在多个交换机互联的时候,交换机的MAC地址表是怎么记录的呢?
这里写图片描述

1)主机A将一个源MAC地址为自己,目标MAC地址主机C的数据帧发送给交换机

  2)交换机1收到此数据帧后,会学习源MAC地址,并检查MAC地址表,发现没有目标MAC地址的记录,则会将数据帧广播出去,主机B和交换机2都会收到此数据帧。

  3)交换机2收到此数据帧后也会将数据帧中的源MAC地址和对应的接口记录到MAC地址表中,并检查自己的MAC地址表,发现没有目标MAC地址的记录,则会广播此数据帧。

  4)主机C收到数据帧后,会响应这个数据帧,并回复一个源MAC地址为自己的数据帧,这时交换机1和交换机1都会将主机C的MAC地址记录到自己的MAC地址表中,并且以单播的形式将此数据帧发送给主机A。

  5)这时,主机A和主机C通信就是一单播的形式传输数据帧了,主机B和主机C通信如上述过程一样,因此交换机2的MAC地址表中记录着主机A和主机B的MAC地址都对应接口f 0/1。

  总结:从上面的两幅图可以看出,交换机具有动态学习源MAC地址的功能,并且交换机的一个接口可以对应多个MAC地址,但是一个MAC地址只能对应一个接口。

  注意:交换机动态学习的MAC地址默认只有300S的有效期,如果300S内记录的MAC地址没有通信,则会删除此记录。

二、ARP缓存表详解

  上面我们讲解了交换机的工作原理,知道交换机是通过MAC地址通信的,但是我们是如何获得目标主机的MAC地址呢?这时我们就需要使用ARP协议了,在每台主机中都有一张ARP表,它记录着主机的IP地址和MAC地址的对应关系。

  ARP协议:ARP协议是工作在网络层的协议,它负责将IP地址解析为MAC地址。

  如下图:详细讲解ARP的工作原理。
这里写图片描述
 1)如果主机A想发送数据给主机B,主机A首先会检查自己的ARP缓存表,查看是否有主机B的IP地址和MAC地址的对应关系,如果有,则会将主机B的MAC地址作为源MAC地址封装到数据帧中。如果没有,主机A则会发送一个ARP请求信息,请求的目标IP地址是主机B的IP地址,目标MAC地址是MAC地址的广播帧(即FF-FF-FF-FF-FF-FF),源IP地址和MAC地址是主机A的IP地址和MAC地址。

  2)当交换机接受到此数据帧之后,发现此数据帧是广播帧,因此,会将此数据帧从非接收的所有接口发送出去。

  3)当主机B接受到此数据帧后,会校对IP地址是否是自己的,并将主机A的IP地址和MAC地址的对应关系记录到自己的ARP缓存表中,同时会发送一个ARP应答,其中包括自己的MAC地址。

  4)主机A在收到这个回应的数据帧之后,在自己的ARP缓存表中记录主机B的IP地址和MAC地址的对应关系。而此时交换机已经学习到了主机A和主机B的MAC地址了。

三、路由表详解

  路由器负责不同网络之间的通信,它是当今网络中的重要设备,可以说没有路由器就没有当今的互联网。在路由器中也有一张表,这张表叫路由表,记录着到不同网段的信息。路由表中的信息分为直连路由和非直连路由。

  直连路由:是直接连接在路由器接口的网段,由路由器自动生成。

  非直连路由:就是不是直接连接在路由器接口上的网段,此记录需要手动添加或者是使用动态路由。

  路由表中记录的条目有的需要手动添加(称为静态路由),有的测试动态获取的(称为动态路由)。直连路由属于静态路由。

  路由器是工作在网络层的,在网络层可以识别逻辑地址。当路由器的某个接口收到一个包时,路由器会读取包中相应的目标的逻辑地址的网络部分,然后在路由表中进行查找。如果在路由表中找到目标地址的路由条目,则把包转发到路由器的相应接口,如果在路由表中没有找到目标地址的路由条目,那么,如果路由配置默认路由,就科举默认路由的配置转发到路由器的相应接口;如果没有配置默认路由,则将该包丢弃,并返回不可到达的信息。这就是数据路由的过程。

  如下图:详细介绍路由器的工作原理
这里写图片描述

 1)HostA在网络层将来自上层的报文封装成IP数据包,其中源IP地址为自己,目标IP地址是HostB,HostA会用本机配置的24位子网掩码与目标地址进行“与”运算,得出目标地址与本机不是同一网段,因此发送HostB的数据包需要经过网关路由A的转发。

  2)HostA通过ARP请求获取网关路由A的E0口的MAC地址,并在链路层将路由器E0接口的MAC地址封装成目标MAC地址,源MAC地址是自己。

  3)路由器A从E0可接收到数据帧,把数据链路层的封装去掉,并检查路由表中是否有目标IP地址网段(即192.168.2.2的网段)相匹配的的项,根据路由表中记录到192.168.2.0网段的数据请发送给下一跳地址10.1.1.2,因此数据在路由器A的E1口重新封装,此时,源MAC地址是路由器A的E1接口的MAC地址,封装的目标MAC地址则是路由器2的E1接口的MAC地址。

  4)路由B从E1口接收到数据帧,同样会把数据链路层的封装去掉,对目标IP地址进行检测,并与路由表进行匹配,此时发现目标地址的网段正好是自己E0口的直连网段,路由器B通过ARP广播,获知HostB的MAC地址,此时数据包在路由器B的E0接口再次封装,源MAC地址是路由器B的E0接口的MAC地址,目标MAC地址是HostB的MAC地址。封装完成后直接从路由器的E0接口发送给HostB。

  5)此时HostB才会收到来自HostA发送的数据。

  总结:路由表负责记录一个网络到另一个网络的路径,因此路由器是根据路由表工作的。

<think>我们首先需要明确:在Linux网关(Gateway)上,报文的路由查询和Netfilter处理流程是紧密交织的。Netfilter框架定义了五个钩子点(即五链),并关联了四张(filter, nat, mangle, raw)。以下是具体流程: ### 报文处理流程(以网关转发为例) 假设报文从网卡eth0进入,目标地址是另一网段,需要从eth1转发出去。 #### 1. **入口(Ingress)处理** - **物理层**:报文到达eth0。 - **数据链路层**:拆解MAC头,若目标MAC是网关自身或广播,则上传至网络层。 #### 2. **网络层(IP层)处理** - **Netfilter钩子:PREROUTING链** - 经过`raw`:决定是否跳过连接跟踪(`NOTRACK`目标)。 - 经过`mangle`:修改TOS、TTL等标记。 - 经过`nat`(DNAT):修改目标IP(端口映射等)。 - **路由决策(第一次)**:根据目标IP查询路由表,确定报文是发给本机还是转发。 - 本例为转发,因此进入`FORWARD`路径。 #### 3. **转发路径(FORWARD)** - **Netfilter钩子:FORWARD链** - 经过`mangle`:再次修改标记。 - 经过`filter`:决定是否允许转发(ACCEPT/DROP)。 - 注意:此处不经过`nat`(DNAT已在PREROUTING完成)。 #### 4. **出口(Egress)处理** - **路由决策(第二次)**:确定从哪个接口(eth1)发出,并填充源MAC(网关自身MAC)。 - **Netfilter钩子:POSTROUTING链** - 经过`mangle`:出口前的最后标记修改。 - 经过`nat`(SNAT):修改源IP(地址伪装)。 - **数据链路层**:封装目标MAC(通过ARP获取),从eth1发出。 ### 四五链的完整交互流程 | 钩子点(链) | raw | mangle | nat | filter | |--------------------|-------|----------------|----------------|----------| | **PREROUTING** | ✓ | ✓(修改标记) | ✓(DNAT/重定向) | ✗ | | **INPUT** | ✗ | ✓(修改标记) | ✓(目标NAT) | ✓(过滤)| | **FORWARD** | ✗ | ✓(修改标记) | ✗ | ✓(过滤)| | **OUTPUT** | ✓ | ✓(修改标记) | ✓(源/目标NAT)| ✓(过滤)| | **POSTROUTING** | ✗ | ✓(修改标记) | ✓(SNAT/MASQUERADE) | ✗ | ### 关键说明 1. **连接跟踪(Conntrack)**: - 在PREROUTING之前,系统会初始化连接跟踪(除非`raw`标记`NOTRACK`)。 - 后续流程中,NAT和过滤规则可依赖连接状态(如`NEW`, `ESTABLISHED`)。 2. **路由与Netfilter的交互**: - 路由查询发生在PREROUTING之后和POSTROUTING之前。 - 第一次路由(PREROUTING后)决定报文去向(INPUT/OUTPUT/FORWARD)。 - 第二次路由(POSTROUTING前)确定出口接口和下一跳。 3. **网关转发重点**: - DNAT在PREROUTING完成(改变目标地址)。 - SNAT在POSTROUTING完成(改变源地址)。 - FORWARD链的filter控制转发权限。 ### 示例命令(iptables) ```bash # DNAT:将访问1.1.1.1:80的包转发到10.0.0.2:80 iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp --dport 80 -j DNAT --to 10.0.0.2:80 # SNAT:转发时修改源IP为2.2.2.2 iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 2.2.2.2 # 允许转发(FORWARD链) iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT ``` §§相关问题§§ 1. DNAT和SNAT在Netfilter流程中的执行顺序是怎样的? 2. 如何通过iptables规则实现端口转发? 3. 连接跟踪(conntrack)在Netfilter的哪个阶段被创建? 4. 在PREROUTING链中修改TTL值会影响路由决策吗? 5. 如何禁止特定IP的报文通过网关转发?</think>### 报文在 Linux Gateway 上的路由查询及 Netfilter 处理流程(四五链详解) #### **核心流程概览** ```mermaid graph LR A[报文到达] --> B[PREROUTING链] B --> C{路由决策} C -->|本机处理| D[INPUT链] C -->|转发| E[FORWARD链] D --> F[本地进程] E --> G[POSTROUTING链] F --> H[OUTPUT链] H --> G G --> I[报文发出] ``` #### **具体处理流程(按四五链顺序)** 1. **PREROUTING 链(路由前处理)** - **raw**:连接跟踪豁免 ```bash nft add chain ip raw PREROUTING { type filter hook prerouting priority -300; } ``` - **mangle**:修改 TOS/TTL 等包头信息 - **nat**:DNAT 目标地址转换 ```bash iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.100 ``` 2. **路由决策点** - 内核查询路由表确定报文去向: ```bash ip route show # 查看路由表 ``` - 结果判断: - 目标为本机 → 进入 **INPUT 链** - 目标为其他网络 → 进入 **FORWARD 链** - 本机生成报文 → 进入 **OUTPUT 链** 3. **INPUT 链(本机接收处理)** - **mangle**:二次包头修改 - **filter**:安全过滤(ACCEPT/DROP) ```bash iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT ``` 4. **FORWARD 链(转发处理)** - **mangle**:流标记 - **filter**:转发策略控制 ```bash iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT ``` 5. **OUTPUT 链(本机发出处理)** - **raw**:连接跟踪豁免 - **mangle**:输出报文修改 - **nat**:SNAT/MASQUERADE ```bash iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ``` 6. **POSTROUTING 链(路由后处理)** - **mangle**:最终包头调整 - **nat**:源地址转换(SNAT) ```bash iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 1.2.3.4 ``` #### **四优先级顺序** | 类型 | 处理阶段 | 优先级 | 功能 | |---------|-----------------------|--------|--------------------------| | raw | PREROUTING/OUTPUT | -300 | 连接跟踪豁免 | | mangle | 所有五个链 | -150 | 包头修改/QoS | | nat | PREROUTING/OUTPUT/POSTROUTING | -100 | 地址转换 | | filter | INPUT/FORWARD/OUTPUT | 0 | 包过滤(ACCEPT/DROP) | #### **关键特性** 1. **连接跟踪(conntrack)** - 在 PREROUTING 后自动创建连接跟踪项 - 影响后续 NAT 和状态检测(`-m state --state ESTABLISHED`) 2. **路由与 Netfilter 交互** - 路由查询发生在 PREROUTING 之后 - POSTROUTING 前进行最终路由决策(选择出口接口) 3. **典型网关转发路径** ``` 网卡接收 → PREROUTING → 路由决策 → FORWARD → POSTROUTING → 网卡发送 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值