数据中心网络技术基础 —— 从原理到实操

数据中心网络技术基础 ------ 从原理到实操

本文为数据中心实训课程第2章(17课时)的学习笔记与实操记录,涵盖OSI/TCP-IP模型、数据链路层、IP地址、TCP/UDP、VLAN、链路聚合、路由、OSPF、ACL、NAT等网络技术,并在华为云ECS服务器上进行真实实操演示。

考试权重:20%(最重要网络章节) | 实操环境:Server-1(113.44.234.197) + Server-2(1.92.127.189)


目录


一、OSI七层模型与TCP/IP四层模型

1.1 OSI七层模型

层次 名称 功能 典型协议/设备
7 应用层 为用户应用提供网络服务 HTTP, FTP, DNS, SSH
6 表示层 数据格式转换、加密解密 SSL/TLS, JPEG
5 会话层 建立、维护、终止会话 NetBIOS, RPC
4 传输层 端到端可靠传输 TCP, UDP
3 网络层 路由选择、逻辑寻址 IP, ICMP, 路由器
2 数据链路层 帧封装、MAC寻址 Ethernet, 交换机
1 物理层 比特传输、物理介质 网线, 光纤

1.2 TCP/IP四层模型

TCP/IP层 对应OSI层 典型协议
应用层 5-7 HTTP, FTP, DNS, SSH
传输层 4 TCP, UDP
网络层 3 IP, ICMP, ARP
网络接口层 1-2 Ethernet, Wi-Fi

1.3 数据封装与解封装

封装(发送方,从上到下):应用数据 -> 加TCP头(Segment) -> 加IP头(Packet) -> 加以太网头(Frame)

解封装(接收方,从下到上):逐层去除头部,交给上层处理。

各层PDU(协议数据单元)对照:

层次 PDU名称 包含内容
应用层 Data/Message 原始数据
传输层 Segment(TCP)/Datagram(UDP) 端口号+数据
网络层 Packet IP头+端口+数据
链路层 Frame MAC头+IP头+端口+数据+FCS
物理层 Bit 0/1比特流

1.4 实操:查看系统网络协议栈

bash 复制代码
root@ecs-f5c0-fe31-0001:~# cat /proc/net/protocols | head -15

真实输出:

yaml 复制代码
protocol  size sockets  memory press maxhdr  slab module
QIPCRTR    784      0      -1   NI       0   yes  qrtr
PACKET    1536      1      -1   NI       0   no   kernel
MPTCPv6   2096      0     251   no       0   yes  kernel
PINGv6    1184      0      -1   NI       0   yes  kernel
RAWv6     1184      1      -1   NI       0   yes  kernel
UDPv6     1344      1       0   NI       0   yes  kernel
TCPv6     2496      1     251   no     320   yes  kernel
UNIX-STREAM 1024    115      -1   NI       0   yes  kernel
MPTCP     1936      0     251   no       0   yes  kernel
PING       976      0      -1   NI       0   yes  kernel

Linux内核支持TCP、UDP、UNIX套接字、MPTCP等多种协议。


二、数据链路层与交换机原理

2.1 MAC地址

MAC地址是网卡的物理地址,48位(6字节),如 fa:16:3e:26:7e:64。前24位为OUI(华为云OUI: fa:16:3e),后24位为序列号。

2.2 以太网帧结构

字段 长度 说明
目的MAC 6字节 接收方MAC
源MAC 6字节 发送方MAC
类型 2字节 0x0800=IP, 0x0806=ARP
数据 46-1500字节 负载
FCS 4字节 CRC32校验

2.3 交换机工作原理

  1. 学习:从源MAC学习端口映射
  2. 转发:查MAC表,已知单播,未知泛洪
  3. 泛洪:向所有端口(除接收端口)转发

2.4 实操:查看MAC地址和ARP

bash 复制代码
root@ecs-f5c0-fe31-0001:~# ip link show

真实输出:

bash 复制代码
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP
    link/ether fa:16:3e:26:7e:64 brd ff:ff:ff:ff:ff:ff
    altname enp0s3
    altname ens3
bash 复制代码
root@ecs-f5c0-fe31-0002:~# arp -n

真实输出:

css 复制代码
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.0.42             ether   fa:16:3e:26:7e:a8   C                     eth0
192.168.0.1              ether   fa:16:3e:0d:2a:20   C                     eth0
192.168.0.33             ether   fa:16:3e:26:7e:9f   C                     eth0
192.168.0.230            ether   fa:16:3e:26:7e:64   C                     eth0

Server-2的ARP表记录了同子网内所有主机的IP-MAC映射。


三、网络层和IP地址

3.1 IPv4地址分类

类别 地址范围 默认掩码 私有地址范围 主机数
A 1-126.x.x.x /8 10.0.0.0/8 16,777,214
B 128-191.x.x.x /16 172.16.0.0/12 65,534
C 192-223.x.x.x /24 192.168.0.0/16 254
D 224-239.x.x.x - 组播 -
E 240-255.x.x.x - 保留 -

3.2 实操:IP地址分类与子网划分

