graph TB
A[网络 A 192.168.1.0/24] --> B[网关 192.168.1.1]
B --> C[网络 B 10.0.0.0/24]
B --> D[互联网]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccccff
style D fill:#ffffcc
网关的功能
路由转发:在不同网络间转发数据包
协议转换:转换不同网络协议
地址转换:NAT(网络地址转换)
安全控制:防火墙、访问控制
流量管理:QoS、流量整形
默认网关
默认网关是当目标地址不在本地网络时,数据包发送的目标。
1 2 3 4 5 6 7 8
# 查看默认网关 ip route show default
# 输出示例 default via 192.168.1.1 dev eth0
# 或使用 route 命令 route -n
什么是二层网关
二层网关(Layer 2 Gateway)工作在网络的数据链路层(OSI 第二层),基于 MAC 地址进行转发。
二层网关的特点
MAC 地址转发:基于 MAC 地址表转发
广播域:在同一广播域内
透明桥接:对上层协议透明
学习功能:学习 MAC 地址和端口映射
二层网关的工作原理
sequenceDiagram
participant A as 主机 A
participant G as 二层网关
participant B as 主机 B
A->>G: 发送数据帧(目标 MAC: B)
G->>G: 查找 MAC 地址表
G->>B: 转发数据帧
B->>G: 返回响应
G->>A: 转发响应
二层网关的应用
交换机:传统二层交换机
虚拟交换机:Open vSwitch、Linux Bridge
VLAN 网关:VLAN 间的通信
什么是三层网关
三层网关(Layer 3 Gateway)工作在网络层(OSI 第三层),基于 IP 地址进行路由转发。
三层网关的特点
IP 地址路由:基于 IP 地址和路由表
跨网络通信:可以连接不同网段
路由协议:支持动态路由协议
NAT 功能:网络地址转换
三层网关的工作原理
graph TB
A[网络 A 192.168.1.0/24] --> G[三层网关 路由器]
G --> B[网络 B 10.0.0.0/24]
G --> C[网络 C 172.16.0.0/24]
G --> D[互联网]
G --> E[路由表]
E --> F[192.168.1.0/24 → eth0]
E --> F1[10.0.0.0/24 → eth1]
E --> F2[0.0.0.0/0 → eth2]
style A fill:#ffcccc
style G fill:#ccffcc
style E fill:#ccccff
三层网关的功能
1. 路由转发
1 2 3 4 5 6 7
# 查看路由表 ip route show
# 输出示例 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1 10.0.0.0/24 via 10.0.0.1 dev eth1 default via 203.0.113.1 dev eth2
# 拒绝特定流量 iptables -A FORWARD -s 192.168.1.0/24 -d 10.0.0.0/24 -j DROP
三层网关的应用
路由器:传统网络路由器
Linux 路由器:使用 Linux 系统作为路由器
云网关:云平台的虚拟网关
SDN 网关:软件定义网络网关
二层网关 vs 三层网关
特性
二层网关
三层网关
工作层次
数据链路层(L2)
网络层(L3)
转发依据
MAC 地址
IP 地址
广播域
同一广播域
不同广播域
路由功能
无
有
NAT 功能
无
有
典型设备
交换机
路由器
网桥
什么是网桥
网桥(Bridge)是连接两个或多个网段的设备,工作在数据链路层,基于 MAC 地址转发数据帧。
graph TB
A[网段 A] --> B[网桥]
C[网段 B] --> B
B --> D[统一网段]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccccff
style D fill:#ffffcc
网桥的功能
帧转发:根据 MAC 地址转发数据帧
帧过滤:过滤不需要转发的帧
学习功能:学习 MAC 地址和端口映射
环路防止:STP(生成树协议)防止环路
网桥的工作原理
sequenceDiagram
participant A as 主机 A
participant B as 网桥
participant C as 主机 C
A->>B: 发送数据帧(目标 MAC: C)
B->>B: 查找 MAC 地址表
alt MAC 地址在表中
B->>C: 转发到对应端口
else MAC 地址不在表中
B->>B: 广播到所有端口(除源端口)
B->>B: 学习 MAC 地址
end
graph TB
A[数据包] --> B[路由表]
B --> C{匹配路由规则}
C -->|匹配| D[转发到对应接口]
C -->|不匹配| E[使用默认路由]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccccff
路由表的作用
路径选择:选择数据包的最佳路径
网络隔离:区分不同网段
流量控制:控制数据流向
负载均衡:在多条路径间分配流量
路由表的组成
路由表通常包含以下字段:
目标网络:目标网络地址和子网掩码
网关:下一跳地址
接口:发送数据包的接口
度量值:路由的优先级(metric)
标志:路由的状态标志
查看路由表
Linux 系统
1 2 3 4 5 6 7 8
# 使用 ip 命令 ip route show
# 输出示例 default via 192.168.1.1 dev eth0 proto static 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 10.0.0.0/24 via 10.0.0.1 dev eth1 proto static metric 100 172.16.0.0/16 via 172.16.0.1 dev eth2 proto static metric 200
使用 route 命令
1 2 3 4 5 6 7 8 9 10
# 查看路由表 route -n
# 输出示例 Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 10.0.0.0 10.0.0.1 255.255.255.0 UG 100 0 0 eth1 172.16.0.0 172.16.0.1 255.255.255.0 UG 200 0 0 eth2
路由类型
1. 主机路由
1 2 3 4 5
# 添加主机路由 ip route add 192.168.1.50 via 10.0.0.1 dev eth1
# 删除主机路由 ip route del 192.168.1.50
2. 网络路由
1 2 3 4 5
# 添加网络路由 ip route add 10.0.0.0/24 via 10.0.0.1 dev eth1
# 删除网络路由 ip route del 10.0.0.0/24
3. 默认路由
1 2 3 4 5
# 添加默认路由 ip route add default via 192.168.1.1 dev eth0
# 或使用简写 ip route add default via 192.168.1.1
4. 直连路由
1 2 3 4
# 直连路由(自动生成) # 当配置 IP 地址时自动创建 ip addr add 192.168.1.100/24 dev eth0 # 自动创建:192.168.1.0/24 dev eth0 scope link
路由优先级
路由表按照以下顺序匹配:
主机路由:最精确的匹配
网络路由:根据子网掩码匹配
默认路由:0.0.0.0/0(最后匹配)
1 2 3 4 5 6 7
# 查看路由优先级 ip route show table main
# 使用 metric 设置优先级 ip route add 10.0.0.0/24 via 10.0.0.1 dev eth1 metric 100 ip route add 10.0.0.0/24 via 10.0.0.2 dev eth2 metric 200 # metric 值越小,优先级越高
多路由表
Linux 支持多个路由表。
1 2 3 4 5 6 7 8 9 10 11
# 查看所有路由表 ip route show table all
# 使用特定路由表 ip route show table 100
# 添加路由到特定表 ip route add 10.0.0.0/24 via 10.0.0.1 dev eth1 table 100
# 使用路由规则 ip rule add from 192.168.1.0/24 table 100
# 添加静态路由 ip route add 10.0.0.0/24 via 10.0.0.1 dev eth1
# 添加永久路由(CentOS/RHEL) echo"10.0.0.0/24 via 10.0.0.1 dev eth1" >> /etc/sysconfig/network-scripts/route-eth1
# 添加永久路由(Debian/Ubuntu) echo"up ip route add 10.0.0.0/24 via 10.0.0.1 dev eth1" >> /etc/network/interfaces
删除路由
1 2 3 4 5
# 删除路由 ip route del 10.0.0.0/24
# 清空路由表 ip route flush table main
修改路由
1 2 3
# 修改路由(先删除再添加) ip route del 10.0.0.0/24 ip route add 10.0.0.0/24 via 10.0.0.2 dev eth2
网络通信流程
数据包转发流程
sequenceDiagram
participant A as 源主机
participant B as 网关/路由器
participant C as 目标主机
A->>A: 检查目标 IP
A->>A: 查询路由表
alt 目标在同一网段
A->>C: 直接发送(ARP 获取 MAC)
else 目标在不同网段
A->>B: 发送到网关(使用网关 MAC)
B->>B: 查询路由表
B->>C: 转发数据包
C->>B: 返回响应
B->>A: 转发响应
end
ARP 协议
ARP(Address Resolution Protocol)用于将 IP 地址解析为 MAC 地址。
1 2 3 4 5 6 7 8 9
# 查看 ARP 表 arp -a
# 输出示例 ? (192.168.1.1) at 00:11:22:33:44:55 [ether] on eth0 ? (192.168.1.100) at aa:bb:cc:dd:ee:ff [ether] on eth0
# 使用 ip 命令 ip neigh show
完整通信示例
同网段通信
1 2 3 4 5 6 7 8 9 10 11 12
# 主机 A: 192.168.1.100 # 主机 B: 192.168.1.200
# 1. 主机 A 查询路由表 ip route get 192.168.1.200 # 结果:192.168.1.200 dev eth0 src 192.168.1.100