bash 复制代码
root@ecs-f5c0-fe31-0001:~# python3 -c "
import ipaddress
for ip in ['10.0.0.1','172.16.0.1','192.168.1.1','8.8.8.8','224.0.0.1']:
    o = ipaddress.ip_address(ip)
    t = []
    if o.is_private: t.append('Private')
    if o.is_global: t.append('Public')
    if o.is_multicast: t.append('Multicast')
    print(f'{ip} -> {\" \".join(t)}')
"

真实输出:

vbnet 复制代码
IP 10.0.0.1 -> Private Class A private
IP 172.16.0.1 -> Private Class B private
IP 192.168.1.1 -> Private Class C private
IP 8.8.8.8 -> Global/Public
IP 224.0.0.1 -> Global/Public Multicast

VLSM子网划分:

yaml 复制代码
Original: 192.168.1.0/24, Total hosts: 254

Subnet: 192.168.1.0/26 - Usable: 192.168.1.1 to 192.168.1.62 (62 hosts)
Subnet: 192.168.1.64/26 - Usable: 192.168.1.65 to 192.168.1.126 (62 hosts)
Subnet: 192.168.1.128/26 - Usable: 192.168.1.129 to 192.168.1.190 (62 hosts)
Subnet: 192.168.1.192/26 - Usable: 192.168.1.193 to 192.168.1.254 (62 hosts)

10.0.0.0/30 -> Mask: 255.255.255.252 -> Hosts: 2
10.0.0.0/28 -> Mask: 255.255.255.240 -> Hosts: 14
10.0.0.0/26 -> Mask: 255.255.255.192 -> Hosts: 62
10.0.0.0/24 -> Mask: 255.255.255.0 -> Hosts: 254

将/24划分为4个/26子网,每个62个可用主机。CIDR前缀越小网络越大。


四、TCP通信和UDP通信

4.1 TCP三次握手

TCP采用三次握手建立可靠连接,确保双方都具备发送和接收能力:

ini 复制代码
客户端                    服务器
  |--- SYN (seq=x) ------->|   第1次:客户端请求连接
  |<-- SYN+ACK (seq=y,ack=x+1) -|  第2次:服务器确认+请求
  |--- ACK (ack=y+1) ------>|   第3次:客户端确认
  |    连接建立ESTABLISHED   |

为什么是三次而不是两次?

  • 两次握手无法防止历史连接(已失效的SYN)被误建立
  • 三次握手确保双方都确认了对方的发送和接收能力
  • 通俗理解:A打电话给B说"能听到吗",B说"能,你能听到我吗",A说"能"------这才算建立通话

4.2 TCP四次挥手

TCP连接断开需要四次挥手,因为TCP是全双工通信,每个方向需要独立关闭:

ini 复制代码
客户端                    服务器
  |--- FIN (seq=u) ------->|   第1次:客户端请求关闭
  |<-- ACK (ack=u+1) ------|   第2次:服务器确认(服务器可能还有数据要发)
  |<-- FIN (seq=v) --------|   第3次:服务器数据发完,请求关闭
  |--- ACK (ack=v+1) ------>|   第4次:客户端确认
  |    [TIME_WAIT 2MSL]     |   等待2倍最大段寿命后真正关闭

为什么需要TIME_WAIT?

  • 确保最后一个ACK能到达对方(如果丢失,对方会重发FIN)
  • 防止旧连接的延迟报文影响新连接
  • 持续时间通常为2MSL(约60秒)

4.3 实操:查看TCP连接状态

bash 复制代码
root@ecs-f5c0-fe31-0001:~# ss -tnap

真实输出:

css 复制代码
State     Recv-Q Send-Q Local Address:Port    Peer Address:Port Process
LISTEN    0      4096         0.0.0.0:22           0.0.0.0:*     users:(("sshd",pid=5548))
ESTAB     0      112    192.168.0.230:22     123.60.147.22:30851 users:(("sshd",pid=13058))
TIME-WAIT 0      0          192.168.0.230:54346  61.135.210.45:80
bash 复制代码
root@ecs-f5c0-fe31-0001:~# ss -s
makefile 复制代码
Total: 200
TCP:   12 (estab 2, closed 2, orphaned 0, timewait 2)

可以看到SSH连接处于ESTAB状态,还有TIME-WAIT状态的连接。

4.4 实操:tcpdump抓包分析TCP握手

bash 复制代码
root@ecs-f5c0-fe31-0001:~# tcpdump -i eth0 -c 10 -nn "port 22 and host 192.168.0.199"

真实输出:

ini 复制代码
15:11:44.676364 IP 192.168.0.230.46704 > 192.168.0.199.22: Flags [S], seq 756691514, win 64240, options [mss 1460,sackOK,TS val 455821021 ecr 0,nop,wscale 7], length 0
15:11:44.676558 IP 192.168.0.199.22 > 192.168.0.230.46704: Flags [S.], seq 2003168883, ack 756691515, win 65160, options [mss 1460,sackOK,TS val 4198289070 ecr 455821021,nop,wscale 7], length 0
15:11:44.676580 IP 192.168.0.230.46704 > 192.168.0.199.22: Flags [.], ack 1, win 502, options [nop,nop,TS val 455821021 ecr 4198289070], length 0
15:11:44.676700 IP 192.168.0.230.46704 > 192.168.0.199.22: Flags [P.], seq 1:44, ack 1, win 502, length 43: SSH: SSH-2.0-OpenSSH_9.6p1

分析:

  • [S] = SYN(第1次握手)
  • [S.] = SYN+ACK(第2次握手)
  • [.] = ACK(第3次握手)
  • [P.] = PSH+ACK(数据传输)

4.5 实操:iperf3带宽测试

TCP带宽测试:

bash 复制代码
# Server-2启动iperf3服务端
root@ecs-f5c0-fe31-0002:~# iperf3 -s -D -p 5201

# Server-1发起TCP测试
root@ecs-f5c0-fe31-0001:~# iperf3 -c 1.92.127.189 -p 5201 -t 5 -f m

真实输出:

css 复制代码
Connecting to host 1.92.127.189, port 5201
[  5] local 192.168.0.230 port 33532 connected to 1.92.127.189 port 5201
[  5]   0.00-5.00   sec   336 MBytes   564 Mbits/sec  3575             sender
[  5]   0.00-5.21   sec   334 MBytes   537 Mbits/sec                  receiver

UDP带宽测试:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# iperf3 -c 1.92.127.189 -p 5201 -u -b 100M -t 5 -f m

真实输出:

matlab 复制代码
[  5]   0.00-5.00   sec  59.6 MBytes   100 Mbits/sec  0.000 ms  0/43155 (0%)  sender
[  5]   0.00-5.21   sec  3.79 MBytes  6.10 Mbits/sec  0.013 ms  40404/43147 (94%)  receiver

TCP vs UDP对比:

特性 TCP UDP
连接 面向连接(三次握手) 无连接
可靠性 可靠(确认重传) 不可靠
顺序 有序 无序
速度 较慢 较快
应用 SSH, HTTP, FTP DNS, 视频, VoIP

五、VLAN技术

5.1 VLAN原理

VLAN(虚拟局域网)通过802.1Q标签在以太网帧中插入4字节VLAN Tag,实现逻辑网络隔离。VLAN将一个物理交换网络划分为多个逻辑广播域,有效控制广播范围、提高安全性和网络管理灵活性。

为什么需要VLAN?

  • 控制广播域:未划分VLAN时,一个ARP请求会泛洪到整个网络
  • 安全隔离:不同VLAN之间默认无法直接通信
  • 灵活管理:逻辑分组不受物理位置限制
  • 带宽优化:减少不必要的广播流量

802.1Q标签结构(4字节插入在源MAC和类型之间):

  • TPID(2字节):0x8100,标识这是一个VLAN帧
  • TCI(2字节):优先级(3bit,用于QoS) + CFI(1bit) + VLAN ID(12bit,范围1-4094)

端口类型对比:

端口类型 所属VLAN 标签处理 应用场景
Access 1个VLAN 接收时去标签,发送时加标签 连接终端设备
Trunk 多个VLAN 保留标签传输 交换机间互联
Hybrid 多个VLAN 可配置标签处理方式 灵活组网

5.2 实操:Linux VLAN接口配置

在Server-1上使用network namespace和bridge模拟VLAN环境:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# 
# 创建bridge
ip link add br0 type bridge
ip link set br0 up

# 创建两个namespace模拟不同VLAN的主机
ip netns add vlan10-ns
ip netns add vlan20-ns

# 创建veth对并连接到bridge
ip link add veth-v10 type veth peer name veth-v10-br
ip link add veth-v20 type veth peer name veth-v20-br
ip link set veth-v10 netns vlan10-ns
ip link set veth-v20 netns vlan20-ns
ip link set veth-v10-br master br0
ip link set veth-v20-br master br0
ip link set veth-v10-br up
ip link set veth-v20-br up

# 在namespace中创建VLAN接口
ip netns exec vlan10-ns ip link set veth-v10 up
ip netns exec vlan10-ns ip link add link veth-v10 name vlan10 type vlan id 10
ip netns exec vlan10-ns ip addr add 192.168.10.1/24 dev vlan10
ip netns exec vlan10-ns ip link set vlan10 up

ip netns exec vlan20-ns ip link set veth-v20 up
ip netns exec vlan20-ns ip link add link veth-v20 name vlan20 type vlan id 20
ip netns exec vlan20-ns ip addr add 192.168.20.1/24 dev vlan20
ip netns exec vlan20-ns ip link set vlan20 up

查看VLAN接口详情:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# ip netns exec vlan10-ns ip -d link show vlan10

真实输出:

bash 复制代码
2: vlan10@veth-v10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 86:79:03:55:70:42 brd ff:ff:ff:ff:ff:ff
    vlan protocol 802.1Q id 10 <REORDER_HDR>
bash 复制代码
root@ecs-f5c0-fe31-0001:~# bridge link show

真实输出:

perl 复制代码
6: veth-v10-br@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> master br0 state forwarding priority 32 cost 2
8: veth-v20-br@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> master br0 state forwarding priority 32 cost 2

成功创建了VLAN 10和VLAN 20两个隔离的网络。VLAN标签802.1Q id 10/20已添加到接口。


六、构建安全可靠的以太网

6.1 端口安全

端口安全限制交换机端口允许接入的MAC地址数量,防止未授权接入和MAC泛洪攻击。

Linux实现方式:通过iptables规则限制源MAC、bridge的fdb控制等。

6.2 链路聚合(Bonding/Teaming)

链路聚合将多个物理网卡绑定为一个逻辑接口,提供:

  • 负载均衡:流量分散到多条链路
  • 冗余备份:单链路故障不影响整体

Bonding模式:

模式 名称 说明
0 balance-rr 轮询(需交换机支持)
1 active-backup 主备(无需交换机配置)
2 balance-xor 基于XOR哈希
4 802.3ad LACP(需交换机支持)
5 balance-tlb 发送负载均衡
6 balance-alb 收发负载均衡

6.3 实操:Linux Bonding配置

bash 复制代码
root@ecs-f5c0-fe31-0001:~# 
# 创建dummy接口模拟物理网卡
ip link add dummy0 type dummy
ip link add dummy1 type dummy
ip link set dummy0 up
ip link set dummy1 up

# 创建bond接口(active-backup模式)
ip link add bond0 type bond mode active-backup
ip link set dummy0 master bond0
ip link set dummy1 master bond0
ip link set bond0 up
ip addr add 10.10.10.1/24 dev bond0

查看Bond状态:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# cat /proc/net/bonding/bond0

真实输出:

yaml 复制代码
Ethernet Channel Bonding Driver: v6.8.0-136-generic

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: None
MII Status: down
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
bash 复制代码
root@ecs-f5c0-fe31-0001:~# ip -d link show bond0

真实输出:

bash 复制代码
12: bond0: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500
    link/ether de:a3:9e:e9:2c:18 brd ff:ff:ff:ff:ff:ff
    bond mode active-backup miimon 0 updelay 0 downdelay 0

Bond接口创建成功,模式为active-backup(主备容错)。dummy接口无物理链路所以状态为down。

6.4 加载的网络模块

bash 复制代码
root@ecs-f5c0-fe31-0001:~# lsmod | grep -E "8021q|bonding|bridge|veth|dummy"

真实输出:

复制代码
bonding               253952  0
dummy                  12288  0
8021q                  45056  0
bridge                425984  0
veth                   45056  0

系统已加载802.1Q(VLAN)、bonding、bridge、veth、dummy等网络模块。


七、路由原理

7.1 路由表结构

路由表条目包含:目的网络、下一跳、出接口、度量值、路由来源。

路由类型:

  • 直连路由:接口配置IP后自动产生
  • 静态路由:手动配置
  • 默认路由:匹配所有其他路由都不匹配的流量
  • 动态路由:通过OSPF/BGP等协议学习
  • 浮动路由:备用的静态路由,主路由失效时生效

7.2 实操:查看路由表

bash 复制代码
root@ecs-f5c0-fe31-0001:~# ip route show

真实输出:

scss 复制代码
default via 192.168.0.1 dev eth0 proto dhcp src 192.168.0.230 metric 100 
169.254.169.254 via 192.168.0.1 dev eth0 proto dhcp src 192.168.0.230 metric 100 
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.230 metric 100 

分析:

  • default via 192.168.0.1:默认路由,网关192.168.0.1
  • 192.168.0.0/24 dev eth0:直连路由,proto kernel表示内核自动生成

7.3 实操:静态路由配置(三路由器拓扑)

使用network namespace创建R1-R2-R3三路由器拓扑:

scss 复制代码
R1(1.1.1.1) ---10.12.0.0/30--- R2(2.2.2.2) ---10.23.0.0/30--- R3(3.3.3.3)
bash 复制代码
root@ecs-f5c0-fe31-0001:~# 
# 创建3个namespace和veth对
ip netns add r1; ip netns add r2; ip netns add r3
ip link add r1r2 type veth peer name r2r1
ip link add r2r3 type veth peer name r3r2
ip link set r1r2 netns r1; ip link set r2r1 netns r2
ip link set r2r3 netns r2; ip link set r3r2 netns r3

# 配置IP地址和loopback
ip netns exec r1 ip addr add 10.12.0.1/30 dev r1r2; ip netns exec r1 ip link set r1r2 up
ip netns exec r1 ip addr add 1.1.1.1/32 dev lo; ip netns exec r1 ip link set lo up

ip netns exec r2 ip addr add 10.12.0.2/30 dev r2r1; ip netns exec r2 ip link set r2r1 up
ip netns exec r2 ip addr add 10.23.0.1/30 dev r2r3; ip netns exec r2 ip link set r2r3 up
ip netns exec r2 ip addr add 2.2.2.2/32 dev lo; ip netns exec r2 ip link set lo up
ip netns exec r2 sysctl -w net.ipv4.ip_forward=1

ip netns exec r3 ip addr add 10.23.0.2/30 dev r3r2; ip netns exec r3 ip link set r3r2 up
ip netns exec r3 ip addr add 3.3.3.3/32 dev lo; ip netns exec r3 ip link set lo up

# 配置静态路由
ip netns exec r1 ip route add 10.23.0.0/30 via 10.12.0.2
ip netns exec r1 ip route add 3.3.3.3/32 via 10.12.0.2
ip netns exec r2 ip route add 1.1.1.1/32 via 10.12.0.1
ip netns exec r2 ip route add 3.3.3.3/32 via 10.23.0.2
ip netns exec r3 ip route add 10.12.0.0/30 via 10.23.0.1
ip netns exec r3 ip route add 1.1.1.1/32 via 10.23.0.1

R1路由表:

bash 复制代码
2.2.2.2 via 10.12.0.2 dev r1r2 
3.3.3.3 via 10.12.0.2 dev r1r2 
10.12.0.0/30 dev r1r2 proto kernel scope link src 10.12.0.1 
10.23.0.0/30 via 10.12.0.2 dev r1r2 

Ping测试 R1 -> R3:

python 复制代码
PING 3.3.3.3 (3.3.3.3) 56(84) bytes of data.
64 bytes from 3.3.3.3: icmp_seq=1 ttl=63 time=0.047 ms
64 bytes from 3.3.3.3: icmp_seq=2 ttl=63 time=0.035 ms
64 bytes from 3.3.3.3: icmp_seq=3 ttl=63 time=0.035 ms
3 packets transmitted, 3 received, 0% packet loss

Ping测试 R3 -> R1:

python 复制代码
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=63 time=0.023 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=63 time=0.032 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=63 time=0.035 ms
3 packets transmitted, 3 received, 0% packet loss

静态路由配置成功,R1可以ping通R3的loopback(3.3.3.3),TTL=63说明经过了1跳路由器。


八、OSPF路由协议

8.1 OSPF原理

OSPF(Open Shortest Path First)是链路状态路由协议,属于IGP(内部网关协议),特点:

  • 路由器ID:唯一标识路由器(手动配置或自动选最大IP)
  • 区域(Area):分层设计,Area 0为骨干区域,所有非骨干区域必须连接到Area 0
  • 邻居关系:通过Hello包建立,需在同一区域且参数匹配(Hello/Dead间隔、Area ID等)
  • LSA:链路状态通告,描述路由器链路状态,区域内泛洪
  • SPF算法:Dijkstra最短路径算法,计算到每个目的地的最短路径树
  • 管理距离:110(低于静态路由的1,但高于直连路由的0)
  • 默认Hello间隔:10秒(广播网络),Dead间隔:40秒(4倍Hello)

OSPF邻接状态机:

rust 复制代码
Down -> Init -> 2-Way -> ExStart -> Exchange -> Loading -> Full
  |       |       |        |          |          |         |
 无连接  收到Hello  双向   确定主从  交换DBD  请求LSA  完全邻接

OSPF vs 其他路由协议对比:

特性 OSPF RIP BGP 静态路由
类型 链路状态 距离向量 路径向量 手动配置
收敛速度 快 慢 较慢 无收敛
规模 大型 小型(15跳) 超大型 任意
协议号 89 UDP 520 TCP 179 N/A
管理距离 110 120 20(eBGP)/200(iBGP) 1

8.2 实操:FRRouting OSPF配置

Server-1已安装FRRouting 8.4.4,首先启用OSPF守护进程:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# sed -i 's/^ospfd=no/ospfd=yes/' /etc/frr/daemons
root@ecs-f5c0-fe31-0001:~# systemctl restart frr

配置OSPF:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# vtysh -c "
configure terminal
router ospf
 router-id 1.1.1.1
 network 192.168.0.0/24 area 0
exit
exit
"

查看FRR运行配置:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# vtysh -c "show running-config"

真实输出:

lua 复制代码
frr version 8.4.4
frr defaults traditional
hostname ecs-f5c0-fe31-0001
log syslog informational
no ip forwarding
no ipv6 forwarding
service integrated-vtysh-config
!
router ospf
 ospf router-id 1.1.1.1
 network 192.168.0.0/24 area 0
exit
!
end

查看OSPF状态:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# vtysh -c "show ip ospf"

真实输出:

javascript 复制代码
OSPF Routing Process, Router ID: 1.1.1.1
 Supports only single TOS (TOS0) routes
 This implementation conforms to RFC2328
 Refresh timer 10 secs
 Administrative distance 110
 Number of areas attached to this router: 1
 Area ID: 0.0.0.0 (Backbone)
   Number of interfaces in this area: Total: 1, Active: 1
   Number of fully adjacent neighbors in this area: 0
   Area has no authentication
   SPF algorithm executed 1 times
   Number of LSA 1

查看OSPF接口:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# vtysh -c "show ip ospf interface"

真实输出:

python 复制代码
eth0 is up
  Internet Address 192.168.0.230/24, Broadcast 192.168.0.255, Area 0.0.0.0
  Router ID 1.1.1.1, Network Type BROADCAST, Cost: 1
  Transmit Delay is 1 sec, State Waiting, Priority 1
  Timer intervals configured, Hello 10s, Dead 40s, Wait 40s, Retransmit 5
  Neighbor Count is 0, Adjacent neighbor count is 0

查看OSPF路由:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# vtysh -c "show ip route"

真实输出:

css 复制代码
K>* 0.0.0.0/0 [0/100] via 192.168.0.1, eth0, src 192.168.0.230
O   192.168.0.0/24 [110/1] is directly connected, eth0, weight 1
C>* 192.168.0.0/24 is directly connected, eth0

OSPF进程运行正常,Router-ID为1.1.1.1,eth0接口加入Area 0。路由表中O表示OSPF学习到的路由。当前无邻居(因为其他服务器未配置OSPF)。


九、ACL访问控制列表

9.1 ACL原理

ACL(Access Control List)用于过滤网络流量,分为:

  • 标准ACL:仅基于源IP过滤
  • 扩展ACL:基于源IP、目的IP、协议、端口等过滤

iptables规则匹配顺序:从上到下,匹配即执行,默认规则最后执行。

9.2 实操:iptables ACL配置

查看当前iptables规则:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# iptables -L -n --line-numbers

真实输出:

lua 复制代码
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    ufw-before-logging-input  0    --  0.0.0.0/0            0.0.0.0/0
2    ufw-before-input  0    --  0.0.0.0/0            0.0.0.0/0
...

Chain ufw-user-input (1 references)
1    ACCEPT     6    --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
2    ACCEPT     6    --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
3    ACCEPT     6    --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443

UFW已配置允许SSH(22)、HTTP(80)、HTTPS(443)端口。

创建自定义ACL链:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# 
iptables -N TEST-ACL
iptables -A TEST-ACL -p tcp --dport 22 -j ACCEPT -m comment --comment "Allow SSH"
iptables -A TEST-ACL -p tcp --dport 80 -j ACCEPT -m comment --comment "Allow HTTP"
iptables -A TEST-ACL -p tcp --dport 443 -j ACCEPT -m comment --comment "Allow HTTPS"
iptables -A TEST-ACL -p icmp -j ACCEPT -m comment --comment "Allow ICMP"
iptables -A TEST-ACL -j DROP -m comment --comment "Drop all other"

查看ACL规则:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# iptables -L TEST-ACL -n --line-numbers -v

真实输出:

sql 复制代码
Chain TEST-ACL (0 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     6    --  *      *       0.0.0.0/0            0.0.0.0/0  tcp dpt:22 /* Allow SSH */
2        0     0 ACCEPT     6    --  *      *       0.0.0.0/0            0.0.0.0/0  tcp dpt:80 /* Allow HTTP */
3        0     0 ACCEPT     6    --  *      *       0.0.0.0/0            0.0.0.0/0  tcp dpt:443 /* Allow HTTPS */
4        0     0 ACCEPT     1    --  *      *       0.0.0.0/0            0.0.0.0/0  /* Allow ICMP */
5        0     0 DROP       0    --  *      *       0.0.0.0/0            0.0.0.0/0  /* Drop all other */

成功创建了ACL规则:允许SSH/HTTP/HTTPS/ICMP,拒绝其他所有流量。


十、NAT网络地址转换

10.1 NAT原理

NAT(Network Address Translation)在公网IP和私网IP之间转换,解决IPv4地址不足问题。

NAT类型:

类型 说明 典型场景
SNAT 源地址转换 内网访问外网
DNAT 目的地址转换 外网访问内网服务
PAT 端口地址转换 多内网共享一个公网IP

10.2 实操:iptables NAT配置

创建NAT测试环境:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# 
# 创建namespace模拟内网
ip netns add nat-test
ip link add nat-veth type veth peer name nat-veth-br
ip link set nat-veth netns nat-test
ip link set nat-veth-br up
ip netns exec nat-test ip link set nat-veth up
ip netns exec nat-test ip link set lo up
ip netns exec nat-test ip addr add 172.16.0.2/24 dev nat-veth
ip addr add 172.16.0.1/24 dev nat-veth-br
ip netns exec nat-test ip route add default via 172.16.0.1

测试内网连通性:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# ip netns exec nat-test ping -c 1 172.16.0.1

真实输出:

python 复制代码
PING 172.16.0.1 (172.16.0.1) 56(84) bytes of data.
64 bytes from 172.16.0.1: icmp_seq=1 ttl=64 time=0.070 ms
1 packets transmitted, 1 received, 0% packet loss

配置SNAT(源地址转换):

bash 复制代码
root@ecs-f5c0-fe31-0001:~# iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth0 -j SNAT --to-source 192.168.0.230 -m comment --comment "SNAT demo"

查看SNAT规则:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# iptables -t nat -L POSTROUTING -n -v --line-numbers

真实输出:

csharp 复制代码
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 SNAT       0    --  *      eth0    172.16.0.0/24        0.0.0.0/0  /* SNAT demo */ to:192.168.0.230

SNAT规则将172.16.0.0/24网段的源IP转换为192.168.0.230,实现内网访问外网。

配置DNAT(目的地址转换):

bash 复制代码
root@ecs-f5c0-fe31-0001:~# iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.16.0.2:80 -m comment --comment "DNAT demo"

查看DNAT规则:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# iptables -t nat -L PREROUTING -n -v --line-numbers

真实输出:

csharp 复制代码
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 DNAT       6    --  *      *       0.0.0.0/0            0.0.0.0/0  tcp dpt:8080 /* DNAT demo */ to:172.16.0.2:80

DNAT规则将访问8080端口的流量转发到内网172.16.0.2的80端口,实现端口映射。

10.3 NAT数据流向

rust 复制代码
SNAT(内网访问外网):
内网172.16.0.2 -> [NAT网关] -> 源IP改为192.168.0.230 -> 外网

DNAT(外网访问内网):
外网 -> [NAT网关] -> 目的IP改为172.16.0.2:80 -> 内网

十一、补充实操:网络诊断与故障排查

11.1 TCP内核参数调优

bash 复制代码
root@ecs-f5c0-fe31-0001:~# sysctl net.ipv4.tcp_syncookies net.ipv4.tcp_fin_timeout net.ipv4.tcp_keepalive_time net.ipv4.tcp_max_syn_backlog net.ipv4.ip_local_port_range net.ipv4.ip_forward

真实输出:

ini 复制代码
net.ipv4.tcp_syncookies = 1          # SYN Flood防护已开启
net.ipv4.tcp_fin_timeout = 60        # FIN-WAIT-2状态超时60秒
net.ipv4.tcp_keepalive_time = 7200   # Keepalive间隔2小时
net.ipv4.tcp_max_syn_backlog = 1024  # SYN队列最大长度
net.ipv4.ip_local_port_range = 32768 60999  # 本地端口范围
net.ipv4.ip_forward = 0              # IP转发未开启

参数说明:

  • tcp_syncookies=1:防止SYN Flood攻击,推荐开启
  • tcp_fin_timeout=60:TIME-WAIT状态超时,高并发场景可降低
  • tcp_max_syn_backlog=1024:SYN队列长度,高并发需增大
  • ip_local_port_range:可用本地端口28232个

11.2 网络统计数据

bash 复制代码
root@ecs-f5c0-fe31-0001:~# netstat -s | head -30

真实输出:

yaml 复制代码
Ip:
    24615 total packets received
    0 forwarded
    21476 incoming packets delivered
    61845 requests sent out
Icmp:
    53 ICMP messages received
    ICMP input histogram:
        destination unreachable: 9
        echo requests: 21
        echo replies: 23
    242 ICMP messages sent
    ICMP output histogram:
        destination unreachable: 198
        echo requests: 23
        echo replies: 21

11.3 网卡收发包统计

bash 复制代码
root@ecs-f5c0-fe31-0001:~# cat /proc/net/dev

真实输出:

yaml 复制代码
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls
    lo:  162120    1564    0    0    0     0          0         0   162120    1564    0    0    0
  eth0: 53427974   52503    0    0    0     0          0         0 421461142   60401    0    0    0

eth0接收53MB数据52503个包,发送421MB数据60401个包,无错误无丢包。

11.4 路径MTU发现

bash 复制代码
root@ecs-f5c0-fe31-0001:~# tracepath -n 192.168.0.199

真实输出:

yaml 复制代码
 1?: [LOCALHOST]                      pmtu 1500
 1:  192.168.0.199                                         0.250ms reached
     Resume: pmtu 1500 hops 1 back 1

Server-1到Server-2只有1跳,路径MTU为1500字节,延迟0.250ms。

11.5 DNS解析测试

bash 复制代码
root@ecs-f5c0-fe31-0001:~# nslookup www.baidu.com

真实输出:

yaml 复制代码
Server:     127.0.0.53
Address:    127.0.0.53#53

Non-authoritative answer:
www.baidu.com  canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 110.242.69.21
Name:   www.a.shifen.com
Address: 110.242.70.57

DNS解析正常,www.baidu.com解析到110.242.69.21和110.242.70.57两个IP。

11.6 故障排查流程

当网络不通时,按OSI模型从下到上逐层排查:

bash 复制代码
# 第1步:物理层 - 检查链路状态
ip link show eth0

# 第2步:链路层 - 检查ARP表
arp -n

# 第3步:网络层 - 检查路由
ip route get 192.168.0.199

# 第4步:传输层 - 检查端口监听
ss -tlnp | grep :22

# 第5步:防火墙 - 检查iptables规则
iptables -L INPUT -n --line-numbers

ip route get 示例:

bash 复制代码
root@ecs-f5c0-fe31-0001:~# ip route get 192.168.0.199

真实输出:

css 复制代码
192.168.0.199 dev eth0 src 192.168.0.230 uid 0
    cache

路由查找结果显示到192.168.0.199的路径通过eth0接口,源IP为192.168.0.230,无需经过网关(同子网直连)。


十二、总结

本文系统讲解了数据中心网络技术基础,覆盖了课程第2章17课时的核心内容:

知识点回顾

技术领域 核心知识点 实操内容
OSI/TCP-IP模型 七层/四层模型、封装解封装 查看内核协议栈
数据链路层 MAC地址、以太网帧、交换机原理 ip link、ARP表
网络层 IP分类、VLSM、CIDR、ARP IP分类验证、子网划分
TCP/UDP 三次握手、四次挥手、状态转换 ss命令、tcpdump抓包、iperf3测试
VLAN 802.1Q标签、Access/Trunk Linux VLAN接口、bridge
链路聚合 Bonding模式、冗余备份 Linux bond配置
路由原理 直连/静态/默认路由 三路由器拓扑、ping测试
OSPF 邻居关系、单区域配置 FRRouting OSPF配置
ACL 标准/扩展ACL、iptables iptables规则配置
NAT SNAT/DNAT、端口映射 iptables NAT配置

实操关键发现

  1. 网络连通性:Server-1和Server-2内网延迟约0.12-0.26ms,带宽约537-564Mbps
  2. TCP握手验证:通过tcpdump成功抓取SYN/SYN+ACK/ACK三次握手包
  3. VLAN隔离:使用network namespace和bridge成功创建VLAN 10/20隔离环境
  4. 静态路由:三路由器拓扑中R1通过R2成功ping通R3(TTL=63证明经过1跳)
  5. OSPF配置:FRRouting 8.4.4成功启用,Router-ID 1.1.1.1,eth0加入Area 0
  6. ACL/NAT:iptables成功配置ACL过滤规则和SNAT/DNAT地址转换

技术要点

  • Network Namespace是Linux强大的网络隔离技术,可安全模拟复杂网络拓扑
  • VLAN 802.1Q通过4字节Tag实现逻辑网络隔离,VLAN ID范围1-4094
  • OSPF适用于大型网络,自动适应拓扑变化,管理距离110
  • iptables的filter表实现ACL,nat表实现地址转换,规则从上到下匹配
  • SNAT 用于内网访问外网,DNAT用于外网访问内网服务

考试知识点映射(第2章 权重20%)

知识点 考试要求 本文位置 掌握程度
OSI七层模型 熟记各层名称与功能 1.1 已掌握
TCP/IP四层模型 理解与OSI的对应关系 1.2 已掌握
数据封装/解封装 理解PDU概念 1.3 已掌握
MAC地址/以太网帧 掌握帧结构和MAC寻址 2.1-2.3 已掌握
IPv4分类/私有地址 熟记A/B/C/D/E类 3.1 已掌握
VLSM/CIDR 掌握子网划分计算 3.2-3.4 已掌握
ARP协议 理解IP到MAC的解析 2.4-2.5 已掌握
TCP三次握手/四次挥手 熟练掌握过程和状态 4.1-4.2 已掌握
TCP/UDP对比 理解可靠性与效率权衡 4.5 已掌握
VLAN 802.1Q 掌握Tag结构和端口类型 5.1-5.2 已掌握
链路聚合Bonding 了解各模式特点 6.2-6.3 已掌握
路由表/静态路由 掌握路由配置 7.1-7.3 已掌握
OSPF协议 掌握单区域配置 8.1-8.2 已掌握
ACL访问控制 掌握iptables规则 9.1-9.2 已掌握
NAT地址转换 掌握SNAT/DNAT配置 10.1-10.3 已掌握

最佳实践提示

注意事项:在云服务器上执行网络实验时,务必使用network namespace进行隔离,避免影响SSH连接。所有临时创建的接口和namespace在实验结束后应及时清理。
最佳实践 :生产环境中配置iptables规则时,应遵循"最小权限原则"------默认DROP,仅放行必要端口。建议使用iptables-save备份规则,iptables-restore恢复规则。
经验总结:OSPF在大型网络中优于静态路由,因为它能自动适应拓扑变化。但在小型稳定网络中,静态路由更简单可靠,不会产生额外的协议开销。
故障排查技巧:网络不通时按OSI模型从下到上排查:1)物理链路(ip link) 2)ARP(arp -n) 3)路由(ip route) 4)端口(ss -tlnp) 5)防火墙(iptables -L)


参考链接


上一篇 :走进数据中心 ------ 从概念到实践

作者:网络技术工程师 | 日期:2026-10-29 | 转载请注明出处

相关推荐
网络小江1 小时前
组网第41课:ACL 门禁——标准/扩展、规则顺序、time-range、in/out 方向
运维·网络安全·acl·访问列表·in/out
牛马工作号2 小时前
Copyparty 轻量文件共享:Docker Compose 部署、权限与多协议使用全指南
运维·docker·容器
骑着蜗牛撵大象3272 小时前
手写一个 HTTP 服务器:从 socket 到 epoll,Linux 上到底怎么把请求变成响应
linux·服务器·网络·http·epoll·socket编程·并发模型
程序员初一2 小时前
我在 1C1G 的服务器上装了个桌面环境,然后用 VNC 连它,然后我后悔了
linux·ssh
星恒随风2 小时前
Linux Socket TCP编程(二):逐文件重构多进程、多线程与线程池服务器,深入fork、pthread_create、popen和std::bind
linux·服务器·笔记·学习·tcp/ip
晚风叙码2 小时前
Linux 进程概念(下):程序地址空间与虚拟内存
linux·服务器·算法
无足鸟ICT3 小时前
【RHCA+】影响Linux系统性能的因素
linux·运维·服务器
沫璃染墨3 小时前
从零入门计算机网络系列(十):HTTP协议进阶——从资源路径解析到状态码与请求头详解
linux·运维·服务器·网络·c++·http
oioihoii3 小时前
Windows部署MySpeed自建测速服务:Docker运行后直接测速,再配置固定公网地址远程查看
运维·docker·容器