Linux网络工具
详细讲解网卡、虚拟网卡,及Linux上网络相关工具及概念,防火墙等。
网络知识完整指南
目录
1. 核心组件:网卡与虚拟网卡
1.1 物理网卡(Physical Network Interface Card)
基本概念
- 定义:网卡是计算机连接网络的物理硬件设备,是数据包进出计算机的物理门户
- 特点:
- 有独立的MAC地址(全球唯一的物理地址)
- 直接连接到物理网络介质(以太网线、光纤等)
- 在Linux中通常命名为eth0、eth1、ens33、enp0s3等
- 具有实际的硬件缓冲区和处理芯片
硬件架构深度解析
网卡硬件组成
- 网络控制器芯片:负责数据包的处理和协议栈实现
- PHY芯片:物理层芯片,处理电信号和光信号的转换
- MAC控制器:媒体访问控制,处理帧的发送和接收
- 缓冲区:
- 发送缓冲区(TX Buffer):存储待发送的数据包
- 接收缓冲区(RX Buffer):存储接收到的数据包
- DMA引擎:直接内存访问,减少CPU负担
数据传输流程
应用数据 → 内核协议栈 → 网卡驱动 → DMA → 网卡缓冲区 → MAC控制器 → PHY芯片 → 物理介质
网卡类型详解
有线网卡(Ethernet)
- 标准速率:
- 10 Mbps(10BASE-T)
- 100 Mbps(100BASE-TX,Fast Ethernet)
- 1 Gbps(1000BASE-T,Gigabit Ethernet)
- 10 Gbps(10GBASE-T)
- 25/40/100 Gbps(数据中心级别)
- 接口类型:RJ45、SFP、SFP+、QSFP+
- 双工模式:
- 半双工:同一时间只能发送或接收
- 全双工:可同时发送和接收
无线网卡(Wi-Fi)
- 标准演进:
- 802.11a/b/g(54 Mbps)
- 802.11n(300 Mbps)
- 802.11ac(1.3 Gbps)
- 802.11ax(Wi-Fi 6,9.6 Gbps)
- 频段:2.4GHz、5GHz、6GHz
- 天线技术:MIMO、MU-MIMO、波束成形
光纤网卡
- 光模块类型:
- SFP:1 Gbps
- SFP+:10 Gbps
- QSFP+:40 Gbps
- QSFP28:100 Gbps
- 光纤类型:
- 单模光纤:长距离传输(几十公里)
- 多模光纤:短距离传输(几百米)
网卡驱动机制深入
驱动架构
用户空间应用
↓
系统调用接口
↓
内核网络协议栈
↓
网络设备抽象层
↓
网卡驱动程序
↓
硬件抽象层
↓
物理网卡硬件
关键驱动组件
- 网络设备结构体(net_device):内核中表示网络设备的核心数据结构
- 网络操作函数集(net_device_ops):定义设备的操作接口
- NAPI(New API):高效的数据包处理机制,减少中断开销
- ethtool接口:用户空间配置网卡参数的标准接口
中断处理机制
- 传统中断模式:每个数据包触发一次中断
- NAPI轮询模式:高负载时使用轮询减少中断
- MSI/MSI-X:多消息中断,提高多核性能
网卡性能调优深度指南
硬件层面优化
# 查看网卡硬件信息
ethtool eth0
# 查看网卡统计信息
ethtool -S eth0
# 设置网卡速率和双工模式
ethtool -s eth0 speed 1000 duplex full autoneg off
# 调整环形缓冲区大小
ethtool -G eth0 rx 4096 tx 4096
# 启用/禁用硬件特性
ethtool -K eth0 tso on gso on gro on lro on
ethtool -K eth0 rx-checksumming on tx-checksumming on
驱动层面优化
# 调整中断合并参数
ethtool -C eth0 rx-usecs 50 tx-usecs 50
# 设置RSS(Receive Side Scaling)
ethtool -X eth0 equal 4
# 查看和设置队列数量
ethtool -l eth0
ethtool -L eth0 combined 4
系统层面优化
# 调整网络缓冲区
echo 'net.core.rmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf
# CPU亲和性绑定
echo 2 > /proc/irq/24/smp_affinity # 将中断绑定到CPU 1
# 使用irqbalance自动平衡中断
systemctl enable irqbalance
性能监控工具
# 实时监控网络流量
iftop -i eth0
nload eth0
bmon
# 详细的网络统计
ss -i # 显示socket统计信息
netstat -i # 显示接口统计
cat /proc/net/dev # 查看网络设备统计
# 网卡性能测试
iperf3 -s # 服务端
iperf3 -c server_ip -t 60 # 客户端测试60秒
常见性能问题诊断
丢包问题排查
# 查看系统级丢包统计
cat /proc/net/softnet_stat
# 查看网卡级丢包
ethtool -S eth0 | grep -i drop
# 查看缓冲区溢出
netstat -i | grep -i overrun
# 实时监控丢包
watch -n 1 'cat /proc/net/dev | grep eth0'
延迟问题优化
# 禁用节能模式
ethtool -s eth0 wol d
# 调整中断延迟
echo 0 > /proc/sys/net/core/busy_poll
echo 50 > /proc/sys/net/core/busy_read
# 使用高精度时钟
echo 1 > /proc/sys/net/core/low_latency_poll
1.2 虚拟网卡(Virtual Network Interface)
基本概念
- 定义:通过软件模拟出来的网络接口,没有物理硬件与之对应,用于在操作系统内部或虚拟机之间创建逻辑上的网络连接
- 特点:由软件模拟,没有对应的物理硬件
- 实现原理:基于内核网络子系统,通过软件实现数据包的处理和转发
虚拟网卡架构原理
内核实现机制
用户空间
↓
系统调用(socket、ioctl)
↓
内核网络协议栈
↓
虚拟网络设备驱动
↓
软件数据包处理
↓
内存缓冲区操作
数据包流转过程
- 发送路径:应用 → 协议栈 → 虚拟设备 → 目标处理
- 接收路径:源生成 → 虚拟设备 → 协议栈 → 应用
- 零拷贝优化:减少内存拷贝次数,提高性能
主要类型深度解析
回环接口(Loopback - lo)
- 技术特点:
- IP地址固定为127.0.0.1/8
- MTU通常为65536字节
- 延迟极低,带宽理论无限制
- 内核实现:数据包直接在内核内部转发,不经过网络协议栈的完整流程
- 应用场景:
- 本地服务通信(数据库连接、缓存访问)
- 应用程序自测试
- 容器内部通信
性能特性:
# 查看回环接口统计
cat /proc/net/dev | grep lo
# 测试回环接口性能
iperf3 -s -B 127.0.0.1 &
iperf3 -c 127.0.0.1 -t 10
VLAN接口(如 eth0.100)
- 技术原理:
- 基于802.1Q标准实现
- 在以太网帧头插入4字节VLAN标签
- 支持优先级标记(3位)和VLAN ID(12位)
- 性能考虑:
- VLAN标签处理会增加少量CPU开销
- 支持硬件VLAN卸载以提高性能
高级配置:
# 创建带优先级的VLAN接口
ip link add link eth0 name eth0.100 type vlan id 100 egress 0:1 1:2
# 设置VLAN接口的QoS参数
tc qdisc add dev eth0.100 root handle 1: htb default 30
tc class add dev eth0.100 parent 1: classid 1:1 htb rate 100mbit
# 查看VLAN接口详细信息
cat /proc/net/vlan/eth0.100
隧道接口深度解析
TUN接口(三层隧道)
- 工作原理:
- 工作在网络层(Layer 3)
- 处理IP数据包,不包含以太网头
- 用户空间程序可以直接读写IP包
编程接口:
// C语言示例:打开TUN设备
int tun_fd = open("/dev/net/tun", O_RDWR);
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
strcpy(ifr.ifr_name, "tun0");
ioctl(tun_fd, TUNSETIFF, (void *)&ifr);
创建和配置:
# 创建TUN接口
ip tuntap add dev tun0 mode tun
ip addr add 10.0.0.1/24 dev tun0
ip link set tun0 up
# 设置路由
ip route add 192.168.100.0/24 dev tun0
# 删除TUN接口
ip tuntap del dev tun0 mode tun
TAP接口(二层隧道)
- 工作原理:
- 工作在数据链路层(Layer 2)
- 处理完整的以太网帧
- 包含MAC地址信息
虚拟化应用:
# QEMU/KVM中使用TAP接口
qemu-system-x86_64 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
-device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:56
配置示例:
# 创建TAP接口
ip tuntap add dev tap0 mode tap
ip link set tap0 up
# 将TAP接口加入网桥
brctl addbr br0
brctl addif br0 tap0
brctl addif br0 eth0
ip link set br0 up
虚拟以太网设备(veth)
- 技术特点:
- 总是成对创建(veth pair)
- 一端发送的数据包会在另一端接收
- 支持全双工通信
容器网络应用:
# Docker网络原理模拟
# 1. 创建网桥
brctl addbr docker0
ip addr add 172.17.0.1/16 dev docker0
ip link set docker0 up
# 2. 为容器创建veth对
ip link add veth-container type veth peer name veth-host
brctl addif docker0 veth-host
ip link set veth-host up
# 3. 将容器端veth移入容器命名空间
ip link set veth-container netns container-ns
高级用法:
# 创建veth对
ip link add veth0 type veth peer name veth1
# 将veth一端放入网络命名空间
ip netns add ns1
ip link set veth1 netns ns1
# 配置命名空间内的网络
ip netns exec ns1 ip addr add 192.168.1.2/24 dev veth1
ip netns exec ns1 ip link set veth1 up
ip netns exec ns1 ip link set lo up
# 配置主命名空间
ip addr add 192.168.1.1/24 dev veth0
ip link set veth0 up
# 测试连通性
ping 192.168.1.2
ip netns exec ns1 ping 192.168.1.1
桥接接口(Bridge)
- 技术原理:
- 工作在数据链路层(Layer 2)
- 实现多个网络接口的二层互联
- 支持MAC地址学习和转发
VLAN感知网桥:
# 启用VLAN过滤
echo 1 > /sys/class/net/br0/bridge/vlan_filtering
# 为端口配置VLAN
bridge vlan add vid 100 dev eth0
bridge vlan add vid 200 dev eth1
# 查看VLAN配置
bridge vlan show
高级配置:
# 创建网桥
ip link add br0 type bridge
ip link set br0 up
# 添加接口到网桥
ip link set eth0 master br0
ip link set eth1 master br0
# 配置STP(生成树协议)
echo 1 > /sys/class/net/br0/bridge/stp_state
# 设置网桥优先级
echo 32768 > /sys/class/net/br0/bridge/priority
# 查看MAC地址表
brctl showmacs br0
# 设置老化时间
echo 300 > /sys/class/net/br0/bridge/ageing_time
绑定接口(Bonding)
- 绑定模式详解:
- mode 0 (balance-rr):轮询模式,负载均衡
- mode 1 (active-backup):主备模式,高可用
- mode 2 (balance-xor):XOR哈希负载均衡
- mode 3 (broadcast):广播模式
- mode 4 (802.3ad):IEEE 802.3ad动态链路聚合
- mode 5 (balance-tlb):传输负载均衡
- mode 6 (balance-alb):自适应负载均衡
高级配置:
# 创建bonding接口
modprobe bonding
echo +bond0 > /sys/class/net/bonding_masters
# 设置bonding模式
echo 802.3ad > /sys/class/net/bond0/bonding/mode
echo 100 > /sys/class/net/bond0/bonding/miimon
echo layer3+4 > /sys/class/net/bond0/bonding/xmit_hash_policy
# 添加从接口
echo +eth0 > /sys/class/net/bond0/bonding/slaves
echo +eth1 > /sys/class/net/bond0/bonding/slaves
# 配置IP地址
ip addr add 192.168.1.100/24 dev bond0
ip link set bond0 up
# 查看bonding状态
cat /proc/net/bonding/bond0
虚拟网卡性能优化
内存优化
# 调整虚拟设备队列长度
ip link set dev veth0 txqueuelen 1000
# 设置虚拟设备MTU
ip link set dev veth0 mtu 9000
CPU优化
# 绑定虚拟设备中断到特定CPU
echo 2 > /proc/irq/$(cat /proc/interrupts | grep veth0 | cut -d: -f1)/smp_affinity
# 使用多队列虚拟设备
ip link add veth0 numtxqueues 4 numrxqueues 4 type veth peer name veth1
虚拟网卡监控和调试
流量监控
# 监控虚拟接口流量
watch -n 1 'cat /proc/net/dev | grep -E "(veth|tun|tap|br)"'
# 使用tcpdump抓包
tcpdump -i veth0 -n
# 统计虚拟设备性能
sar -n DEV 1 | grep -E "(veth|tun|tap|br)"
故障诊断
# 检查虚拟设备状态
ip link show type veth
ip link show type bridge
ip link show type bond
# 查看网络命名空间
ip netns list
ip netns exec ns1 ip addr show
# 检查桥接表
bridge fdb show
bridge mdb show
2. 网络隔离技术:VLAN
2.1 VLAN基础概念与技术原理
什么是VLAN?
- 定义:Virtual Local Area Network(虚拟局域网),是一种将物理网络逻辑分割成多个独立广播域的技术
- 标准:基于IEEE 802.1Q标准
- 目的:提高网络安全性、减少广播域、简化网络管理、提高网络利用率
VLAN技术原理深度解析
802.1Q标签结构
以太网帧结构(带VLAN标签):
|目标MAC|源MAC|VLAN标签|类型|数据|FCS|
| 6B | 6B | 4B | 2B |变长| 4B|
VLAN标签(4字节)详细结构:
|TPID(16bit)|PCP(3bit)|DEI(1bit)|VID(12bit)|
| 0x8100 | 优先级 | 丢弃指示 | VLAN ID |
VLAN标签字段详解
- TPID(Tag Protocol Identifier):标签协议标识符,固定值0x8100
- PCP(Priority Code Point):优先级代码点,3位,支持8个优先级(0-7)
- DEI(Drop Eligible Indicator):丢弃合格指示符,1位,用于拥塞控制
- VID(VLAN Identifier):VLAN标识符,12位,范围1-4094
VLAN工作机制
- 标签插入:交换机在帧进入时插入VLAN标签
- 标签移除:交换机在帧离开时移除VLAN标签
- 转发决策:基于VLAN ID和MAC地址表进行转发
- 广播域隔离:不同VLAN之间的广播流量完全隔离
VLAN的优势与局限性
技术优势
- 逻辑分段:无需物理分离即可实现网络分段
- 灵活性:用户可以跨物理位置属于同一VLAN
- 安全性:提供二层隔离,增强网络安全
- 管理简化:集中化VLAN管理,降低运维复杂度
- 成本效益:减少物理设备需求
技术局限性
- VLAN数量限制:最多支持4094个VLAN
- 跨网段通信:需要三层设备进行VLAN间路由
- 配置复杂性:大规模网络中VLAN配置管理复杂
- 故障排查:增加网络故障诊断难度
2.2 VLAN配置与管理
使用ip命令配置VLAN(推荐方法)
# 加载8021q内核模块
modprobe 8021q
# 创建VLAN接口
ip link add link eth0 name eth0.100 type vlan id 100
# 设置VLAN接口属性
ip link set eth0.100 address 00:11:22:33:44:55 # 设置MAC地址
ip link set eth0.100 mtu 1500 # 设置MTU
# 配置IP地址
ip addr add 192.168.100.1/24 dev eth0.100
# 启用接口
ip link set eth0.100 up
# 配置VLAN优先级映射
ip link set eth0.100 type vlan egress 0:1 1:2 2:3 3:4
# 查看VLAN接口详细信息
ip -d link show eth0.100
# 删除VLAN接口
ip link delete eth0.100
高级VLAN配置
QoS优先级配置
# 创建带优先级映射的VLAN接口
ip link add link eth0 name eth0.200 type vlan id 200 \
egress 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7 \
ingress 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7
# 使用tc配置流量控制
tc qdisc add dev eth0.200 root handle 1: htb default 30
tc class add dev eth0.200 parent 1: classid 1:1 htb rate 100mbit
tc class add dev eth0.200 parent 1:1 classid 1:10 htb rate 50mbit ceil 100mbit
tc class add dev eth0.200 parent 1:1 classid 1:20 htb rate 30mbit ceil 80mbit
VLAN接口绑定
# 创建多个VLAN接口并绑定
ip link add link eth0 name eth0.100 type vlan id 100
ip link add link eth0 name eth0.200 type vlan id 200
# 创建bonding接口
ip link add bond0 type bond mode 802.3ad
ip link set eth0.100 master bond0
ip link set eth0.200 master bond0
传统vconfig工具(兼容性配置)
# 加载8021q模块
modprobe 8021q
# 创建VLAN
vconfig add eth0 100
vconfig set_name_type VLAN_PLUS_VID_NO_PAD
# 设置VLAN优先级
vconfig set_egress_map eth0.100 0 1
vconfig set_ingress_map eth0.100 0 1
# 配置IP地址
ifconfig eth0.100 192.168.100.1 netmask 255.255.255.0 up
# 删除VLAN
vconfig rem eth0.100
2.3 VLAN类型与端口模式
Access端口(接入端口)
- 特点:
- 只属于一个VLAN
- 发送不带标签的帧
- 接收时自动添加VLAN标签
- 应用场景:连接终端设备(PC、服务器、打印机等)
配置示例:
# 模拟Access端口行为
ip link add link eth0 name eth0.100 type vlan id 100
ip addr add 192.168.100.10/24 dev eth0.100
ip link set eth0.100 up
# 设置默认VLAN(native VLAN)
echo 100 > /sys/class/net/eth0/vlan_id
Trunk端口(中继端口)
- 特点:
- 可以传输多个VLAN的流量
- 帧带有VLAN标签
- 支持Native VLAN(不带标签的VLAN)
- 应用场景:交换机间连接、交换机与路由器连接
配置示例:
# 创建多个VLAN接口模拟Trunk
for vlan in 100 200 300; do
ip link add link eth0 name eth0.$vlan type vlan id $vlan
ip link set eth0.$vlan up
done
# 配置网桥聚合多个VLAN
ip link add br-trunk type bridge
for vlan in 100 200 300; do
ip link set eth0.$vlan master br-trunk
done
ip link set br-trunk up
Hybrid端口(混合端口)
- 特点:
- 可以同时处理带标签和不带标签的帧
- 对不同VLAN可以配置不同的标签行为
- 比Trunk端口更灵活但配置复杂
Linux实现方式:
# 使用bridge实现Hybrid端口功能
ip link add br-hybrid type bridge vlan_filtering 1
# 添加物理接口
ip link set eth0 master br-hybrid
# 配置VLAN(tagged)
bridge vlan add vid 100 dev eth0
bridge vlan add vid 200 dev eth0
# 配置VLAN(untagged)
bridge vlan add vid 300 dev eth0 untagged
bridge vlan add vid 300 dev br-hybrid self
2.4 高级VLAN技术
VLAN间路由(Inter-VLAN Routing)
单臂路由(Router-on-a-Stick)
# 路由器配置多个VLAN子接口
ip link add link eth0 name eth0.100 type vlan id 100
ip link add link eth0 name eth0.200 type vlan id 200
ip link add link eth0 name eth0.300 type vlan id 300
# 配置各VLAN网关
ip addr add 192.168.100.1/24 dev eth0.100
ip addr add 192.168.200.1/24 dev eth0.200
ip addr add 192.168.300.1/24 dev eth0.300
# 启用IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 启用所有接口
for vlan in 100 200 300; do
ip link set eth0.$vlan up
done
SVI(Switch Virtual Interface)
# 使用bridge实现SVI功能
ip link add br100 type bridge
ip link add br200 type bridge
# 配置VLAN接口
ip link add link eth0 name eth0.100 type vlan id 100
ip link add link eth0 name eth0.200 type vlan id 200
# 将VLAN接口加入对应网桥
ip link set eth0.100 master br100
ip link set eth0.200 master br200
# 配置网桥IP(作为网关)
ip addr add 192.168.100.1/24 dev br100
ip addr add 192.168.200.1/24 dev br200
# 启用所有接口
ip link set br100 up
ip link set br200 up
ip link set eth0.100 up
ip link set eth0.200 up
三层交换(Layer 3 Switching)
# 配置路由表实现VLAN间路由
ip route add 192.168.100.0/24 dev eth0.100
ip route add 192.168.200.0/24 dev eth0.200
# 配置策略路由
ip rule add from 192.168.100.0/24 table 100
ip rule add from 192.168.200.0/24 table 200
ip route add default via 192.168.100.1 table 100
ip route add default via 192.168.200.1 table 200
QinQ技术(802.1ad)
QinQ基本概念
- 定义:VLAN-in-VLAN,在原有VLAN标签外再添加一层VLAN标签
- 用途:服务提供商网络中的客户VLAN隔离
- 标签结构:外层标签(S-Tag)+ 内层标签(C-Tag)
QinQ配置实现
# 创建QinQ接口(外层VLAN 100,内层VLAN 200)
ip link add link eth0 name eth0.100 type vlan id 100
ip link add link eth0.100 name eth0.100.200 type vlan id 200
# 配置IP地址
ip addr add 192.168.1.1/24 dev eth0.100.200
# 启用接口
ip link set eth0.100 up
ip link set eth0.100.200 up
# 查看QinQ接口信息
ip -d link show eth0.100.200
QinQ高级配置
# 使用bridge实现QinQ
ip link add br-qinq type bridge vlan_filtering 1
# 配置外层VLAN
ip link add link eth0 name eth0.100 type vlan id 100
ip link set eth0.100 master br-qinq
# 配置内层VLAN映射
bridge vlan add vid 200 dev eth0.100
bridge vlan add vid 300 dev eth0.100
# 设置VLAN协议类型
ip link set eth0.100 type vlan protocol 802.1ad
VLAN安全技术
VLAN跳跃攻击防护
# 禁用DTP(Dynamic Trunking Protocol)
echo 0 > /sys/class/net/eth0/carrier_changes
# 配置端口安全
# 限制MAC地址数量
echo 1 > /sys/class/net/eth0/bridge/multicast_snooping
# 启用BPDU保护
echo 1 > /sys/class/net/br0/bridge/stp_state
私有VLAN(Private VLAN)
# 使用iptables实现私有VLAN功能
# 创建隔离规则
iptables -A FORWARD -i eth0.100 -o eth0.100 -j DROP
iptables -A FORWARD -i eth0.100 -o eth0.200 -j ACCEPT
iptables -A FORWARD -i eth0.200 -o eth0.100 -j ACCEPT
# 使用ebtables进行二层过滤
ebtables -A FORWARD -i eth0.100 -o eth0.100 -j DROP
VLAN ACL(访问控制列表)
# 基于VLAN的访问控制
iptables -A FORWARD -i eth0.100 -d 192.168.200.0/24 -j DROP
iptables -A FORWARD -i eth0.200 -d 192.168.100.0/24 -j DROP
# 基于时间的VLAN访问控制
iptables -A FORWARD -i eth0.100 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT
iptables -A FORWARD -i eth0.100 -j DROP
2.5 VLAN性能优化与监控
性能优化技术
硬件VLAN卸载
# 检查网卡VLAN卸载支持
ethtool -k eth0 | grep vlan
# 启用VLAN硬件卸载
ethtool -K eth0 rx-vlan-offload on
ethtool -K eth0 tx-vlan-offload on
ethtool -K eth0 rx-vlan-filter on
# 检查卸载状态
ethtool -S eth0 | grep vlan
VLAN接口优化
# 调整VLAN接口队列长度
ip link set eth0.100 txqueuelen 1000
# 设置VLAN接口MTU
ip link set eth0.100 mtu 9000
# 启用多队列支持
echo 4 > /sys/class/net/eth0.100/queues/tx-0/xps_cpus
VLAN监控与故障诊断
流量监控
# 监控VLAN接口流量
watch -n 1 'cat /proc/net/dev | grep -E "eth0\."'
# 使用iftop监控VLAN流量
iftop -i eth0.100
# 统计VLAN数据包
tcpdump -i eth0 vlan 100 -c 100
# 分析VLAN标签
tcpdump -i eth0 -e vlan and host 192.168.100.10
故障诊断工具
# 检查VLAN配置
cat /proc/net/vlan/config
cat /proc/net/vlan/eth0.100
# 查看VLAN统计信息
ip -s link show eth0.100
# 检查VLAN路由
ip route show table all | grep eth0.100
# 诊断VLAN连通性
ping -I eth0.100 192.168.100.1
traceroute -i eth0.100 192.168.100.1
常见故障排查
# 检查VLAN模块加载
lsmod | grep 8021q
# 验证VLAN标签
tcpdump -i eth0 -e -n vlan
# 检查交换机VLAN配置
# (需要在交换机上执行)
show vlan brief
show interfaces trunk
# 测试VLAN间通信
# 从VLAN 100 ping VLAN 200
ip netns add vlan100
ip link set eth0.100 netns vlan100
ip netns exec vlan100 ping 192.168.200.1
2.6 VLAN实际应用场景
企业网络分段
# 管理VLAN (VLAN 10) - 网络设备管理
ip link add link eth0 name eth0.10 type vlan id 10
ip addr add 192.168.10.1/24 dev eth0.10
# 用户VLAN (VLAN 20) - 员工办公网络
ip link add link eth0 name eth0.20 type vlan id 20
ip addr add 192.168.20.1/24 dev eth0.20
# 服务器VLAN (VLAN 30) - 服务器网络
ip link add link eth0 name eth0.30 type vlan id 30
ip addr add 192.168.30.1/24 dev eth0.30
# DMZ VLAN (VLAN 40) - 对外服务
ip link add link eth0 name eth0.40 type vlan id 40
ip addr add 192.168.40.1/24 dev eth0.40
# 启用所有VLAN接口
for vlan in 10 20 30 40; do
ip link set eth0.$vlan up
done
多租户云环境
# 租户A的VLAN配置
ip link add link eth0 name eth0.100 type vlan id 100
ip netns add tenant-a
ip link set eth0.100 netns tenant-a
ip netns exec tenant-a ip addr add 10.100.1.1/24 dev eth0.100
ip netns exec tenant-a ip link set eth0.100 up
# 租户B的VLAN配置
ip link add link eth0 name eth0.200 type vlan id 200
ip netns add tenant-b
ip link set eth0.200 netns tenant-b
ip netns exec tenant-b ip addr add 10.200.1.1/24 dev eth0.200
ip netns exec tenant-b ip link set eth0.200 up
# 配置租户间隔离
iptables -A FORWARD -s 10.100.0.0/16 -d 10.200.0.0/16 -j DROP
iptables -A FORWARD -s 10.200.0.0/16 -d 10.100.0.0/16 -j DROP
数据中心网络
# 前端Web服务器VLAN
ip link add link eth0 name eth0.100 type vlan id 100
ip addr add 172.16.100.1/24 dev eth0.100
# 应用服务器VLAN
ip link add link eth0 name eth0.200 type vlan id 200
ip addr add 172.16.200.1/24 dev eth0.200
# 数据库服务器VLAN
ip link add link eth0 name eth0.300 type vlan id 300
ip addr add 172.16.300.1/24 dev eth0.300
# 存储网络VLAN
ip link add link eth0 name eth0.400 type vlan id 400
ip addr add 172.16.400.1/24 dev eth0.400
# 配置三层路由
ip route add 172.16.100.0/24 dev eth0.100
ip route add 172.16.200.0/24 dev eth0.200
ip route add 172.16.300.0/24 dev eth0.300
ip route add 172.16.400.0/24 dev eth0.400
第3章:网络配置工具深度解析
3.1 传统工具:ifconfig深度解析
基本功能与架构原理
ifconfig是传统的网络接口配置工具,基于ioctl系统调用与内核网络子系统交互。虽然在现代Linux发行版中逐渐被ip命令替代,但仍广泛使用。
ifconfig工作原理
- 系统调用:通过SIOCGIFCONF、SIOCSIFADDR等ioctl调用
- 内核交互:直接操作网络设备结构体
- 限制性:只能操作传统网络功能,不支持现代网络特性
基础操作详解
# 查看所有接口(详细信息)
ifconfig -a
# 查看特定接口的详细统计
ifconfig eth0
# 配置IP地址(完整语法)
ifconfig eth0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
# 配置IPv6地址
ifconfig eth0 inet6 add 2001:db8::1/64
# 启用/禁用接口
ifconfig eth0 up
ifconfig eth0 down
# 配置别名接口(多IP)
ifconfig eth0:0 192.168.1.101 netmask 255.255.255.0
ifconfig eth0:1 192.168.1.102 netmask 255.255.255.0
# 修改网络参数
ifconfig eth0 mtu 9000 # 设置巨型帧
ifconfig eth0 txqueuelen 1000 # 设置传输队列长度
ifconfig eth0 hw ether 00:11:22:33:44:55 # 修改MAC地址
# 网络监听模式
ifconfig eth0 promisc # 启用混杂模式
ifconfig eth0 -promisc # 禁用混杂模式
ifconfig eth0 allmulti # 启用多播模式
ifconfig高级功能
# 配置点对点链路
ifconfig ppp0 10.0.0.1 pointopoint 10.0.0.2
# 设置网络掩码(多种方式)
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
ifconfig eth0 192.168.1.100/24
# 配置广播地址
ifconfig eth0 192.168.1.100 broadcast 192.168.1.255
# 设置接口标志
ifconfig eth0 arp # 启用ARP
ifconfig eth0 -arp # 禁用ARP
ifconfig eth0 multicast # 启用多播
ifconfig eth0 -multicast # 禁用多播
ifconfig输出解析
# 详细解析ifconfig输出
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::a00:27ff:fe4e:66a1 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:4e:66:a1 txqueuelen 1000 (Ethernet)
RX packets 1234567 bytes 987654321 (941.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 654321 bytes 123456789 (117.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
字段解释:
- flags:接口状态标志(UP=启用,BROADCAST=支持广播,RUNNING=运行中,MULTICAST=支持多播)
- mtu:最大传输单元
- inet/inet6:IPv4/IPv6地址信息
- ether:MAC地址
- RX/TX packets:接收/发送数据包统计
- errors/dropped/overruns:错误统计
3.2 现代工具:ip命令族深度解析
ip命令是现代Linux网络配置的核心工具,基于netlink套接字与内核通信,提供统一的网络管理接口。
ip命令架构原理
- Netlink通信:使用netlink套接字与内核通信
- 统一接口:提供一致的命令语法和输出格式
- 功能完整:支持所有现代网络特性
- 可扩展性:易于添加新功能和协议支持
3.2.1 ip link - 网络接口管理深度解析
基础接口操作
# 查看所有网络接口(详细信息)
ip link show
ip -d link show # 显示详细信息
ip -s link show # 显示统计信息
ip -s -s link show # 显示更详细统计
# 查看特定接口
ip link show eth0
ip link show type bridge # 按类型查看
ip link show up # 只显示启用的接口
# 启用/禁用接口
ip link set eth0 up
ip link set eth0 down
ip link set eth0 multicast on # 启用多播
ip link set eth0 arp off # 禁用ARP
高级接口配置
# 修改接口属性
ip link set eth0 address 00:11:22:33:44:55 # 修改MAC地址
ip link set eth0 mtu 9000 # 设置MTU
ip link set eth0 txqueuelen 1000 # 设置队列长度
ip link set eth0 name newname # 重命名接口
# 设置接口别名
ip link set eth0 alias "Management Interface"
# 配置接口组
ip link set eth0 group 1
ip link show group 1
# 设置接口命名空间
ip link set eth0 netns namespace1
虚拟接口创建与管理
# 创建各种虚拟接口
ip link add br0 type bridge # 网桥
ip link add bond0 type bond mode 802.3ad # 绑定接口
ip link add veth0 type veth peer name veth1 # veth对
ip link add tun0 type tun # TUN接口
ip link add tap0 type tap # TAP接口
# VLAN接口高级配置
ip link add link eth0 name eth0.100 type vlan id 100 \
egress 0:1 1:2 2:3 3:4 \
ingress 1:0 2:1 3:2 4:3
# MACVLAN接口
ip link add link eth0 name macvlan0 type macvlan mode bridge
# IPVLAN接口
ip link add link eth0 name ipvlan0 type ipvlan mode l2
# 删除虚拟接口
ip link delete br0
ip link delete veth0
3.2.2 ip addr - IP地址管理深度解析
地址查看与分析
# 查看IP地址(多种格式)
ip addr show
ip -4 addr show # 只显示IPv4
ip -6 addr show # 只显示IPv6
ip addr show eth0 # 特定接口
ip addr show scope global # 全局地址
ip addr show scope link # 链路本地地址
# 地址统计信息
ip -s addr show
ip -j addr show | jq '.' # JSON格式输出
地址配置与管理
# 添加IP地址(详细参数)
ip addr add 192.168.1.100/24 dev eth0
ip addr add 192.168.1.100/24 dev eth0 broadcast 192.168.1.255
ip addr add 192.168.1.100/24 dev eth0 label eth0:web
ip addr add 192.168.1.100/24 dev eth0 scope global
ip addr add 192.168.1.100/24 dev eth0 valid_lft 3600 preferred_lft 1800
# IPv6地址配置
ip addr add 2001:db8::1/64 dev eth0
ip addr add fe80::1/64 dev eth0 scope link
# 地址属性设置
ip addr add 192.168.1.100/24 dev eth0 home # 家庭地址
ip addr add 192.168.1.100/24 dev eth0 nodad # 禁用重复地址检测
ip addr add 192.168.1.100/24 dev eth0 tentative # 临时地址
# 删除IP地址
ip addr del 192.168.1.100/24 dev eth0
ip addr flush dev eth0 # 清空所有地址
ip addr flush dev eth0 scope global # 清空全局地址
地址生命周期管理
# 设置地址生命周期
ip addr add 192.168.1.100/24 dev eth0 \
valid_lft 7200 preferred_lft 3600
# 动态更新地址生命周期
ip addr change 192.168.1.100/24 dev eth0 \
valid_lft 14400 preferred_lft 7200
# 查看地址老化信息
ip addr show eth0 | grep -E "(valid_lft|preferred_lft)"
3.2.3 ip route - 路由表管理深度解析
路由表查看与分析
# 查看路由表
ip route show # 主路由表
ip route show table main # 主路由表
ip route show table local # 本地路由表
ip route show table all # 所有路由表
ip route show table 100 # 自定义路由表
# 路由查找
ip route get 8.8.8.8 # 查找到目标的路由
ip route get 8.8.8.8 from 192.168.1.100 # 指定源地址查找
ip route get 8.8.8.8 iif eth0 # 指定入接口查找
# 路由缓存
ip route show cache # 查看路由缓存
ip route flush cache # 清空路由缓存
路由配置与管理
# 基本路由操作
ip route add 192.168.2.0/24 via 192.168.1.1
ip route add 192.168.2.0/24 dev eth0
ip route add default via 192.168.1.1
# 高级路由配置
ip route add 192.168.2.0/24 via 192.168.1.1 \
metric 100 \
mtu 1500 \
window 1024 \
rtt 100ms \
rttvar 50ms
# 多路径路由(ECMP)
ip route add 192.168.2.0/24 \
nexthop via 192.168.1.1 weight 1 \
nexthop via 192.168.1.2 weight 2
# 策略路由
ip route add 192.168.2.0/24 via 192.168.1.1 table 100
ip route add default via 192.168.1.1 table 100
# 路由属性设置
ip route add 192.168.2.0/24 via 192.168.1.1 \
src 192.168.1.100 \
realm 1 \
scope link \
protocol static
路由故障处理
# 路由替换与修改
ip route replace 192.168.2.0/24 via 192.168.1.2
ip route change 192.168.2.0/24 via 192.168.1.2 metric 200
# 路由删除
ip route del 192.168.2.0/24
ip route del default
ip route flush table 100 # 清空路由表
# 路由监控
ip monitor route # 监控路由变化
ip route show | grep -v cache | wc -l # 统计路由数量
3.2.4 ip rule - 策略路由规则深度解析
规则查看与分析
# 查看路由规则
ip rule show
ip rule list # 同上
ip -4 rule show # IPv4规则
ip -6 rule show # IPv6规则
# 规则详细信息
ip -d rule show # 详细信息
ip rule show table main # 特定表的规则
规则配置与管理
# 基于源地址的规则
ip rule add from 192.168.1.0/24 table 100 priority 100
ip rule add from 192.168.2.0/24 table 200 priority 200
# 基于目标地址的规则
ip rule add to 10.0.0.0/8 table 100
ip rule add to 172.16.0.0/12 table 200
# 基于接口的规则
ip rule add iif eth0 table 100
ip rule add oif eth1 table 200
# 基于标记的规则
ip rule add fwmark 1 table 100
ip rule add fwmark 0x10/0xff table 200
# 基于TOS的规则
ip rule add tos 0x10 table 100
# 复合规则
ip rule add from 192.168.1.0/24 to 10.0.0.0/8 \
iif eth0 table 100 priority 50
# 规则删除
ip rule del from 192.168.1.0/24 table 100
ip rule del priority 100
3.2.5 ip neigh - 邻居表管理
邻居表查看
# 查看ARP/邻居表
ip neigh show # 所有邻居
ip neigh show dev eth0 # 特定接口
ip -4 neigh show # IPv4邻居(ARP)
ip -6 neigh show # IPv6邻居(NDP)
# 邻居状态查看
ip neigh show nud reachable # 可达邻居
ip neigh show nud stale # 过期邻居
ip neigh show nud failed # 失败邻居
邻居表管理
# 添加静态邻居条目
ip neigh add 192.168.1.1 lladdr 00:11:22:33:44:55 dev eth0
ip neigh add 192.168.1.1 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
# 修改邻居条目
ip neigh change 192.168.1.1 lladdr 00:11:22:33:44:66 dev eth0
ip neigh replace 192.168.1.1 lladdr 00:11:22:33:44:77 dev eth0
# 删除邻居条目
ip neigh del 192.168.1.1 dev eth0
ip neigh flush dev eth0 # 清空接口邻居表
ip neigh flush all # 清空所有邻居表
3.3 网络监控与性能分析工具
3.3.1 ethtool - 网卡硬件配置与监控
基础信息查看
# 查看网卡基本信息
ethtool eth0 # 链路状态和速度
ethtool -i eth0 # 驱动信息
ethtool -k eth0 # 功能特性
ethtool -g eth0 # 环形缓冲区大小
ethtool -c eth0 # 中断合并设置
高级配置与优化
# 网卡功能配置
ethtool -K eth0 rx-checksumming on # 启用RX校验和卸载
ethtool -K eth0 tx-checksumming on # 启用TX校验和卸载
ethtool -K eth0 scatter-gather on # 启用分散聚集
ethtool -K eth0 tso on # 启用TCP分段卸载
ethtool -K eth0 gso on # 启用通用分段卸载
ethtool -K eth0 gro on # 启用通用接收卸载
# 环形缓冲区调优
ethtool -G eth0 rx 4096 tx 4096 # 设置缓冲区大小
# 中断合并调优
ethtool -C eth0 rx-usecs 50 tx-usecs 50 # 设置中断延迟
ethtool -C eth0 rx-frames 32 tx-frames 32 # 设置帧数阈值
# 队列配置
ethtool -L eth0 combined 4 # 设置队列数量
ethtool -X eth0 equal 4 # 配置RSS
统计信息与诊断
# 详细统计信息
ethtool -S eth0 # 网卡统计
ethtool -S eth0 | grep -E "(error|drop|crc)" # 错误统计
# 自测试
ethtool -t eth0 # 在线自测试
ethtool -t eth0 offline # 离线自测试
# 寄存器转储
ethtool -d eth0 # 寄存器信息
ethtool -e eth0 # EEPROM信息
3.3.2 ss - 套接字统计工具
基础连接查看
# 查看所有连接
ss -tuln # TCP/UDP监听端口
ss -tuna # 所有TCP/UDP连接
ss -4 # IPv4连接
ss -6 # IPv6连接
# 特定协议连接
ss -t # TCP连接
ss -u # UDP连接
ss -x # Unix域套接字
ss -w # Raw套接字
高级过滤与分析
# 端口过滤
ss -tlnp sport = :80 # 监听80端口的进程
ss -tlnp sport = :443 # 监听443端口的进程
ss -tn dst :80 # 连接到80端口
# 状态过滤
ss -t state established # 已建立连接
ss -t state listening # 监听状态
ss -t state time-wait # TIME_WAIT状态
# 地址过滤
ss -t src 192.168.1.100 # 源地址过滤
ss -t dst 192.168.1.1 # 目标地址过滤
# 进程信息
ss -tlnp # 显示进程信息
ss -tlnp | grep nginx # 查找nginx进程连接
连接统计与监控
# 连接统计
ss -s # 套接字统计摘要
ss -i # 显示内部信息
ss -e # 显示详细套接字信息
ss -m # 显示套接字内存使用
# 实时监控
watch -n 1 'ss -s' # 实时统计
ss -t -o state established | wc -l # 统计建立连接数
3.3.3 网络流量监控工具
iftop - 实时流量监控
# 基础使用
iftop # 默认接口流量
iftop -i eth0 # 指定接口
iftop -n # 不解析主机名
iftop -P # 显示端口号
# 高级选项
iftop -i eth0 -n -P -B # 以字节显示
iftop -f "port 80" # 过滤HTTP流量
iftop -f "host 192.168.1.100" # 过滤特定主机
nethogs - 进程网络使用监控
# 监控进程网络使用
nethogs # 默认监控
nethogs eth0 # 指定接口
nethogs -d 5 # 5秒刷新间隔
nethogs -v 3 # 详细模式
vnstat - 网络流量统计
# 安装和初始化
vnstat -u -i eth0 # 初始化接口
vnstat -i eth0 # 查看统计
vnstat -i eth0 -d # 按天统计
vnstat -i eth0 -m # 按月统计
vnstat -i eth0 -h # 按小时统计
3.4 故障诊断工具集
3.4.1 连通性测试工具
ping增强用法
# 基础ping测试
ping -c 4 8.8.8.8 # 发送4个包
ping -i 0.2 8.8.8.8 # 0.2秒间隔
ping -s 1472 8.8.8.8 # 指定包大小
ping -W 2 8.8.8.8 # 2秒超时
# 高级ping选项
ping -f 8.8.8.8 # 洪水ping(需root)
ping -R 8.8.8.8 # 记录路由
ping -T tsonly 8.8.8.8 # 时间戳选项
ping -M do -s 1472 8.8.8.8 # 禁止分片测试MTU
# IPv6 ping
ping6 2001:4860:4860::8888 # IPv6连通性测试
traceroute路径追踪
# 基础路径追踪
traceroute 8.8.8.8 # 默认UDP探测
traceroute -I 8.8.8.8 # ICMP探测
traceroute -T 8.8.8.8 # TCP探测
traceroute -p 80 8.8.8.8 # 指定端口
# 高级选项
traceroute -n 8.8.8.8 # 不解析主机名
traceroute -w 2 8.8.8.8 # 2秒超时
traceroute -q 1 8.8.8.8 # 每跳1个探测包
traceroute -m 15 8.8.8.8 # 最大15跳
# IPv6路径追踪
traceroute6 2001:4860:4860::8888
mtr网络诊断
# 实时网络诊断
mtr 8.8.8.8 # 实时显示
mtr -r -c 100 8.8.8.8 # 报告模式100次
mtr -n 8.8.8.8 # 不解析主机名
mtr -u 8.8.8.8 # UDP模式
mtr -T 8.8.8.8 # TCP模式
# 输出格式
mtr -r -c 10 --json 8.8.8.8 # JSON格式
mtr -r -c 10 --csv 8.8.8.8 # CSV格式
3.4.2 数据包分析工具
tcpdump数据包捕获
# 基础捕获
tcpdump -i eth0 # 捕获所有流量
tcpdump -i eth0 -n # 不解析地址
tcpdump -i eth0 -c 100 # 捕获100个包
tcpdump -i eth0 -w capture.pcap # 保存到文件
# 协议过滤
tcpdump -i eth0 tcp # TCP流量
tcpdump -i eth0 udp # UDP流量
tcpdump -i eth0 icmp # ICMP流量
tcpdump -i eth0 arp # ARP流量
# 地址和端口过滤
tcpdump -i eth0 host 192.168.1.100 # 特定主机
tcpdump -i eth0 port 80 # 特定端口
tcpdump -i eth0 src 192.168.1.100 # 源地址
tcpdump -i eth0 dst 192.168.1.1 # 目标地址
# 复合过滤
tcpdump -i eth0 'tcp and port 80'
tcpdump -i eth0 'host 192.168.1.100 and port 22'
tcpdump -i eth0 'net 192.168.1.0/24'
高级数据包分析
# 详细包内容
tcpdump -i eth0 -X # 十六进制和ASCII
tcpdump -i eth0 -xx # 完整十六进制
tcpdump -i eth0 -v # 详细信息
tcpdump -i eth0 -vv # 更详细信息
# 特定协议分析
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0' # SYN包
tcpdump -i eth0 'tcp[tcpflags] & tcp-rst != 0' # RST包
tcpdump -i eth0 'icmp[icmptype] = icmp-echo' # ICMP echo
# 时间戳和大小
tcpdump -i eth0 -ttt # 相对时间戳
tcpdump -i eth0 -s 0 # 捕获完整包
tcpdump -i eth0 -s 68 # 只捕获包头
3.5 工具对比与选择指南
传统工具 vs 现代工具对比
| 功能类别 | 传统工具 | 现代工具 | 推荐使用 |
|---|---|---|---|
| 接口配置 | ifconfig |
ip link/addr |
ip命令 |
| 路由管理 | route |
ip route |
ip命令 |
| ARP管理 | arp |
ip neigh |
ip命令 |
| 连接查看 | netstat |
ss |
ss命令 |
| 网卡配置 | mii-tool |
ethtool |
ethtool |
| 流量监控 | iptraf |
iftop/nethogs |
现代工具 |
工具选择建议
日常网络配置
# 推荐使用ip命令族
ip link show # 替代 ifconfig
ip addr show # 替代 ifconfig
ip route show # 替代 route -n
ip neigh show # 替代 arp -a
ss -tuln # 替代 netstat -tuln
性能监控场景
# 网卡性能监控
ethtool -S eth0 # 硬件统计
sar -n DEV 1 # 系统级监控
iftop -i eth0 # 实时流量
# 连接监控
ss -s # 连接统计
nethogs # 进程流量
vnstat -i eth0 # 历史统计
故障诊断场景
# 连通性诊断
ping -c 4 target # 基础连通性
mtr target # 路径质量
traceroute target # 路径追踪
# 深度分析
tcpdump -i eth0 host target # 包级分析
ss -i # 连接详情
ethtool eth0 # 物理层状态
脚本化网络管理
网络状态检查脚本
#!/bin/bash
# 网络状态检查脚本
echo "=== 网络接口状态 ==="
ip link show | grep -E "^[0-9]+:" | while read line; do
iface=$(echo $line | cut -d: -f2 | tr -d ' ')
state=$(echo $line | grep -o "state [A-Z]*" | cut -d' ' -f2)
echo "接口: $iface, 状态: $state"
done
echo -e "\n=== IP地址配置 ==="
ip -4 addr show | grep -E "inet " | while read line; do
ip=$(echo $line | awk '{print $2}')
dev=$(echo $line | awk '{print $NF}')
echo "设备: $dev, IP: $ip"
done
echo -e "\n=== 路由表 ==="
ip route show | head -10
echo -e "\n=== 连接统计 ==="
ss -s
网络性能监控脚本
#!/bin/bash
# 网络性能监控脚本
INTERFACE="eth0"
INTERVAL=5
while true; do
echo "=== $(date) ==="
# 接口统计
RX_BYTES=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
TX_BYTES=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
RX_PACKETS=$(cat /sys/class/net/$INTERFACE/statistics/rx_packets)
TX_PACKETS=$(cat /sys/class/net/$INTERFACE/statistics/tx_packets)
echo "RX: $RX_BYTES bytes, $RX_PACKETS packets"
echo "TX: $TX_BYTES bytes, $TX_PACKETS packets"
# 连接数统计
ESTABLISHED=$(ss -t state established | wc -l)
LISTENING=$(ss -tl | wc -l)
echo "建立连接: $ESTABLISHED, 监听端口: $LISTENING"
sleep $INTERVAL
done
第4章:路由与策略路由深度解析
4.1 路由基础理论与实现
路由概念与原理
- 定义:路由是网络层的核心功能,决定数据包从源到目标的最佳传输路径
- 作用机制:基于目标地址查找路由表,确定下一跳地址和出接口
- 路由决策:内核根据最长前缀匹配原则选择最具体的路由条目
Linux路由子系统架构
用户空间工具
├── ip route (iproute2)
├── route (net-tools)
└── 路由守护进程 (quagga/frr)
内核路由子系统
├── 路由表管理 (FIB - Forwarding Information Base)
├── 路由缓存 (Route Cache)
├── 邻居子系统 (Neighbor Subsystem)
└── 网络命名空间 (Network Namespace)
路由表结构详解
Linux支持多达255个路由表,每个表包含:
- 目标网络:目标地址和子网掩码
- 网关:下一跳路由器地址
- 接口:出接口设备
- 度量值:路由优先级
- 协议:路由来源(kernel、static、dynamic)
- 作用域:路由作用范围(global、link、host)
路由类型深度解析
直连路由(Connected Routes)
# 自动生成的直连路由
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10
# 查看直连路由
ip route show proto kernel
# 直连路由特点
# - 自动生成,无需手动配置
# - 优先级最高(metric 0)
# - 作用域为link
# - 协议标记为kernel
静态路由(Static Routes)
# 基本静态路由
ip route add 10.1.0.0/16 via 192.168.1.254 dev eth0
# 带度量值的静态路由
ip route add 10.2.0.0/16 via 192.168.1.254 metric 100
# 多路径静态路由
ip route add 10.3.0.0/16 \
nexthop via 192.168.1.1 weight 1 \
nexthop via 192.168.1.2 weight 2
# 黑洞路由(丢弃数据包)
ip route add blackhole 10.4.0.0/16
# 禁止路由(返回ICMP不可达)
ip route add prohibit 10.5.0.0/16
# 不可达路由(返回ICMP网络不可达)
ip route add unreachable 10.6.0.0/16
默认路由(Default Route)
# 添加默认路由
ip route add default via 192.168.1.1 dev eth0
# 多个默认路由(负载均衡)
ip route add default \
nexthop via 192.168.1.1 weight 1 \
nexthop via 192.168.1.2 weight 1
# 备份默认路由
ip route add default via 192.168.1.1 metric 100
ip route add default via 192.168.1.2 metric 200
# 查看默认路由
ip route show default
路由算法与选择机制
最长前缀匹配(Longest Prefix Match)
# 路由表示例
10.0.0.0/8 via 192.168.1.1 # 匹配长度:8
10.1.0.0/16 via 192.168.1.2 # 匹配长度:16
10.1.1.0/24 via 192.168.1.3 # 匹配长度:24
default via 192.168.1.254 # 匹配长度:0
# 对于目标地址 10.1.1.100
# 选择 10.1.1.0/24 路由(最长匹配)
路由度量值(Metric)比较
# 相同目标的多条路由
ip route add 10.1.0.0/16 via 192.168.1.1 metric 100
ip route add 10.1.0.0/16 via 192.168.1.2 metric 200
# 内核选择metric值较小的路由
ip route get 10.1.1.1 # 将选择第一条路由
路由协议优先级
# 不同协议的路由优先级(数值越小优先级越高)
# 0: 直连路由
# 1: 静态路由
# 2-255: 动态路由协议(OSPF、BGP等)
# 查看路由协议信息
ip route show | grep -E "(proto|metric)"
4.2 高级路由配置与管理
多路径路由(ECMP - Equal Cost Multi-Path)
ECMP基本配置
# 创建等价多路径路由
ip route add 10.1.0.0/16 \
nexthop via 192.168.1.1 dev eth0 weight 1 \
nexthop via 192.168.1.2 dev eth1 weight 1
# 不等权重多路径
ip route add 10.2.0.0/16 \
nexthop via 192.168.1.1 weight 3 \
nexthop via 192.168.1.2 weight 1
# 查看多路径路由
ip route show 10.1.0.0/16
ECMP负载均衡算法
# 配置ECMP哈希算法
echo 1 > /proc/sys/net/ipv4/fib_multipath_hash_policy
# 哈希策略选项:
# 0: Layer 3 (源IP + 目标IP)
# 1: Layer 4 (L3 + 源端口 + 目标端口)
# 2: Layer 3 + 流标签
# 查看当前哈希策略
cat /proc/sys/net/ipv4/fib_multipath_hash_policy
ECMP故障检测与恢复
# 启用路径故障检测
echo 1 > /proc/sys/net/ipv4/fib_multipath_use_neigh
# 配置邻居可达性检测
ip route add 10.1.0.0/16 \
nexthop via 192.168.1.1 dev eth0 \
nexthop via 192.168.1.2 dev eth1 \
dead_neigh_timeout 30
# 手动禁用故障路径
ip route change 10.1.0.0/16 \
nexthop via 192.168.1.1 dev eth0 dead \
nexthop via 192.168.1.2 dev eth1
路由表管理与优化
自定义路由表
# 编辑路由表定义文件
echo "100 custom_table" >> /etc/iproute2/rt_tables
echo "200 backup_table" >> /etc/iproute2/rt_tables
# 在自定义表中添加路由
ip route add 10.1.0.0/16 via 192.168.1.1 table custom_table
ip route add default via 192.168.1.254 table custom_table
# 查看自定义路由表
ip route show table custom_table
ip route show table all
路由表性能优化
# 路由缓存配置
echo 1024 > /proc/sys/net/ipv4/route/max_size
echo 300 > /proc/sys/net/ipv4/route/gc_timeout
# FIB哈希表大小调优
echo 16 > /proc/sys/net/ipv4/fib_multipath_hash_policy
# 路由查找优化
echo 1 > /proc/sys/net/ipv4/fib_trie_resize
路由监控与调试
路由变化监控
# 实时监控路由变化
ip monitor route
# 监控特定表的路由变化
ip monitor route table 100
# 记录路由变化到文件
ip monitor route > /var/log/route_changes.log &
路由调试工具
# 路由查找测试
ip route get 10.1.1.1 # 查找路由
ip route get 10.1.1.1 from 192.168.1.100 # 指定源地址查找
ip route get 10.1.1.1 iif eth0 # 指定入接口查找
# 路由统计信息
cat /proc/net/route # 内核路由表
cat /proc/net/fib_trie # FIB trie结构
cat /proc/net/rt_cache # 路由缓存
# 路由性能统计
ss -s | grep -A 5 "Route"
4.3 策略路由深度解析
策略路由架构原理
策略路由工作机制
数据包到达
↓
查询路由规则 (ip rule)
↓
根据规则条件匹配
↓
选择对应路由表
↓
在选定表中查找路由
↓
确定下一跳和出接口
规则优先级系统
# 查看规则优先级
ip rule show
# 默认规则(优先级从高到低)
# 0: from all lookup local
# 32766: from all lookup main
# 32767: from all lookup default
# 自定义规则优先级
ip rule add from 192.168.1.0/24 table 100 priority 100
ip rule add to 10.0.0.0/8 table 200 priority 200
高级策略路由配置
基于源地址的策略路由
# 不同源网段使用不同网关
ip rule add from 192.168.1.0/24 table wan1 priority 100
ip rule add from 192.168.2.0/24 table wan2 priority 101
# 配置对应路由表
ip route add default via 10.0.1.1 table wan1
ip route add default via 10.0.2.1 table wan2
# 添加本地网络路由到所有表
ip route add 192.168.1.0/24 dev eth0 table wan1
ip route add 192.168.2.0/24 dev eth1 table wan1
ip route add 192.168.1.0/24 dev eth0 table wan2
ip route add 192.168.2.0/24 dev eth1 table wan2
基于目标地址的策略路由
# 特定目标网络使用专用链路
ip rule add to 10.0.0.0/8 table internal priority 100
ip rule add to 172.16.0.0/12 table internal priority 101
# 配置内部网络路由表
ip route add 10.0.0.0/8 via 192.168.1.10 table internal
ip route add 172.16.0.0/12 via 192.168.1.11 table internal
基于接口的策略路由
# 不同入接口使用不同路由表
ip rule add iif eth0 table lan_table priority 100
ip rule add iif eth1 table dmz_table priority 101
ip rule add oif eth2 table wan_table priority 102
# 配置对应路由表
ip route add default via 192.168.1.1 table lan_table
ip route add default via 192.168.2.1 table dmz_table
ip route add 0.0.0.0/0 via 10.0.0.1 table wan_table
基于服务类型的策略路由
# 基于TOS字段的路由
ip rule add tos 0x10 table high_priority priority 100
ip rule add tos 0x08 table normal priority 200
# 基于fwmark的路由(与iptables结合)
ip rule add fwmark 1 table voip priority 100
ip rule add fwmark 2 table video priority 101
ip rule add fwmark 3 table data priority 102
# iptables标记数据包
iptables -t mangle -A OUTPUT -p udp --dport 5060 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 3
策略路由高级应用
多WAN负载均衡
#!/bin/bash
# 多WAN负载均衡配置脚本
# 定义WAN接口和网关
WAN1_IF="eth0"
WAN1_GW="10.0.1.1"
WAN1_TABLE="wan1"
WAN2_IF="eth1"
WAN2_GW="10.0.2.1"
WAN2_TABLE="wan2"
# 创建路由表
echo "100 $WAN1_TABLE" >> /etc/iproute2/rt_tables
echo "200 $WAN2_TABLE" >> /etc/iproute2/rt_tables
# 配置WAN1路由表
ip route add default via $WAN1_GW dev $WAN1_IF table $WAN1_TABLE
ip route add 10.0.1.0/24 dev $WAN1_IF table $WAN1_TABLE
# 配置WAN2路由表
ip route add default via $WAN2_GW dev $WAN2_IF table $WAN2_TABLE
ip route add 10.0.2.0/24 dev $WAN2_IF table $WAN2_TABLE
# 负载均衡规则
ip rule add from 10.0.1.0/24 table $WAN1_TABLE priority 100
ip rule add from 10.0.2.0/24 table $WAN2_TABLE priority 101
# 主路由表负载均衡
ip route add default scope global \
nexthop via $WAN1_GW dev $WAN1_IF weight 1 \
nexthop via $WAN2_GW dev $WAN2_IF weight 1
故障切换配置
#!/bin/bash
# WAN故障切换脚本
check_wan_connectivity() {
local gateway=$1
local interface=$2
# 通过指定接口ping网关
ping -c 3 -W 2 -I $interface $gateway > /dev/null 2>&1
return $?
}
# 主WAN检查
if check_wan_connectivity "10.0.1.1" "eth0"; then
# 主WAN正常,使用主路由
ip route replace default via 10.0.1.1 dev eth0 metric 100
ip route replace default via 10.0.2.1 dev eth1 metric 200
else
# 主WAN故障,切换到备用WAN
ip route replace default via 10.0.2.1 dev eth1 metric 100
ip route replace default via 10.0.1.1 dev eth0 metric 200
fi
基于应用的流量分流
# HTTP流量走WAN1
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 1
ip rule add fwmark 1 table wan1 priority 100
# P2P流量走WAN2
iptables -t mangle -A OUTPUT -p tcp --dport 6881:6889 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p udp --dport 6881:6889 -j MARK --set-mark 2
ip rule add fwmark 2 table wan2 priority 101
# VoIP流量走高优先级路径
iptables -t mangle -A OUTPUT -p udp --dport 5060 -j MARK --set-mark 3
ip rule add fwmark 3 table voip priority 50
4.4 动态路由协议
路由协议概述
静态路由 vs 动态路由
| 特性 | 静态路由 | 动态路由 |
|---|---|---|
| 配置复杂度 | 简单 | 复杂 |
| 网络适应性 | 差 | 好 |
| 资源消耗 | 低 | 高 |
| 故障恢复 | 手动 | 自动 |
| 适用场景 | 小型网络 | 大型网络 |
常见动态路由协议
- RIP:距离向量协议,简单但收敛慢
- OSPF:链路状态协议,快速收敛,适合企业网
- BGP:路径向量协议,用于互联网骨干网
- EIGRP:Cisco专有,混合协议
Linux动态路由实现
Quagga/FRR路由套件
# 安装FRR
apt-get install frr frr-pythontools
# 启用路由协议
echo 'zebra=yes' >> /etc/frr/daemons
echo 'ospfd=yes' >> /etc/frr/daemons
echo 'bgpd=yes' >> /etc/frr/daemons
# 启动FRR服务
systemctl enable frr
systemctl start frr
OSPF配置示例
# 进入FRR配置模式
vtysh
# 配置OSPF
configure terminal
router ospf
ospf router-id 1.1.1.1
network 192.168.1.0/24 area 0
network 10.0.0.0/8 area 1
passive-interface lo
exit
# 配置接口
interface eth0
ip ospf cost 10
ip ospf hello-interval 5
ip ospf dead-interval 20
exit
# 保存配置
write memory
BGP配置示例
# 配置BGP
router bgp 65001
bgp router-id 1.1.1.1
neighbor 10.0.0.1 remote-as 65002
neighbor 10.0.0.1 description "ISP Connection"
address-family ipv4 unicast
network 192.168.1.0/24
neighbor 10.0.0.1 activate
neighbor 10.0.0.1 soft-reconfiguration inbound
exit-address-family
exit
4.5 路由性能优化与故障排除
路由性能优化
内核参数调优
# 路由表大小优化
echo 65536 > /proc/sys/net/ipv4/route/max_size
echo 1024 > /proc/sys/net/ipv4/route/gc_thresh
# 路由缓存优化
echo 300 > /proc/sys/net/ipv4/route/gc_timeout
echo 100 > /proc/sys/net/ipv4/route/gc_interval
# FIB优化
echo 1 > /proc/sys/net/ipv4/fib_multipath_use_neigh
echo 1 > /proc/sys/net/ipv4/fib_multipath_hash_policy
# IPv6路由优化
echo 4096 > /proc/sys/net/ipv6/route/max_size
路由表结构优化
# 路由聚合示例
# 替换多个具体路由
ip route del 192.168.1.0/24
ip route del 192.168.2.0/24
ip route del 192.168.3.0/24
ip route del 192.168.4.0/24
# 使用聚合路由
ip route add 192.168.0.0/22 via 10.0.0.1
# 路由表分层
# 将不同类型路由分配到不同表
ip rule add from 192.168.0.0/16 table local_routes priority 100
ip rule add to 10.0.0.0/8 table internal_routes priority 200
路由故障排除
路由诊断工具
# 路由跟踪
traceroute -n 8.8.8.8 # 基本路由跟踪
mtr -r -c 10 8.8.8.8 # 高级路由分析
traceroute -T -p 80 8.8.8.8 # TCP路由跟踪
# 路由查找测试
ip route get 8.8.8.8 # 查找路由
ip route get 8.8.8.8 from 192.168.1.100 # 指定源查找
ip route get 8.8.8.8 mark 1 # 指定标记查找
# 路由表分析
ip route show table all # 所有路由表
ip route show cache # 路由缓存
ip -s route show # 路由统计
常见路由问题诊断
路由黑洞问题
# 检查路由黑洞
ip route show | grep blackhole
ip route show | grep prohibit
ip route show | grep unreachable
# 诊断不可达网络
ping -c 3 target_ip
traceroute target_ip
ip route get target_ip
# 修复黑洞路由
ip route del blackhole problematic_network
ip route add problematic_network via correct_gateway
路由循环问题
# 检查路由循环
traceroute target_ip | grep -E "(\*|\!)"
mtr -r -c 10 target_ip | grep "Loss%"
# 分析路由表一致性
ip route show | sort
ip route show table all | grep target_network
# 修复路由循环
ip route flush cache
ip route del problematic_route
ip route add correct_route
策略路由问题
# 调试策略路由
ip rule show # 检查规则
ip route show table table_name # 检查表内容
ip route get target from source # 测试路由选择
# 策略路由调试
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
dmesg | grep "martian" # 查看异常路由
# 修复策略路由
ip rule del problematic_rule
ip rule add correct_rule
ip route flush table table_name
路由监控与维护
路由状态监控脚本
#!/bin/bash
# 路由监控脚本
LOG_FILE="/var/log/route_monitor.log"
CRITICAL_ROUTES=("8.8.8.8" "1.1.1.1" "internal_server")
log_message() {
echo "$(date): $1" >> $LOG_FILE
}
check_route() {
local target=$1
local route_info=$(ip route get $target 2>/dev/null)
if [ $? -eq 0 ]; then
log_message "Route to $target: OK - $route_info"
return 0
else
log_message "Route to $target: FAILED"
return 1
fi
}
# 检查关键路由
for route in "${CRITICAL_ROUTES[@]}"; do
if ! check_route $route; then
# 发送告警
echo "Route to $route failed" | mail -s "Route Alert" admin@company.com
fi
done
# 检查路由表大小
route_count=$(ip route show | wc -l)
if [ $route_count -gt 10000 ]; then
log_message "WARNING: Route table size is $route_count"
fi
自动路由优化脚本
#!/bin/bash
# 路由自动优化脚本
optimize_routes() {
# 清理过期路由缓存
ip route flush cache
# 检查并删除重复路由
ip route show | sort | uniq -d | while read route; do
echo "Found duplicate route: $route"
# 可以添加删除逻辑
done
# 优化路由表结构
# 将相邻网段合并为聚合路由
# 这里需要根据具体网络拓扑实现
}
# 定期执行优化
while true; do
optimize_routes
sleep 3600 # 每小时执行一次
done
第5章:防火墙与网络安全深度解析
5.1 iptables架构与原理
iptables核心架构
Netfilter框架
用户空间
├── iptables (IPv4)
├── ip6tables (IPv6)
├── arptables (ARP)
└── ebtables (以太网桥)
内核空间 (Netfilter)
├── 钩子点 (Hook Points)
│ ├── NF_INET_PRE_ROUTING
│ ├── NF_INET_LOCAL_IN
│ ├── NF_INET_FORWARD
│ ├── NF_INET_LOCAL_OUT
│ └── NF_INET_POST_ROUTING
├── 表管理 (Table Management)
├── 链管理 (Chain Management)
└── 规则匹配引擎 (Rule Matching Engine)
数据包处理流程
网络接口 → PREROUTING → 路由决策 → FORWARD → POSTROUTING → 网络接口
↓ ↑
LOCAL_IN LOCAL_OUT
↓ ↑
本地进程 ←→ 本地进程 ←→ 本地进程
表与链详细解析
表的优先级与功能
# 表的处理顺序(优先级从高到低)
# 1. raw表 - 连接跟踪豁免
# 2. mangle表 - 数据包修改
# 3. nat表 - 网络地址转换
# 4. filter表 - 数据包过滤
# 5. security表 - SELinux相关
# 查看所有表
iptables -t raw -L
iptables -t mangle -L
iptables -t nat -L
iptables -t filter -L
iptables -t security -L
链与表的关系矩阵
| 链/表 | raw | mangle | nat | filter | security |
|---|---|---|---|---|---|
| PREROUTING | ✓ | ✓ | ✓ | ✗ | ✗ |
| INPUT | ✗ | ✓ | ✓ | ✓ | ✓ |
| FORWARD | ✗ | ✓ | ✗ | ✓ | ✓ |
| OUTPUT | ✓ | ✓ | ✓ | ✓ | ✓ |
| POSTROUTING | ✗ | ✓ | ✓ | ✗ | ✗ |
规则匹配机制
匹配条件类型
# 基本匹配条件
-s, --source # 源地址
-d, --destination # 目标地址
-p, --protocol # 协议类型
-i, --in-interface # 入接口
-o, --out-interface # 出接口
# 扩展匹配模块
-m state # 连接状态匹配
-m multiport # 多端口匹配
-m limit # 速率限制
-m recent # 最近访问记录
-m string # 字符串匹配
-m time # 时间匹配
-m owner # 进程所有者匹配
-m conntrack # 连接跟踪匹配
动作类型详解
# 基本动作
ACCEPT # 接受数据包
DROP # 丢弃数据包(静默)
REJECT # 拒绝数据包(返回错误)
RETURN # 返回调用链
# NAT动作
SNAT # 源地址转换
DNAT # 目标地址转换
MASQUERADE # 动态源地址转换
REDIRECT # 重定向到本地端口
# 标记动作
MARK # 标记数据包
CONNMARK # 标记连接
DSCP # 设置DSCP字段
TOS # 设置TOS字段
# 日志动作
LOG # 记录日志
ULOG # 用户空间日志
NFLOG # Netfilter日志
5.2 iptables高级配置与应用
连接状态跟踪
连接状态类型
# 连接状态详解
NEW # 新连接的第一个数据包
ESTABLISHED # 已建立连接的数据包
RELATED # 与已知连接相关的新连接
INVALID # 无法识别或有错误的数据包
UNTRACKED # 未被跟踪的数据包
# 基于状态的防火墙规则
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
连接跟踪优化
# 连接跟踪表大小调优
echo 65536 > /proc/sys/net/netfilter/nf_conntrack_max
echo 16384 > /proc/sys/net/netfilter/nf_conntrack_buckets
# 连接超时设置
echo 300 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
echo 60 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_fin_wait
echo 30 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_time_wait
# 禁用特定协议的连接跟踪
echo 0 > /proc/sys/net/netfilter/nf_conntrack_helper
高级匹配模块应用
速率限制与DDoS防护
# 基本速率限制
iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/min --limit-burst 3 -j ACCEPT
# 防止SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# 防止端口扫描
iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A INPUT -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT -m recent --name portscan --set -j DROP
# 防止暴力破解
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --update --seconds 60 --hitcount 4 -j DROP
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --set -j ACCEPT
时间和用户控制
# 基于时间的访问控制
iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
# 基于用户的流量控制
iptables -A OUTPUT -m owner --uid-owner 1000 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner users -p tcp --dport 443 -j ACCEPT
# 基于进程的控制
iptables -A OUTPUT -m owner --cmd-owner firefox -j ACCEPT
字符串匹配与内容过滤
# HTTP内容过滤
iptables -A FORWARD -p tcp --dport 80 -m string --string "malware" --algo bm -j DROP
iptables -A FORWARD -p tcp --dport 80 -m string --string "GET /admin" --algo kmp -j LOG
# 协议特定过滤
iptables -A INPUT -p tcp --dport 21 -m string --string "USER anonymous" --algo bm -j DROP
NAT高级配置
源地址转换(SNAT)
# 基本SNAT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1
# 多IP负载均衡SNAT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1-203.0.113.10
# 动态SNAT(MASQUERADE)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
# 基于端口的SNAT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -p tcp -j SNAT --to-source 203.0.113.1:1024-65535
目标地址转换(DNAT)
# 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.1.100:8443
# 负载均衡DNAT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100-192.168.1.103
# 基于源地址的DNAT
iptables -t nat -A PREROUTING -s 10.0.0.0/8 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100
iptables -t nat -A PREROUTING -s 172.16.0.0/12 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.101
透明代理配置
# HTTP透明代理
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A OUTPUT -p tcp --dport 80 -m owner ! --uid-owner proxy -j REDIRECT --to-port 3128
# DNS透明代理
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 5353
5.3 iptables性能优化
规则优化策略
规则顺序优化
# 错误示例:低效的规则顺序
iptables -A INPUT -j LOG --log-prefix "Default: "
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 正确示例:高效的规则顺序
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 最常用的规则放前面
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -j LOG --log-prefix "Default: " # 日志规则放后面
规则合并与优化
# 使用multiport模块合并规则
# 替换多个单端口规则
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
# 使用单个multiport规则
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
# 使用iprange模块优化IP范围
iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
自定义链优化
# 创建自定义链减少规则匹配次数
iptables -N WEB_RULES
iptables -N SSH_RULES
# 在自定义链中添加具体规则
iptables -A WEB_RULES -p tcp --dport 80 -j ACCEPT
iptables -A WEB_RULES -p tcp --dport 443 -j ACCEPT
iptables -A WEB_RULES -j RETURN
iptables -A SSH_RULES -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A SSH_RULES -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
iptables -A SSH_RULES -p tcp --dport 22 -j ACCEPT
iptables -A SSH_RULES -j RETURN
# 在主链中跳转到自定义链
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j WEB_RULES
iptables -A INPUT -p tcp --dport 22 -j SSH_RULES
内核参数调优
Netfilter性能参数
# 连接跟踪优化
echo 262144 > /proc/sys/net/netfilter/nf_conntrack_max
echo 32768 > /proc/sys/net/netfilter/nf_conntrack_buckets
echo 1 > /proc/sys/net/netfilter/nf_conntrack_tcp_loose
# 哈希表大小优化
echo 65536 > /proc/sys/net/core/netdev_max_backlog
echo 32768 > /proc/sys/net/core/netdev_budget
# 内存使用优化
echo 134217728 > /proc/sys/net/core/rmem_max
echo 134217728 > /proc/sys/net/core/wmem_max
规则集优化脚本
#!/bin/bash
# iptables性能优化脚本
optimize_iptables() {
# 1. 清空现有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# 2. 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 3. 允许回环接口
iptables -A INPUT -i lo -j ACCEPT
# 4. 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 5. 创建优化的自定义链
create_optimized_chains
# 6. 应用主要规则
apply_main_rules
}
create_optimized_chains() {
# 创建服务特定的链
iptables -N SERVICES
iptables -N SECURITY
iptables -N LOGGING
# 服务规则
iptables -A SERVICES -p tcp -m multiport --dports 22,80,443 -j ACCEPT
iptables -A SERVICES -p udp --dport 53 -j ACCEPT
iptables -A SERVICES -j RETURN
# 安全规则
iptables -A SECURITY -m recent --name blacklist --rcheck --seconds 3600 -j DROP
iptables -A SECURITY -m limit --limit 10/min -j RETURN
iptables -A SECURITY -m recent --name blacklist --set -j DROP
# 日志规则
iptables -A LOGGING -m limit --limit 5/min -j LOG --log-prefix "DROPPED: "
iptables -A LOGGING -j DROP
}
apply_main_rules() {
# 应用优化后的规则
iptables -A INPUT -j SECURITY
iptables -A INPUT -j SERVICES
iptables -A INPUT -j LOGGING
}
# 执行优化
optimize_iptables
5.4 网络安全最佳实践
防火墙安全策略
默认拒绝策略
# 实施最小权限原则
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP # 可选,更严格的安全策略
# 明确允许必要的服务
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
网络分段与隔离
# DMZ区域配置
iptables -A FORWARD -i eth0 -o dmz0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i dmz0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i dmz0 -o lan0 -j DROP # DMZ不能访问内网
# 内网访问控制
iptables -A FORWARD -i lan0 -o dmz0 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i lan0 -o dmz0 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i lan0 -o dmz0 -j DROP
入侵检测与防护
# 端口扫描检测
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
# 防止IP欺骗
iptables -A INPUT -s 127.0.0.0/8 ! -i lo -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 224.0.0.0/4 -j DROP
# 防止广播攻击
iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP
iptables -A INPUT -m pkttype --pkt-type multicast -j DROP
高级安全功能
地理位置过滤
# 使用geoip模块(需要安装xtables-addons)
iptables -A INPUT -m geoip --src-cc CN,US,JP -j ACCEPT
iptables -A INPUT -m geoip ! --src-cc CN -j DROP
# 使用ipset进行地理位置过滤
ipset create china hash:net
ipset add china 1.0.1.0/24
ipset add china 1.0.2.0/23
# ... 添加更多中国IP段
iptables -A INPUT -m set --match-set china src -j ACCEPT
应用层防护
# HTTP请求方法限制
iptables -A INPUT -p tcp --dport 80 -m string --string "GET" --algo bm -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m string --string "POST" --algo bm -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m string --string "HEAD" --algo bm -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
# SQL注入防护
iptables -A INPUT -p tcp --dport 80 -m string --string "union select" --algo bm -j DROP
iptables -A INPUT -p tcp --dport 80 -m string --string "drop table" --algo bm -j DROP
iptables -A INPUT -p tcp --dport 80 -m string --string "insert into" --algo bm -j DROP
流量整形与QoS
# 使用mangle表进行流量标记
iptables -t mangle -A OUTPUT -p tcp --dport 22 -j DSCP --set-dscp 46 # SSH高优先级
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j DSCP --set-dscp 0 # HTTP普通优先级
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j DSCP --set-dscp 10 # SMTP低优先级
# 结合tc进行流量控制
tc qdisc add dev eth0 root handle 1: htb default 30
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 50mbit ceil 80mbit # 高优先级
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 30mbit ceil 60mbit # 普通优先级
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 20mbit ceil 40mbit # 低优先级
# 基于DSCP分类
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dscp 46 0xff flowid 1:10
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip dscp 0 0xff flowid 1:20
tc filter add dev eth0 parent 1: protocol ip prio 3 u32 match ip dscp 10 0xff flowid 1:30
5.5 nftables:下一代防火墙
nftables架构优势
nftables vs iptables
| 特性 | iptables | nftables |
|---|---|---|
| 语法 | 复杂,多个命令 | 统一,类似编程语言 |
| 性能 | 线性查找 | 优化的数据结构 |
| 原子操作 | 不支持 | 支持 |
| 脚本化 | 困难 | 容易 |
| IPv4/IPv6 | 分离的工具 | 统一处理 |
nftables基本概念
# nftables层次结构
表 (Table)
├── 链 (Chain)
│ ├── 规则 (Rule)
│ │ ├── 匹配条件 (Match)
│ │ └── 动作 (Action)
│ └── 规则 (Rule)
└── 链 (Chain)
nftables基本配置
表和链管理
# 创建表
nft add table inet firewall
nft add table ip nat_table
# 创建链
nft add chain inet firewall input { type filter hook input priority 0 \; policy drop \; }
nft add chain inet firewall forward { type filter hook forward priority 0 \; policy drop \; }
nft add chain inet firewall output { type filter hook output priority 0 \; policy accept \; }
# 查看配置
nft list tables
nft list table inet firewall
规则配置示例
# 基本过滤规则
nft add rule inet firewall input iif lo accept
nft add rule inet firewall input ct state established,related accept
nft add rule inet firewall input tcp dport 22 accept
nft add rule inet firewall input tcp dport { 80, 443 } accept
# NAT规则
nft add table ip nat
nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule ip nat postrouting oif eth0 masquerade
# 端口转发
nft add chain ip nat prerouting { type nat hook prerouting priority -100 \; }
nft add rule ip nat prerouting tcp dport 80 dnat to 192.168.1.100:8080
高级nftables功能
# 集合和映射
nft add set inet firewall allowed_ips { type ipv4_addr \; flags interval \; }
nft add element inet firewall allowed_ips { 192.168.1.0/24, 10.0.0.0/8 }
nft add rule inet firewall input ip saddr @allowed_ips accept
# 映射表
nft add map inet firewall port_redirect { type inet_service : ipv4_addr . inet_service \; }
nft add element inet firewall port_redirect { 80 : 192.168.1.100 . 8080, 443 : 192.168.1.100 . 8443 }
nft add rule ip nat prerouting tcp dport map @port_redirect
# 计数器和配额
nft add rule inet firewall input tcp dport 22 counter accept
nft add rule inet firewall input quota 1 gbytes drop
5.6 网络安全监控与日志
日志配置与分析
iptables日志配置
# 详细日志配置
iptables -A INPUT -j LOG --log-level 4 --log-prefix "INPUT-DROP: " --log-tcp-options --log-ip-options
# 分类日志记录
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "SSH-NEW: "
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP: "
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "GENERAL: "
# 使用ULOG进行高性能日志
iptables -A INPUT -j ULOG --ulog-nlgroup 1 --ulog-prefix "FIREWALL: "
日志分析脚本
#!/bin/bash
# 防火墙日志分析脚本
LOG_FILE="/var/log/messages"
REPORT_FILE="/var/log/firewall_report.txt"
analyze_firewall_logs() {
echo "=== 防火墙日志分析报告 ===" > $REPORT_FILE
echo "生成时间: $(date)" >> $REPORT_FILE
echo "" >> $REPORT_FILE
# 统计被阻止的IP
echo "=== 被阻止最多的IP地址 ===" >> $REPORT_FILE
grep "INPUT-DROP" $LOG_FILE | \
grep -oE "SRC=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | \
cut -d= -f2 | sort | uniq -c | sort -nr | head -20 >> $REPORT_FILE
# 统计攻击类型
echo "" >> $REPORT_FILE
echo "=== 攻击类型统计 ===" >> $REPORT_FILE
grep "INPUT-DROP" $LOG_FILE | \
grep -oE "DPT=[0-9]+" | cut -d= -f2 | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE
# 统计SSH登录尝试
echo "" >> $REPORT_FILE
echo "=== SSH登录尝试统计 ===" >> $REPORT_FILE
grep "SSH-NEW" $LOG_FILE | wc -l >> $REPORT_FILE
# 地理位置分析(需要geoip数据库)
echo "" >> $REPORT_FILE
echo "=== 攻击来源地理分析 ===" >> $REPORT_FILE
grep "INPUT-DROP" $LOG_FILE | \
grep -oE "SRC=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | \
cut -d= -f2 | sort -u | while read ip; do
country=$(geoiplookup $ip | cut -d: -f2)
echo "$ip: $country"
done | sort | uniq -c | sort -nr >> $REPORT_FILE
}
# 执行分析
analyze_firewall_logs
# 发送报告
mail -s "防火墙日志分析报告" admin@company.com < $REPORT_FILE
实时监控系统
实时攻击检测
#!/bin/bash
# 实时攻击检测脚本
THRESHOLD=10
TIME_WINDOW=60
BLOCK_TIME=3600
monitor_attacks() {
tail -f /var/log/messages | grep --line-buffered "INPUT-DROP" | while read line; do
# 提取源IP
src_ip=$(echo $line | grep -oE "SRC=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | cut -d= -f2)
if [ ! -z "$src_ip" ]; then
# 检查最近时间窗口内的攻击次数
attack_count=$(grep "INPUT-DROP.*SRC=$src_ip" /var/log/messages | \
awk -v window=$TIME_WINDOW 'BEGIN{now=systime()}
{if(systime()-now < window) count++} END{print count+0}')
if [ $attack_count -gt $THRESHOLD ]; then
# 自动封禁IP
iptables -I INPUT -s $src_ip -j DROP
echo "$(date): Blocked $src_ip (attacks: $attack_count)" >> /var/log/auto_block.log
# 设置定时解封
echo "iptables -D INPUT -s $src_ip -j DROP" | at now + ${BLOCK_TIME} seconds
# 发送告警
echo "IP $src_ip has been automatically blocked due to $attack_count attacks" | \
mail -s "Security Alert: IP Blocked" admin@company.com
fi
fi
done
}
# 启动监控
monitor_attacks &
网络流量监控
#!/bin/bash
# 网络流量异常检测
INTERFACE="eth0"
THRESHOLD_MBPS=100
CHECK_INTERVAL=30
monitor_traffic() {
while true; do
# 获取当前流量统计
rx_bytes_before=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
tx_bytes_before=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
sleep $CHECK_INTERVAL
rx_bytes_after=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
tx_bytes_after=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
# 计算速率
rx_rate=$(( (rx_bytes_after - rx_bytes_before) * 8 / CHECK_INTERVAL / 1024 / 1024 ))
tx_rate=$(( (tx_bytes_after - tx_bytes_before) * 8 / CHECK_INTERVAL / 1024 / 1024 ))
echo "$(date): RX: ${rx_rate}Mbps, TX: ${tx_rate}Mbps"
# 检查是否超过阈值
if [ $rx_rate -gt $THRESHOLD_MBPS ] || [ $tx_rate -gt $THRESHOLD_MBPS ]; then
echo "$(date): Traffic anomaly detected - RX: ${rx_rate}Mbps, TX: ${tx_rate}Mbps" | \
mail -s "Traffic Alert" admin@company.com
# 可以触发额外的安全措施
trigger_security_measures
fi
done
}
trigger_security_measures() {
# 启用更严格的速率限制
iptables -I INPUT -m limit --limit 10/sec --limit-burst 20 -j ACCEPT
iptables -I INPUT -j DROP
# 记录当前连接状态
ss -tuln > /var/log/connections_during_attack_$(date +%Y%m%d_%H%M%S).log
# 30分钟后恢复正常规则
echo "iptables -D INPUT -m limit --limit 10/sec --limit-burst 20 -j ACCEPT; iptables -D INPUT -j DROP" | \
at now + 30 minutes
}
# 启动监控
monitor_traffic
5.7 iptables与策略路由深度集成
高级标记与路由策略
多维度流量分类
# 基于应用的流量标记
iptables -t mangle -A OUTPUT -m owner --cmd-owner firefox -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --cmd-owner chrome -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -m owner --cmd-owner ssh -j MARK --set-mark 3
# 基于目标的流量标记
iptables -t mangle -A OUTPUT -d 8.8.8.8 -j MARK --set-mark 10 # DNS流量
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 11 # HTTP流量
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 12 # HTTPS流量
# 基于用户的流量标记
iptables -t mangle -A OUTPUT -m owner --uid-owner 1000 -j MARK --set-mark 20
iptables -t mangle -A OUTPUT -m owner --gid-owner developers -j MARK --set-mark 21
# 创建对应的策略路由
ip rule add fwmark 1 table browser_table priority 100
ip rule add fwmark 10 table dns_table priority 200
ip rule add fwmark 20 table user_table priority 300
动态路由策略
#!/bin/bash
# 动态路由策略脚本
update_routing_policy() {
local time_of_day=$(date +%H)
# 工作时间(9-18点)使用高速链路
if [ $time_of_day -ge 9 ] && [ $time_of_day -le 18 ]; then
# 标记工作流量使用高速链路
iptables -t mangle -F WORK_HOURS 2>/dev/null || iptables -t mangle -N WORK_HOURS
iptables -t mangle -A WORK_HOURS -p tcp --dport 80 -j MARK --set-mark 100
iptables -t mangle -A WORK_HOURS -p tcp --dport 443 -j MARK --set-mark 100
iptables -t mangle -A WORK_HOURS -j RETURN
# 应用工作时间规则
iptables -t mangle -I OUTPUT -j WORK_HOURS
# 配置高速路由表
ip route replace default via 10.0.1.1 table high_speed
ip rule add fwmark 100 table high_speed priority 50
else
# 非工作时间使用普通链路
iptables -t mangle -F WORK_HOURS 2>/dev/null
ip rule del fwmark 100 table high_speed 2>/dev/null
fi
}
# 每小时检查一次
while true; do
update_routing_policy
sleep 3600
done
负载均衡与故障切换
#!/bin/bash
# 智能负载均衡脚本
WAN1_GW="10.0.1.1"
WAN2_GW="10.0.2.1"
WAN1_WEIGHT=2
WAN2_WEIGHT=1
setup_load_balancing() {
# 清除现有标记规则
iptables -t mangle -F OUTPUT
# 基于连接哈希进行负载均衡
iptables -t mangle -A OUTPUT -m statistic --mode nth --every 3 --packet 0 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m statistic --mode nth --every 3 --packet 1 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -j MARK --set-mark 1 # 默认使用WAN1
# 配置路由表
ip route replace default via $WAN1_GW table wan1
ip route replace default via $WAN2_GW table wan2
# 配置策略路由
ip rule add fwmark 1 table wan1 priority 100
ip rule add fwmark 2 table wan2 priority 101
# 主路由表负载均衡
ip route replace default \
nexthop via $WAN1_GW weight $WAN1_WEIGHT \
nexthop via $WAN2_GW weight $WAN2_WEIGHT
}
check_wan_status() {
local gateway=$1
local mark=$2
local table=$3
if ping -c 3 -W 2 $gateway > /dev/null 2>&1; then
echo "WAN $gateway is UP"
return 0
else
echo "WAN $gateway is DOWN"
# 移除故障链路的标记规则
iptables -t mangle -D OUTPUT -j MARK --set-mark $mark 2>/dev/null
ip rule del fwmark $mark table $table 2>/dev/null
return 1
fi
}
# 监控和故障切换
monitor_wan_links() {
while true; do
wan1_status=$(check_wan_status $WAN1_GW 1 wan1)
wan2_status=$(check_wan_status $WAN2_GW 2 wan2)
# 根据链路状态调整路由
if [ $? -eq 0 ]; then
setup_load_balancing
fi
sleep 30
done
}
# 启动监控
setup_load_balancing
monitor_wan_links &
第6章:技术关系与协作方式深度解析
6.1 Linux网络架构层次关系
完整的网络技术栈
┌─────────────────────────────────────────────────────────────┐
│ 应用层 (Application Layer) │
├─────────────────────────────────────────────────────────────┤
│ 用户空间配置工具 (User Space Tools) │
│ ┌─────────────┬─────────────┬─────────────┬─────────────┐ │
│ │ ifconfig │ ip命令族 │ ethtool │ iptables │ │
│ │ (传统工具) │ (现代工具) │ (硬件工具) │ (防火墙) │ │
│ └─────────────┴─────────────┴─────────────┴─────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 内核空间 (Kernel Space) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Netfilter框架 (防火墙/NAT) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ 路由子系统 (Routing Subsystem) │ │
│ │ ┌─────────────┬─────────────┬─────────────────────────┐ │ │
│ │ │ 路由表 │ 策略路由 │ FIB (转发信息库) │ │ │
│ │ │ (Route Table)│(Policy Route)│ (Forwarding Info Base) │ │ │
│ │ └─────────────┴─────────────┴─────────────────────────┘ │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ 网络设备子系统 (Network Device Subsystem) │ │
│ │ ┌─────────────┬─────────────┬─────────────────────────┐ │ │
│ │ │ 物理网卡 │ 虚拟网卡 │ 网络命名空间 │ │ │
│ │ │ (Physical NIC)│(Virtual NIC) │ (Network Namespace) │ │ │
│ │ └─────────────┴─────────────┴─────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 硬件层 (Hardware Layer) │
│ ┌─────────────┬─────────────┬─────────────┬─────────────┐ │
│ │ 以太网卡 │ 无线网卡 │ 光纤网卡 │ 虚拟化硬件 │ │
│ │ (Ethernet) │ (Wireless) │ (Fiber) │ (Virtualized)│ │
│ └─────────────┴─────────────┴─────────────┴─────────────┘ │
└─────────────────────────────────────────────────────────────┘
技术组件相互依赖关系
配置工具层
├── ifconfig ──────────────┐
│ ├── 依赖: /proc/net/* │
│ └── 功能: 基础接口配置 │
├── ip命令族 ───────────────┤──→ 内核网络子系统
│ ├── ip link ──→ 网络设备 │
│ ├── ip addr ──→ 地址管理 │
│ ├── ip route ─→ 路由管理 │
│ └── ip rule ──→ 策略路由 │
├── ethtool ──────────────┤
│ └── 功能: 硬件参数调优 │
└── iptables ─────────────┘
└── 功能: 包过滤/NAT
内核子系统层
├── Netfilter ────────────┐
│ ├── 钩子点管理 │
│ ├── 连接跟踪 │
│ └── NAT处理 │
├── 路由子系统 ────────────┤──→ 数据包转发决策
│ ├── 路由表查找 │
│ ├── 策略路由匹配 │
│ └── 负载均衡 │
└── 网络设备子系统 ────────┘
├── 设备注册/注销
├── 数据包收发
└── 队列管理
6.2 数据包完整生命周期
出站数据包处理流程
应用程序 socket.send()
↓
系统调用接口 (syscall)
↓
内核协议栈 (TCP/UDP)
↓
IP层处理 (添加IP头)
↓
┌────────────────────────────────────┐
│ 策略路由决策 (ip rule) │
│ ┌──────────────────────────────┐ │
│ │ 1. 检查源地址 │ │
│ │ 2. 检查目标地址 │ │
│ │ 3. 检查服务类型 (TOS) │ │
│ │ 4. 检查输入接口 │ │
│ │ 5. 选择路由表 │ │
│ └──────────────────────────────┘ │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ 路由表查找 (ip route) │
│ ┌──────────────────────────────┐ │
│ │ 1. 最长前缀匹配 │ │
│ │ 2. 确定下一跳网关 │ │
│ │ 3. 确定出接口 │ │
│ │ 4. 检查路由度量值 │ │
│ └──────────────────────────────┘ │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ Netfilter OUTPUT链处理 │
│ ┌──────────────────────────────┐ │
│ │ 1. mangle表 (包修改) │ │
│ │ 2. nat表 (SNAT/MASQUERADE) │ │
│ │ 3. filter表 (包过滤) │ │
│ │ 4. 标记处理 (MARK) │ │
│ └──────────────────────────────┘ │
└────────────────────────────────────┘
↓
二次路由查找 (如果包被修改)
↓
┌────────────────────────────────────┐
│ Netfilter POSTROUTING链 │
│ ┌──────────────────────────────┐ │
│ │ 1. mangle表处理 │ │
│ │ 2. nat表处理 (SNAT) │ │
│ │ 3. 连接跟踪更新 │ │
│ └──────────────────────────────┘ │
└────────────────────────────────────┘
↓
网络设备队列 (qdisc)
↓
设备驱动程序
↓
物理网络接口
入站数据包处理流程
物理网络接口
↓
设备驱动程序 (中断处理)
↓
网络设备队列 (NAPI)
↓
┌────────────────────────────────────┐
│ Netfilter PREROUTING链 │
│ ┌──────────────────────────────┐ │
│ │ 1. raw表 (连接跟踪豁免) │ │
│ │ 2. mangle表 (包修改) │ │
│ │ 3. nat表 (DNAT/REDIRECT) │ │
│ │ 4. 连接跟踪处理 │ │
│ └──────────────────────────────┘ │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ 路由决策 (本地 vs 转发) │
│ ┌──────────────────────────────┐ │
│ │ 目标IP是本机? ──→ 本地处理 │ │
│ │ ↓ 否 │ │
│ │ 转发处理 ──→ FORWARD链 │ │
│ └──────────────────────────────┘ │
└────────────────────────────────────┘
↓
┌─────────┬─────────┐
│ 本地处理 │ 转发处理 │
↓ ↓
┌─────────┐ ┌─────────┐
│INPUT链 │ │FORWARD链 │
│处理 │ │处理 │
└─────────┘ └─────────┘
↓ ↓
应用程序 POSTROUTING链
6.3 技术组件协作机制
网络接口生命周期管理
#!/bin/bash
# 网络接口完整生命周期管理脚本
interface_lifecycle_demo() {
local interface="demo0"
local vlan_id="100"
local ip_addr="192.168.100.1/24"
local gateway="192.168.100.254"
echo "=== 网络接口生命周期演示 ==="
# 阶段1: 接口创建
echo "1. 创建VLAN接口..."
ip link add link eth0 name ${interface} type vlan id ${vlan_id}
echo " 状态: $(ip link show ${interface} | grep -o 'state [A-Z]*')"
# 阶段2: 地址配置
echo "2. 配置IP地址..."
ip addr add ${ip_addr} dev ${interface}
echo " 地址: $(ip addr show ${interface} | grep 'inet ' | awk '{print $2}')"
# 阶段3: 接口激活
echo "3. 激活接口..."
ip link set ${interface} up
echo " 状态: $(ip link show ${interface} | grep -o 'state [A-Z]*')"
# 阶段4: 路由配置
echo "4. 配置路由..."
ip route add 192.168.200.0/24 via ${gateway} dev ${interface}
echo " 路由: $(ip route show | grep ${interface})"
# 阶段5: 防火墙规则
echo "5. 配置防火墙规则..."
iptables -A INPUT -i ${interface} -j ACCEPT
iptables -A OUTPUT -o ${interface} -j ACCEPT
# 阶段6: 连通性测试
echo "6. 测试连通性..."
if ping -c 1 -W 2 ${gateway} >/dev/null 2>&1; then
echo " 连通性: 正常"
else
echo " 连通性: 异常"
fi
# 阶段7: 监控和维护
echo "7. 接口统计信息..."
echo " RX: $(cat /sys/class/net/${interface}/statistics/rx_bytes) bytes"
echo " TX: $(cat /sys/class/net/${interface}/statistics/tx_bytes) bytes"
echo " 错误: $(cat /sys/class/net/${interface}/statistics/rx_errors) RX errors"
# 阶段8: 清理资源
echo "8. 清理资源..."
iptables -D INPUT -i ${interface} -j ACCEPT 2>/dev/null
iptables -D OUTPUT -o ${interface} -j ACCEPT 2>/dev/null
ip route del 192.168.200.0/24 via ${gateway} dev ${interface} 2>/dev/null
ip link set ${interface} down
ip link delete ${interface}
echo " 接口已删除"
}
# 执行演示
interface_lifecycle_demo
复杂网络场景协作示例
#!/bin/bash
# 企业级多VLAN网络环境配置
setup_enterprise_network() {
echo "=== 企业级网络环境配置 ==="
# 1. 基础网络规划
declare -A vlans=(
["management"]="10:192.168.10.0/24:192.168.10.254"
["users"]="20:192.168.20.0/24:192.168.20.254"
["servers"]="30:192.168.30.0/24:192.168.30.254"
["dmz"]="40:192.168.40.0/24:192.168.40.254"
)
# 2. 创建VLAN接口
echo "创建VLAN接口..."
for vlan_name in "${!vlans[@]}"; do
IFS=':' read -r vlan_id network gateway <<< "${vlans[$vlan_name]}"
interface="eth0.${vlan_id}"
# 创建VLAN接口
ip link add link eth0 name ${interface} type vlan id ${vlan_id}
# 配置IP地址(网关地址)
ip_addr="${network%.*}.1/${network##*/}"
ip addr add ${ip_addr} dev ${interface}
# 启用接口
ip link set ${interface} up
echo " ${vlan_name}: ${interface} (${ip_addr})"
done
# 3. 配置策略路由
echo "配置策略路由..."
table_id=100
for vlan_name in "${!vlans[@]}"; do
IFS=':' read -r vlan_id network gateway <<< "${vlans[$vlan_name]}"
# 为每个VLAN创建独立路由表
ip rule add from ${network} table ${table_id} priority ${table_id}
ip route add ${network} dev eth0.${vlan_id} table ${table_id}
ip route add default via ${gateway} table ${table_id}
echo " ${vlan_name}: table ${table_id}"
((table_id++))
done
# 4. 配置防火墙策略
echo "配置防火墙策略..."
# 基本策略:默认拒绝
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# 管理VLAN规则
iptables -A INPUT -i eth0.10 -j ACCEPT
iptables -A FORWARD -i eth0.10 -j ACCEPT
# 用户VLAN规则
iptables -A INPUT -i eth0.20 -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0.20 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i eth0.20 -o eth0.30 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0.20 -o eth0.30 -p tcp --dport 443 -j ACCEPT
# 服务器VLAN规则
iptables -A INPUT -i eth0.30 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -i eth0.30 -o eth0.40 -j ACCEPT
# DMZ规则
iptables -A INPUT -i eth0.40 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0.40 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth0.40 -o eth0.20 -j DROP # DMZ不能访问内网
# 5. 配置QoS流量控制
echo "配置QoS流量控制..."
# 为每个VLAN配置不同的带宽限制
tc qdisc add dev eth0 root handle 1: htb default 999
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000mbit
# 管理流量 - 高优先级
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 100mbit ceil 200mbit prio 1
tc filter add dev eth0 parent 1: protocol 802.1q prio 1 u32 match u16 0x000a 0xffff at -4 flowid 1:10
# 用户流量 - 普通优先级
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 500mbit ceil 800mbit prio 2
tc filter add dev eth0 parent 1: protocol 802.1q prio 2 u32 match u16 0x0014 0xffff at -4 flowid 1:20
# 服务器流量 - 高优先级
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 300mbit ceil 600mbit prio 1
tc filter add dev eth0 parent 1: protocol 802.1q prio 1 u32 match u16 0x001e 0xffff at -4 flowid 1:30
# DMZ流量 - 限制优先级
tc class add dev eth0 parent 1:1 classid 1:40 htb rate 100mbit ceil 200mbit prio 3
tc filter add dev eth0 parent 1: protocol 802.1q prio 3 u32 match u16 0x0028 0xffff at -4 flowid 1:40
echo "企业级网络环境配置完成!"
}
# 网络状态检查函数
check_network_status() {
echo "=== 网络状态检查 ==="
echo "1. 接口状态:"
ip link show | grep -E "(eth0\.|state)"
echo -e "\n2. IP地址配置:"
ip addr show | grep -E "(eth0\.|inet )"
echo -e "\n3. 路由表:"
ip route show table all | grep -v "local"
echo -e "\n4. 策略路由:"
ip rule show
echo -e "\n5. 防火墙规则统计:"
iptables -L -n -v | head -20
echo -e "\n6. QoS配置:"
tc qdisc show dev eth0
tc class show dev eth0
}
# 执行配置
setup_enterprise_network
check_network_status
6.4 故障排查系统化方法论
网络问题诊断决策树
网络连通性问题
├── 物理层检查
│ ├── 网线连接 ──→ ethtool eth0
│ ├── 端口状态 ──→ ip link show
│ └── 硬件错误 ──→ dmesg | grep eth
├── 数据链路层检查
│ ├── 接口状态 ──→ ip link show
│ ├── MAC地址 ──→ ip link show
│ └── VLAN配置 ──→ cat /proc/net/vlan/config
├── 网络层检查
│ ├── IP配置 ──→ ip addr show
│ ├── 路由表 ──→ ip route show
│ ├── 策略路由 ──→ ip rule show
│ └── ARP表 ──→ ip neigh show
├── 传输层检查
│ ├── 端口监听 ──→ ss -tuln
│ ├── 连接状态 ──→ ss -tuln
│ └── 防火墙规则 ──→ iptables -L -n -v
└── 应用层检查
├── 服务状态 ──→ systemctl status
├── 进程监听 ──→ lsof -i
└── 应用日志 ──→ journalctl -u service
自动化故障诊断脚本
#!/bin/bash
# 网络故障自动诊断脚本
network_diagnosis() {
local target_host="$1"
local target_port="$2"
local interface="$3"
echo "=== 网络故障诊断报告 ==="
echo "目标主机: ${target_host:-未指定}"
echo "目标端口: ${target_port:-未指定}"
echo "网络接口: ${interface:-自动检测}"
echo "诊断时间: $(date)"
echo "========================================"
# 1. 基础连通性测试
echo -e "\n【1. 基础连通性测试】"
if [ -n "$target_host" ]; then
echo "Ping测试:"
if ping -c 3 -W 2 "$target_host" >/dev/null 2>&1; then
echo " ✓ Ping成功 - 基础连通性正常"
ping_result="success"
else
echo " ✗ Ping失败 - 基础连通性异常"
ping_result="failed"
fi
if [ -n "$target_port" ]; then
echo "端口连通性测试:"
if timeout 5 bash -c "</dev/tcp/$target_host/$target_port" 2>/dev/null; then
echo " ✓ 端口 $target_port 可达"
port_result="success"
else
echo " ✗ 端口 $target_port 不可达"
port_result="failed"
fi
fi
fi
# 2. 网络接口检查
echo -e "\n【2. 网络接口状态检查】"
if [ -n "$interface" ]; then
interfaces=("$interface")
else
interfaces=($(ip link show | grep -E '^[0-9]+:' | grep -v lo | awk -F': ' '{print $2}' | cut -d'@' -f1))
fi
for iface in "${interfaces[@]}"; do
echo "接口 $iface:"
# 接口状态
state=$(ip link show "$iface" 2>/dev/null | grep -o 'state [A-Z]*' | cut -d' ' -f2)
if [ "$state" = "UP" ]; then
echo " ✓ 状态: $state"
else
echo " ✗ 状态: $state"
fi
# IP地址
ip_addr=$(ip addr show "$iface" 2>/dev/null | grep 'inet ' | awk '{print $2}' | head -1)
if [ -n "$ip_addr" ]; then
echo " ✓ IP地址: $ip_addr"
else
echo " ✗ 未配置IP地址"
fi
# 统计信息
if [ -f "/sys/class/net/$iface/statistics/rx_bytes" ]; then
rx_bytes=$(cat "/sys/class/net/$iface/statistics/rx_bytes")
tx_bytes=$(cat "/sys/class/net/$iface/statistics/tx_bytes")
rx_errors=$(cat "/sys/class/net/$iface/statistics/rx_errors")
tx_errors=$(cat "/sys/class/net/$iface/statistics/tx_errors")
echo " 📊 RX: $(numfmt --to=iec $rx_bytes)B, TX: $(numfmt --to=iec $tx_bytes)B"
if [ "$rx_errors" -gt 0 ] || [ "$tx_errors" -gt 0 ]; then
echo " ⚠️ 错误: RX=$rx_errors, TX=$tx_errors"
fi
fi
done
# 3. 路由检查
echo -e "\n【3. 路由配置检查】"
echo "默认路由:"
default_route=$(ip route show default 2>/dev/null)
if [ -n "$default_route" ]; then
echo " ✓ $default_route"
# 测试默认网关连通性
gateway=$(echo "$default_route" | awk '{print $3}')
if ping -c 1 -W 2 "$gateway" >/dev/null 2>&1; then
echo " ✓ 默认网关 $gateway 可达"
else
echo " ✗ 默认网关 $gateway 不可达"
fi
else
echo " ✗ 未配置默认路由"
fi
# 策略路由检查
echo "策略路由规则:"
rule_count=$(ip rule show | wc -l)
if [ "$rule_count" -gt 3 ]; then
echo " 📋 发现 $((rule_count-3)) 条自定义策略路由规则"
ip rule show | grep -v -E "(from all lookup|from all lookup local|from all lookup main)"
else
echo " ℹ️ 使用默认策略路由"
fi
# 4. DNS检查
echo -e "\n【4. DNS解析检查】"
if [ -f "/etc/resolv.conf" ]; then
dns_servers=$(grep nameserver /etc/resolv.conf | awk '{print $2}')
for dns in $dns_servers; do
if timeout 3 nslookup google.com "$dns" >/dev/null 2>&1; then
echo " ✓ DNS服务器 $dns 正常"
else
echo " ✗ DNS服务器 $dns 异常"
fi
done
fi
# 5. 防火墙检查
echo -e "\n【5. 防火墙规则检查】"
if command -v iptables >/dev/null 2>&1; then
# 检查默认策略
input_policy=$(iptables -L INPUT | head -1 | grep -o 'policy [A-Z]*' | cut -d' ' -f2)
forward_policy=$(iptables -L FORWARD | head -1 | grep -o 'policy [A-Z]*' | cut -d' ' -f2)
output_policy=$(iptables -L OUTPUT | head -1 | grep -o 'policy [A-Z]*' | cut -d' ' -f2)
echo " 默认策略: INPUT=$input_policy, FORWARD=$forward_policy, OUTPUT=$output_policy"
# 检查规则数量
input_rules=$(iptables -L INPUT --line-numbers | tail -n +3 | wc -l)
forward_rules=$(iptables -L FORWARD --line-numbers | tail -n +3 | wc -l)
output_rules=$(iptables -L OUTPUT --line-numbers | tail -n +3 | wc -l)
echo " 规则数量: INPUT=$input_rules, FORWARD=$forward_rules, OUTPUT=$output_rules"
# 如果有目标主机和端口,检查相关规则
if [ -n "$target_host" ] && [ -n "$target_port" ]; then
echo " 检查目标 $target_host:$target_port 相关规则:"
iptables -L -n | grep -E "($target_port|$target_host)" || echo " 未找到相关规则"
fi
fi
# 6. 系统资源检查
echo -e "\n【6. 系统资源检查】"
# 网络连接数
connection_count=$(ss -tuln | wc -l)
echo " 活跃连接数: $connection_count"
# 网络缓冲区
if [ -f "/proc/sys/net/core/rmem_max" ]; then
rmem_max=$(cat /proc/sys/net/core/rmem_max)
wmem_max=$(cat /proc/sys/net/core/wmem_max)
echo " 网络缓冲区: RX=$(numfmt --to=iec $rmem_max)B, TX=$(numfmt --to=iec $wmem_max)B"
fi
# 连接跟踪
if [ -f "/proc/sys/net/netfilter/nf_conntrack_count" ]; then
conntrack_count=$(cat /proc/sys/net/netfilter/nf_conntrack_count)
conntrack_max=$(cat /proc/sys/net/netfilter/nf_conntrack_max)
echo " 连接跟踪: $conntrack_count/$conntrack_max"
if [ "$conntrack_count" -gt $((conntrack_max * 80 / 100)) ]; then
echo " ⚠️ 连接跟踪表使用率过高 (>80%)"
fi
fi
# 7. 生成诊断建议
echo -e "\n【7. 诊断建议】"
if [ "$ping_result" = "failed" ]; then
echo " 🔧 Ping失败建议:"
echo " - 检查目标主机是否在线"
echo " - 检查路由配置: ip route get $target_host"
echo " - 检查防火墙规则: iptables -L -n | grep $target_host"
echo " - 检查ARP表: ip neigh show"
fi
if [ "$port_result" = "failed" ] && [ "$ping_result" = "success" ]; then
echo " 🔧 端口不可达建议:"
echo " - 检查目标服务是否运行: telnet $target_host $target_port"
echo " - 检查本地防火墙: iptables -L OUTPUT -n | grep $target_port"
echo " - 检查远程防火墙配置"
echo " - 使用tcpdump抓包分析: tcpdump -i any host $target_host and port $target_port"
fi
echo -e "\n========================================"
echo "诊断完成时间: $(date)"
}
# 使用示例
if [ $# -eq 0 ]; then
echo "用法: $0 <目标主机> [端口] [接口]"
echo "示例: $0 8.8.8.8 53 eth0"
echo " $0 192.168.1.1"
echo " $0 www.google.com 80"
exit 1
fi
network_diagnosis "$1" "$2" "$3"
第7章:实践应用场景与最佳实践
7.1 企业网络分段实战
大型企业网络架构设计
#!/bin/bash
# 大型企业网络分段实施方案
deploy_enterprise_segmentation() {
echo "=== 大型企业网络分段部署 ==="
# 网络规划
declare -A network_segments=(
# 格式: "段名称"="VLAN_ID:网络:网关:描述:安全级别"
["management"]="10:10.0.10.0/24:10.0.10.1:网络管理段:high"
["executive"]="20:10.0.20.0/24:10.0.20.1:高管办公段:high"
["finance"]="30:10.0.30.0/24:10.0.30.1:财务部门段:high"
["hr"]="40:10.0.40.0/24:10.0.40.1:人力资源段:medium"
["development"]="50:10.0.50.0/24:10.0.50.1:研发部门段:medium"
["sales"]="60:10.0.60.0/24:10.0.60.1:销售部门段:medium"
["guest"]="70:10.0.70.0/24:10.0.70.1:访客网络段:low"
["servers"]="100:10.0.100.0/24:10.0.100.1:服务器段:critical"
["database"]="110:10.0.110.0/24:10.0.110.1:数据库段:critical"
["backup"]="120:10.0.120.0/24:10.0.120.1:备份网络段:critical"
["dmz"]="200:10.0.200.0/24:10.0.200.1:DMZ区域:medium"
)
# 1. 创建网络段
echo "1. 创建网络分段..."
for segment in "${!network_segments[@]}"; do
IFS=':' read -r vlan_id network gateway description security <<< "${network_segments[$segment]}"
interface="eth0.${vlan_id}"
# 创建VLAN接口
ip link add link eth0 name ${interface} type vlan id ${vlan_id}
# 配置网关IP
gateway_ip="${gateway}/${network##*/}"
ip addr add ${gateway_ip} dev ${interface}
# 启用接口
ip link set ${interface} up
echo " ✓ ${segment}: ${interface} (${gateway_ip}) - ${description}"
done
# 2. 配置高级路由策略
echo -e "\n2. 配置高级路由策略..."
# 为每个网段创建独立路由表
table_id=100
for segment in "${!network_segments[@]}"; do
IFS=':' read -r vlan_id network gateway description security <<< "${network_segments[$segment]}"
# 创建路由表
echo "${table_id} ${segment}_table" >> /etc/iproute2/rt_tables
# 配置策略路由
ip rule add from ${network} table ${table_id} priority ${table_id}
ip route add ${network} dev eth0.${vlan_id} table ${table_id}
# 根据安全级别配置不同的出口路由
case $security in
"critical")
# 关键系统使用专用高速链路
ip route add default via 10.0.1.1 table ${table_id}
;;
"high")
# 高安全级别使用安全链路
ip route add default via 10.0.2.1 table ${table_id}
;;
"medium")
# 中等安全级别使用普通链路
ip route add default via 10.0.3.1 table ${table_id}
;;
"low")
# 低安全级别使用受限链路
ip route add default via 10.0.4.1 table ${table_id}
;;
esac
echo " ✓ ${segment}: table ${table_id} (${security} security)"
((table_id++))
done
# 3. 实施分层安全策略
echo -e "\n3. 实施分层安全策略..."
# 清空现有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 基础规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 管理段规则 - 最高权限
iptables -A INPUT -i eth0.10 -j ACCEPT
iptables -A FORWARD -i eth0.10 -j ACCEPT
# 高管段规则 - 高权限,但限制某些访问
iptables -A INPUT -i eth0.20 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0.20 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth0.20 -o eth0.100 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth0.20 -o eth0.200 -j ACCEPT
# 财务段规则 - 严格控制
iptables -A INPUT -i eth0.30 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth0.30 -o eth0.110 -p tcp --dport 3306 -j ACCEPT
iptables -A FORWARD -i eth0.30 -o eth0.100 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth0.30 -o eth0.200 -j DROP # 禁止访问DMZ
# 研发段规则 - 允许开发相关访问
iptables -A INPUT -i eth0.50 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -i eth0.50 -o eth0.100 -p tcp -m multiport --dports 80,443,8080,9000 -j ACCEPT
iptables -A FORWARD -i eth0.50 -o eth0.110 -p tcp --dport 3306 -j ACCEPT
# 访客段规则 - 最严格限制
iptables -A INPUT -i eth0.70 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i eth0.70 -o eth0.200 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A FORWARD -i eth0.70 -j DROP # 禁止访问内网
# 服务器段规则
iptables -A INPUT -i eth0.100 -p tcp --dport 22 -s 10.0.10.0/24 -j ACCEPT # 仅管理段可SSH
iptables -A FORWARD -i eth0.100 -o eth0.110 -p tcp --dport 3306 -j ACCEPT
iptables -A FORWARD -i eth0.100 -o eth0.120 -j ACCEPT # 允许备份
# DMZ规则
iptables -A INPUT -i eth0.200 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A FORWARD -i eth0.200 -o eth0.100 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth0.200 -d 10.0.0.0/16 -j DROP # 禁止访问内网
# 4. 配置流量监控和QoS
echo -e "\n4. 配置流量监控和QoS..."
# 主接口QoS配置
tc qdisc add dev eth0 root handle 1: htb default 999
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000mbit
# 为不同安全级别配置不同的带宽保证
declare -A qos_config=(
["critical"]="300mbit:500mbit:1" # 保证:上限:优先级
["high"]="200mbit:400mbit:2"
["medium"]="100mbit:300mbit:3"
["low"]="50mbit:100mbit:4"
)
class_id=10
for segment in "${!network_segments[@]}"; do
IFS=':' read -r vlan_id network gateway description security <<< "${network_segments[$segment]}"
if [[ -n "${qos_config[$security]}" ]]; then
IFS=':' read -r rate ceil prio <<< "${qos_config[$security]}"
# 创建类别
tc class add dev eth0 parent 1:1 classid 1:${class_id} htb rate ${rate} ceil ${ceil} prio ${prio}
# 添加过滤器
tc filter add dev eth0 parent 1: protocol 802.1q prio ${prio} u32 \
match u16 0x$(printf "%04x" $vlan_id) 0xffff at -4 flowid 1:${class_id}
echo " ✓ ${segment}: ${rate}/${ceil} (优先级 ${prio})"
fi
((class_id++))
done
# 5. 部署监控和告警
echo -e "\n5. 部署监控和告警..."
# 创建监控脚本
cat > /usr/local/bin/network_monitor.sh << 'EOF'
#!/bin/bash
# 网络分段监控脚本
ALERT_EMAIL="admin@company.com"
LOG_FILE="/var/log/network_monitor.log"
monitor_network_segments() {
while true; do
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# 检查关键接口状态
for interface in eth0.10 eth0.100 eth0.110; do
if ! ip link show $interface | grep -q "state UP"; then
echo "[$timestamp] CRITICAL: Interface $interface is DOWN" >> $LOG_FILE
echo "Critical network interface $interface is down" | \
mail -s "Network Alert: Interface Down" $ALERT_EMAIL
fi
done
# 检查连接跟踪表使用率
if [ -f "/proc/sys/net/netfilter/nf_conntrack_count" ]; then
count=$(cat /proc/sys/net/netfilter/nf_conntrack_count)
max=$(cat /proc/sys/net/netfilter/nf_conntrack_max)
usage=$((count * 100 / max))
if [ $usage -gt 90 ]; then
echo "[$timestamp] WARNING: Connection tracking table usage: ${usage}%" >> $LOG_FILE
echo "Connection tracking table usage is ${usage}%" | \
mail -s "Network Alert: High Connection Usage" $ALERT_EMAIL
fi
fi
# 检查异常流量
for interface in eth0.10 eth0.20 eth0.30; do
rx_bytes_before=$(cat /sys/class/net/$interface/statistics/rx_bytes 2>/dev/null || echo 0)
sleep 60
rx_bytes_after=$(cat /sys/class/net/$interface/statistics/rx_bytes 2>/dev/null || echo 0)
# 计算每秒流量 (Mbps)
rate=$(( (rx_bytes_after - rx_bytes_before) * 8 / 60 / 1024 / 1024 ))
# 根据接口设置不同的阈值
case $interface in
"eth0.10") threshold=50 ;; # 管理段
"eth0.20") threshold=100 ;; # 高管段
"eth0.30") threshold=30 ;; # 财务段
*) threshold=100 ;;
esac
if [ $rate -gt $threshold ]; then
echo "[$timestamp] WARNING: High traffic on $interface: ${rate}Mbps" >> $LOG_FILE
fi
done
sleep 300 # 5分钟检查一次
done
}
# 启动监控
monitor_network_segments &
EOF
chmod +x /usr/local/bin/network_monitor.sh
# 6. 创建管理脚本
echo -e "\n6. 创建管理脚本..."
cat > /usr/local/bin/network_segment_manager.sh << 'EOF'
#!/bin/bash
# 网络分段管理脚本
show_segment_status() {
echo "=== 网络分段状态 ==="
for interface in $(ip link show | grep eth0\. | awk -F': ' '{print $2}'); do
vlan_id=${interface##*.}
state=$(ip link show $interface | grep -o 'state [A-Z]*' | cut -d' ' -f2)
ip_addr=$(ip addr show $interface | grep 'inet ' | awk '{print $2}' | head -1)
echo "VLAN $vlan_id ($interface): $state - $ip_addr"
# 显示流量统计
if [ -f "/sys/class/net/$interface/statistics/rx_bytes" ]; then
rx=$(cat /sys/class/net/$interface/statistics/rx_bytes)
tx=$(cat /sys/class/net/$interface/statistics/tx_bytes)
echo " 流量: RX=$(numfmt --to=iec $rx)B, TX=$(numfmt --to=iec $tx)B"
fi
done
}
show_security_rules() {
echo "=== 安全规则统计 ==="
echo "INPUT链规则数: $(iptables -L INPUT --line-numbers | tail -n +3 | wc -l)"
echo "FORWARD链规则数: $(iptables -L FORWARD --line-numbers | tail -n +3 | wc -l)"
echo "NAT规则数: $(iptables -t nat -L --line-numbers | tail -n +3 | wc -l)"
echo -e "\n最近被阻止的连接:"
tail -10 /var/log/messages | grep "DPT=" | tail -5
}
case "$1" in
"status")
show_segment_status
;;
"security")
show_security_rules
;;
"monitor")
tail -f /var/log/network_monitor.log
;;
*)
echo "用法: $0 {status|security|monitor}"
;;
esac
EOF
chmod +x /usr/local/bin/network_segment_manager.sh
echo -e "\n=== 企业网络分段部署完成 ==="
echo "管理命令:"
echo " 查看状态: /usr/local/bin/network_segment_manager.sh status"
echo " 安全统计: /usr/local/bin/network_segment_manager.sh security"
echo " 监控日志: /usr/local/bin/network_segment_manager.sh monitor"
}
# 执行部署
deploy_enterprise_segmentation
7.2 虚拟化环境网络实战
KVM/QEMU虚拟化网络架构
#!/bin/bash
# KVM虚拟化网络环境配置
setup_kvm_network() {
echo "=== KVM虚拟化网络环境配置 ==="
# 1. 创建虚拟网络桥接
echo "1. 创建虚拟网络桥接..."
# 创建管理网络桥接
ip link add name br-mgmt type bridge
ip link set br-mgmt up
ip addr add 192.168.100.1/24 dev br-mgmt
# 创建业务网络桥接
ip link add name br-business type bridge
ip link set br-business up
ip addr add 192.168.200.1/24 dev br-business
# 创建存储网络桥接
ip link add name br-storage type bridge
ip link set br-storage up
ip addr add 192.168.300.1/24 dev br-storage
echo " ✓ 管理网络: br-mgmt (192.168.100.1/24)"
echo " ✓ 业务网络: br-business (192.168.200.1/24)"
echo " ✓ 存储网络: br-storage (192.168.300.1/24)"
# 2. 配置VLAN隔离
echo -e "\n2. 配置VLAN隔离..."
# 为不同租户创建VLAN
declare -A tenant_vlans=(
["tenant1"]="101:192.168.101.0/24"
["tenant2"]="102:192.168.102.0/24"
["tenant3"]="103:192.168.103.0/24"
)
for tenant in "${!tenant_vlans[@]}"; do
IFS=':' read -r vlan_id network <<< "${tenant_vlans[$tenant]}"
# 创建VLAN接口
ip link add link br-business name br-business.${vlan_id} type vlan id ${vlan_id}
ip link set br-business.${vlan_id} up
# 配置网关IP
gateway_ip="${network%.*}.1/${network##*/}"
ip addr add ${gateway_ip} dev br-business.${vlan_id}
echo " ✓ ${tenant}: VLAN ${vlan_id} (${gateway_ip})"
done
# 3. 配置虚拟机网络策略
echo -e "\n3. 配置虚拟机网络策略..."
# 创建虚拟机网络配置模板
cat > /etc/libvirt/qemu/networks/mgmt-network.xml << 'EOF'
<network>
<name>mgmt-network</name>
<forward mode='bridge'/>
<bridge name='br-mgmt'/>
</network>
EOF
cat > /etc/libvirt/qemu/networks/business-network.xml << 'EOF'
<network>
<name>business-network</name>
<forward mode='bridge'/>
<bridge name='br-business'/>
</network>
EOF
cat > /etc/libvirt/qemu/networks/storage-network.xml << 'EOF'
<network>
<name>storage-network</name>
<forward mode='bridge'/>
<bridge name='br-storage'/>
</network>
EOF
# 定义并启动网络
for network in mgmt-network business-network storage-network; do
virsh net-define /etc/libvirt/qemu/networks/${network}.xml
virsh net-start ${network}
virsh net-autostart ${network}
echo " ✓ libvirt网络: ${network}"
done
# 4. 配置虚拟机防火墙规则
echo -e "\n4. 配置虚拟机防火墙规则..."
# 允许桥接流量
iptables -A FORWARD -i br-mgmt -j ACCEPT
iptables -A FORWARD -o br-mgmt -j ACCEPT
iptables -A FORWARD -i br-business -j ACCEPT
iptables -A FORWARD -o br-business -j ACCEPT
iptables -A FORWARD -i br-storage -j ACCEPT
iptables -A FORWARD -o br-storage -j ACCEPT
# 租户间隔离
for tenant1 in "${!tenant_vlans[@]}"; do
for tenant2 in "${!tenant_vlans[@]}"; do
if [ "$tenant1" != "$tenant2" ]; then
IFS=':' read -r vlan1 network1 <<< "${tenant_vlans[$tenant1]}"
IFS=':' read -r vlan2 network2 <<< "${tenant_vlans[$tenant2]}"
# 禁止租户间直接通信
iptables -A FORWARD -i br-business.${vlan1} -o br-business.${vlan2} -j DROP
iptables -A FORWARD -i br-business.${vlan2} -o br-business.${vlan1} -j DROP
fi
done
done
# 5. 配置虚拟机QoS
echo -e "\n5. 配置虚拟机QoS..."
# 为每个桥接配置流量控制
for bridge in br-mgmt br-business br-storage; do
tc qdisc add dev ${bridge} root handle 1: htb default 999
tc class add dev ${bridge} parent 1: classid 1:1 htb rate 1000mbit
case $bridge in
"br-mgmt")
# 管理网络 - 低延迟优先
tc class add dev ${bridge} parent 1:1 classid 1:10 htb rate 100mbit ceil 200mbit prio 1
;;
"br-business")
# 业务网络 - 高带宽
tc class add dev ${bridge} parent 1:1 classid 1:20 htb rate 500mbit ceil 800mbit prio 2
;;
"br-storage")
# 存储网络 - 稳定带宽
tc class add dev ${bridge} parent 1:1 classid 1:30 htb rate 300mbit ceil 500mbit prio 2
;;
esac
echo " ✓ ${bridge}: QoS配置完成"
done
# 6. 创建虚拟机网络监控
echo -e "\n6. 创建虚拟机网络监控..."
cat > /usr/local/bin/vm_network_monitor.sh << 'EOF'
#!/bin/bash
# 虚拟机网络监控脚本
monitor_vm_networks() {
echo "=== 虚拟机网络状态监控 ==="
# 监控桥接状态
echo "桥接接口状态:"
for bridge in br-mgmt br-business br-storage; do
if ip link show $bridge >/dev/null 2>&1; then
state=$(ip link show $bridge | grep -o 'state [A-Z]*' | cut -d' ' -f2)
echo " $bridge: $state"
# 显示连接的虚拟机接口
connected_vms=$(bridge link show | grep $bridge | wc -l)
echo " 连接的VM: $connected_vms"
# 显示流量统计
if [ -f "/sys/class/net/$bridge/statistics/rx_bytes" ]; then
rx=$(cat /sys/class/net/$bridge/statistics/rx_bytes)
tx=$(cat /sys/class/net/$bridge/statistics/tx_bytes)
echo " 流量: RX=$(numfmt --to=iec $rx)B, TX=$(numfmt --to=iec $tx)B"
fi
fi
done
# 监控libvirt网络
echo -e "\n活跃的libvirt网络:"
virsh net-list --all
# 监控虚拟机网络接口
echo -e "\n虚拟机网络接口:"
for vm in $(virsh list --name); do
if [ -n "$vm" ]; then
echo "VM: $vm"
virsh domiflist $vm 2>/dev/null | tail -n +3
fi
done
}
# 网络性能测试
test_vm_network_performance() {
local vm_name="$1"
local test_duration="$2"
if [ -z "$vm_name" ]; then
echo "用法: test_vm_network_performance <VM名称> [测试时长秒]"
return 1
fi
test_duration=${test_duration:-10}
echo "=== 虚拟机网络性能测试: $vm_name ==="
# 获取VM的网络接口
vm_interfaces=$(virsh domiflist $vm_name 2>/dev/null | tail -n +3 | awk '{print $1}')
for interface in $vm_interfaces; do
echo "测试接口: $interface"
# 获取对应的tap接口
tap_interface=$(virsh domiflist $vm_name | grep $interface | awk '{print $5}')
if [ -n "$tap_interface" ]; then
echo " 对应tap接口: $tap_interface"
# 测试前的统计
rx_before=$(cat /sys/class/net/$tap_interface/statistics/rx_bytes 2>/dev/null || echo 0)
tx_before=$(cat /sys/class/net/$tap_interface/statistics/tx_bytes 2>/dev/null || echo 0)
sleep $test_duration
# 测试后的统计
rx_after=$(cat /sys/class/net/$tap_interface/statistics/rx_bytes 2>/dev/null || echo 0)
tx_after=$(cat /sys/class/net/$tap_interface/statistics/tx_bytes 2>/dev/null || echo 0)
# 计算速率
rx_rate=$(( (rx_after - rx_before) * 8 / test_duration / 1024 / 1024 ))
tx_rate=$(( (tx_after - tx_before) * 8 / test_duration / 1024 / 1024 ))
echo " RX速率: ${rx_rate} Mbps"
echo " TX速率: ${tx_rate} Mbps"
fi
done
}
case "$1" in
"monitor")
monitor_vm_networks
;;
"test")
test_vm_network_performance "$2" "$3"
;;
*)
echo "用法: $0 {monitor|test} [VM名称] [测试时长]"
;;
esac
EOF
chmod +x /usr/local/bin/vm_network_monitor.sh
echo -e "\n=== KVM虚拟化网络环境配置完成 ==="
echo "管理命令:"
echo " 网络监控: /usr/local/bin/vm_network_monitor.sh monitor"
echo " 性能测试: /usr/local/bin/vm_network_monitor.sh test <VM名称>"
}
# 执行配置
setup_kvm_network
7.3 容器网络深度实战
Docker网络高级配置
#!/bin/bash
# Docker容器网络高级配置
setup_docker_advanced_network() {
echo "=== Docker容器网络高级配置 ==="
# 1. 创建自定义网络
echo "1. 创建自定义Docker网络..."
# 创建前端网络
docker network create \
--driver bridge \
--subnet=172.20.0.0/16 \
--ip-range=172.20.240.0/20 \
--gateway=172.20.0.1 \
--opt com.docker.network.bridge.name=docker-frontend \
frontend-network
# 创建后端网络
docker network create \
--driver bridge \
--subnet=172.21.0.0/16 \
--ip-range=172.21.240.0/20 \
--gateway=172.21.0.1 \
--opt com.docker.network.bridge.name=docker-backend \
backend-network
# 创建数据库网络
docker network create \
--driver bridge \
--subnet=172.22.0.0/16 \
--ip-range=172.22.240.0/20 \
--gateway=172.22.0.1 \
--opt com.docker.network.bridge.name=docker-database \
--internal \
database-network
echo " ✓ frontend-network: 172.20.0.0/16"
echo " ✓ backend-network: 172.21.0.0/16"
echo " ✓ database-network: 172.22.0.0/16 (内部网络)"
# 2. 配置容器网络隔离
echo -e "\n2. 配置容器网络隔离..."
# 禁止不同网络间的直接通信
iptables -I DOCKER-USER -i docker-frontend -o docker-backend -j DROP
iptables -I DOCKER-USER -i docker-backend -o docker-frontend -j DROP
iptables -I DOCKER-USER -i docker-frontend -o docker-database -j DROP
iptables -I DOCKER-USER -i docker-database -o docker-frontend -j DROP
# 允许后端访问数据库
iptables -I DOCKER-USER -i docker-backend -o docker-database -j ACCEPT
iptables -I DOCKER-USER -i docker-database -o docker-backend -m state --state ESTABLISHED,RELATED -j ACCEPT
echo " ✓ 网络隔离规则配置完成"
# 3. 配置容器QoS
echo -e "\n3. 配置容器QoS..."
# 为Docker桥接配置流量控制
for bridge in docker-frontend docker-backend docker-database; do
if ip link show $bridge >/dev/null 2>&1; then
tc qdisc add dev $bridge root handle 1: htb default 999
tc class add dev $bridge parent 1: classid 1:1 htb rate 1000mbit
case $bridge in
"docker-frontend")
# 前端网络 - 高带宽,低延迟
tc class add dev $bridge parent 1:1 classid 1:10 htb rate 300mbit ceil 500mbit prio 1
;;
"docker-backend")
# 后端网络 - 中等带宽
tc class add dev $bridge parent 1:1 classid 1:20 htb rate 200mbit ceil 400mbit prio 2
;;
"docker-database")
# 数据库网络 - 稳定带宽
tc class add dev $bridge parent 1:1 classid 1:30 htb rate 150mbit ceil 300mbit prio 2
;;
esac
echo " ✓ ${bridge}: QoS配置完成"
fi
done
# 4. 创建容器网络监控
echo -e "\n4. 创建容器网络监控..."
cat > /usr/local/bin/docker_network_monitor.sh << 'EOF'
#!/bin/bash
# Docker容器网络监控脚本
monitor_docker_networks() {
echo "=== Docker网络状态监控 ==="
# 显示Docker网络列表
echo "Docker网络列表:"
docker network ls
echo -e "\n网络详细信息:"
for network in frontend-network backend-network database-network; do
echo "网络: $network"
docker network inspect $network | jq -r '.[0] | " 子网: \(.IPAM.Config[0].Subnet)\n 网关: \(.IPAM.Config[0].Gateway)\n 驱动: \(.Driver)"'
# 显示连接的容器
containers=$(docker network inspect $network | jq -r '.[0].Containers | keys[]' 2>/dev/null)
if [ -n "$containers" ]; then
echo " 连接的容器:"
for container_id in $containers; do
container_name=$(docker inspect $container_id | jq -r '.[0].Name' | sed 's/^\//')
container_ip=$(docker network inspect $network | jq -r ".[0].Containers[\"$container_id\"].IPv4Address" | cut -d'/' -f1)
echo " - $container_name ($container_ip)"
done
else
echo " 连接的容器: 无"
fi
echo
done
}
monitor_container_traffic() {
echo "=== 容器流量监控 ==="
# 监控所有运行中的容器
for container in $(docker ps --format "{{.Names}}"); do
echo "容器: $container"
# 获取容器的网络命名空间
container_pid=$(docker inspect $container | jq -r '.[0].State.Pid')
if [ "$container_pid" != "null" ] && [ "$container_pid" != "0" ]; then
# 进入容器网络命名空间查看接口统计
nsenter -t $container_pid -n ip -s link show eth0 2>/dev/null | grep -E "(RX|TX):" || echo " 无法获取统计信息"
fi
echo
done
}
test_container_connectivity() {
local source_container="$1"
local target_container="$2"
if [ -z "$source_container" ] || [ -z "$target_container" ]; then
echo "用法: test_container_connectivity <源容器> <目标容器>"
return 1
fi
echo "=== 容器连通性测试 ==="
echo "源容器: $source_container"
echo "目标容器: $target_container"
# 获取目标容器IP
target_ip=$(docker inspect $target_container | jq -r '.[0].NetworkSettings.Networks | to_entries[0].value.IPAddress')
if [ "$target_ip" = "null" ] || [ -z "$target_ip" ]; then
echo "错误: 无法获取目标容器IP地址"
return 1
fi
echo "目标IP: $target_ip"
# 在源容器中执行ping测试
echo "Ping测试结果:"
docker exec $source_container ping -c 3 $target_ip 2>/dev/null || echo " 连通性测试失败"
}
case "$1" in
"networks")
monitor_docker_networks
;;
"traffic")
monitor_container_traffic
;;
"test")
test_container_connectivity "$2" "$3"
;;
*)
echo "用法: $0 {networks|traffic|test} [源容器] [目标容器]"
;;
esac
EOF
chmod +x /usr/local/bin/docker_network_monitor.sh
# 5. 创建容器网络故障排查脚本
echo -e "\n5. 创建容器网络故障排查脚本..."
cat > /usr/local/bin/docker_network_troubleshoot.sh << 'EOF'
#!/bin/bash
# Docker容器网络故障排查脚本
troubleshoot_docker_network() {
local container_name="$1"
if [ -z "$container_name" ]; then
echo "用法: $0 <容器名称>"
exit 1
fi
echo "=== Docker容器网络故障排查: $container_name ==="
# 1. 检查容器状态
echo "1. 容器状态检查:"
if docker ps | grep -q $container_name; then
echo " ✓ 容器正在运行"
container_status="running"
elif docker ps -a | grep -q $container_name; then
echo " ✗ 容器已停止"
container_status="stopped"
return 1
else
echo " ✗ 容器不存在"
return 1
fi
# 2. 检查网络配置
echo -e "\n2. 网络配置检查:"
networks=$(docker inspect $container_name | jq -r '.[0].NetworkSettings.Networks | keys[]')
for network in $networks; do
echo " 网络: $network"
ip_address=$(docker inspect $container_name | jq -r ".[0].NetworkSettings.Networks[\"$network\"].IPAddress")
gateway=$(docker inspect $container_name | jq -r ".[0].NetworkSettings.Networks[\"$network\"].Gateway")
mac_address=$(docker inspect $container_name | jq -r ".[0].NetworkSettings.Networks[\"$network\"].MacAddress")
echo " IP地址: $ip_address"
echo " 网关: $gateway"
echo " MAC地址: $mac_address"
# 测试网关连通性
if [ "$ip_address" != "null" ] && [ "$gateway" != "null" ]; then
echo " 网关连通性测试:"
if docker exec $container_name ping -c 1 -W 2 $gateway >/dev/null 2>&1; then
echo " ✓ 网关可达"
else
echo " ✗ 网关不可达"
fi
fi
done
# 3. 检查容器内网络接口
echo -e "\n3. 容器内网络接口:"
docker exec $container_name ip addr show 2>/dev/null || echo " 无法获取接口信息"
# 4. 检查容器内路由表
echo -e "\n4. 容器内路由表:"
docker exec $container_name ip route show 2>/dev/null || echo " 无法获取路由信息"
# 5. 检查DNS配置
echo -e "\n5. DNS配置检查:"
docker exec $container_name cat /etc/resolv.conf 2>/dev/null || echo " 无法获取DNS配置"
# 6. 检查端口映射
echo -e "\n6. 端口映射检查:"
port_mappings=$(docker port $container_name 2>/dev/null)
if [ -n "$port_mappings" ]; then
echo "$port_mappings"
else
echo " 无端口映射"
fi
# 7. 检查防火墙规则
echo -e "\n7. 相关防火墙规则:"
container_ip=$(docker inspect $container_name | jq -r '.[0].NetworkSettings.Networks | to_entries[0].value.IPAddress')
if [ "$container_ip" != "null" ]; then
echo " 容器IP相关规则:"
iptables -L -n | grep $container_ip || echo " 未找到相关规则"
fi
# 8. 网络性能测试
echo -e "\n8. 网络性能测试:"
echo " 测试外网连通性:"
if docker exec $container_name ping -c 3 -W 2 8.8.8.8 >/dev/null 2>&1; then
echo " ✓ 外网连通正常"
else
echo " ✗ 外网连通异常"
fi
echo " 测试DNS解析:"
if docker exec $container_name nslookup google.com >/dev/null 2>&1; then
echo " ✓ DNS解析正常"
else
echo " ✗ DNS解析异常"
fi
}
troubleshoot_docker_network "$1"
EOF
chmod +x /usr/local/bin/docker_network_troubleshoot.sh
echo -e "\n=== Docker容器网络高级配置完成 ==="
echo "管理命令:"
echo " 网络监控: /usr/local/bin/docker_network_monitor.sh networks"
echo " 流量监控: /usr/local/bin/docker_network_monitor.sh traffic"
echo " 连通性测试: /usr/local/bin/docker_network_monitor.sh test <源容器> <目标容器>"
echo " 故障排查: /usr/local/bin/docker_network_troubleshoot.sh <容器名称>"
}
# 执行配置
setup_docker_advanced_network
7.4 多网卡负载均衡与高可用
网卡绑定(Bonding)高级配置
#!/bin/bash
# 多网卡负载均衡与高可用配置
setup_advanced_bonding() {
echo "=== 多网卡负载均衡与高可用配置 ==="
# 1. 配置不同模式的网卡绑定
echo "1. 配置多种网卡绑定模式..."
# 模式0: 负载均衡 (balance-rr)
echo " 配置负载均衡模式 (balance-rr)..."
ip link add bond-lb type bond mode balance-rr
ip link set eth1 master bond-lb
ip link set eth2 master bond-lb
ip addr add 192.168.1.100/24 dev bond-lb
ip link set bond-lb up
echo " ✓ bond-lb: 负载均衡模式 (eth1 + eth2)"
# 模式1: 主备模式 (active-backup)
echo " 配置主备模式 (active-backup)..."
ip link add bond-ha type bond mode active-backup
ip link set eth3 master bond-ha
ip link set eth4 master bond-ha
ip addr add 192.168.2.100/24 dev bond-ha
ip link set bond-ha up
echo " ✓ bond-ha: 主备模式 (eth3 + eth4)"
# 模式4: 802.3ad (LACP)
echo " 配置LACP模式 (802.3ad)..."
ip link add bond-lacp type bond mode 802.3ad
echo 100 > /sys/class/net/bond-lacp/bonding/miimon
echo 1 > /sys/class/net/bond-lacp/bonding/lacp_rate
ip link set eth5 master bond-lacp
ip link set eth6 master bond-lacp
ip addr add 192.168.3.100/24 dev bond-lacp
ip link set bond-lacp up
echo " ✓ bond-lacp: LACP模式 (eth5 + eth6)"
# 2. 配置高级监控参数
echo -e "\n2. 配置高级监控参数..."
# 配置MII监控
echo 100 > /sys/class/net/bond-lb/bonding/miimon
echo 100 > /sys/class/net/bond-ha/bonding/miimon
# 配置ARP监控
echo 192.168.1.1 > /sys/class/net/bond-lb/bonding/arp_ip_target
echo 192.168.2.1 > /sys/class/net/bond-ha/bonding/arp_ip_target
echo 5000 > /sys/class/net/bond-lb/bonding/arp_interval
echo 5000 > /sys/class/net/bond-ha/bonding/arp_interval
echo " ✓ MII监控: 100ms间隔"
echo " ✓ ARP监控: 5秒间隔"
# 3. 配置路由策略
echo -e "\n3. 配置多路径路由策略..."
# 创建多路径路由表
echo "100 bond_lb_table" >> /etc/iproute2/rt_tables
echo "101 bond_ha_table" >> /etc/iproute2/rt_tables
echo "102 bond_lacp_table" >> /etc/iproute2/rt_tables
# 配置策略路由
ip rule add from 192.168.1.0/24 table bond_lb_table priority 100
ip rule add from 192.168.2.0/24 table bond_ha_table priority 101
ip rule add from 192.168.3.0/24 table bond_lacp_table priority 102
# 配置路由表
ip route add 192.168.1.0/24 dev bond-lb table bond_lb_table
ip route add default via 192.168.1.1 table bond_lb_table
ip route add 192.168.2.0/24 dev bond-ha table bond_ha_table
ip route add default via 192.168.2.1 table bond_ha_table
ip route add 192.168.3.0/24 dev bond-lacp table bond_lacp_table
ip route add default via 192.168.3.1 table bond_lacp_table
echo " ✓ 多路径路由策略配置完成"
# 4. 配置负载均衡策略
echo -e "\n4. 配置负载均衡策略..."
# 配置ECMP (Equal Cost Multi-Path)
ip route add default \
nexthop via 192.168.1.1 dev bond-lb weight 3 \
nexthop via 192.168.2.1 dev bond-ha weight 2 \
nexthop via 192.168.3.1 dev bond-lacp weight 5
echo " ✓ ECMP负载均衡: 权重比例 3:2:5"
# 5. 创建网卡绑定监控脚本
echo -e "\n5. 创建网卡绑定监控脚本..."
cat > /usr/local/bin/bonding_monitor.sh << 'EOF'
#!/bin/bash
# 网卡绑定监控脚本
monitor_bonding_status() {
echo "=== 网卡绑定状态监控 ==="
for bond in bond-lb bond-ha bond-lacp; do
if [ -d "/sys/class/net/$bond" ]; then
echo "绑定接口: $bond"
# 基本信息
mode=$(cat /sys/class/net/$bond/bonding/mode 2>/dev/null)
state=$(ip link show $bond | grep -o 'state [A-Z]*' | cut -d' ' -f2)
ip_addr=$(ip addr show $bond | grep 'inet ' | awk '{print $2}' | head -1)
echo " 模式: $mode"
echo " 状态: $state"
echo " IP地址: $ip_addr"
# 从属接口状态
echo " 从属接口:"
if [ -f "/sys/class/net/$bond/bonding/slaves" ]; then
slaves=$(cat /sys/class/net/$bond/bonding/slaves)
for slave in $slaves; do
slave_state=$(cat /sys/class/net/$bond/bonding/slave_$slave/link_failure_count 2>/dev/null || echo "N/A")
active_slave=$(cat /sys/class/net/$bond/bonding/active_slave 2>/dev/null)
if [ "$slave" = "$active_slave" ]; then
echo " $slave: 活跃 (故障次数: $slave_state)"
else
echo " $slave: 备用 (故障次数: $slave_state)"
fi
done
fi
# 流量统计
if [ -f "/sys/class/net/$bond/statistics/rx_bytes" ]; then
rx=$(cat /sys/class/net/$bond/statistics/rx_bytes)
tx=$(cat /sys/class/net/$bond/statistics/tx_bytes)
echo " 流量统计: RX=$(numfmt --to=iec $rx)B, TX=$(numfmt --to=iec $tx)B"
fi
echo
fi
done
}
test_bonding_failover() {
local bond_name="$1"
local test_duration="$2"
if [ -z "$bond_name" ]; then
echo "用法: test_bonding_failover <绑定接口名> [测试时长秒]"
return 1
fi
test_duration=${test_duration:-30}
echo "=== 网卡绑定故障转移测试: $bond_name ==="
if [ ! -d "/sys/class/net/$bond_name" ]; then
echo "错误: 绑定接口 $bond_name 不存在"
return 1
fi
# 获取当前活跃接口
active_slave=$(cat /sys/class/net/$bond_name/bonding/active_slave 2>/dev/null)
slaves=$(cat /sys/class/net/$bond_name/bonding/slaves 2>/dev/null)
echo "当前活跃接口: $active_slave"
echo "所有从属接口: $slaves"
if [ -z "$active_slave" ]; then
echo "错误: 无活跃接口"
return 1
fi
# 开始连通性测试
gateway=$(ip route show dev $bond_name | grep default | awk '{print $3}' | head -1)
if [ -n "$gateway" ]; then
echo "开始连通性测试 (目标: $gateway)..."
# 后台持续ping测试
ping -i 1 $gateway > /tmp/ping_test_$bond_name.log 2>&1 &
ping_pid=$!
sleep 5
# 模拟接口故障
echo "模拟接口故障: 禁用 $active_slave"
ip link set $active_slave down
sleep $test_duration
# 恢复接口
echo "恢复接口: 启用 $active_slave"
ip link set $active_slave up
sleep 5
# 停止ping测试
kill $ping_pid 2>/dev/null
# 分析结果
echo "故障转移测试结果:"
total_pings=$(grep -c "bytes from" /tmp/ping_test_$bond_name.log)
lost_pings=$(grep -c "no answer" /tmp/ping_test_$bond_name.log)
success_rate=$(( (total_pings - lost_pings) * 100 / total_pings ))
echo " 总ping数: $total_pings"
echo " 丢失数: $lost_pings"
echo " 成功率: $success_rate%"
# 清理临时文件
rm -f /tmp/ping_test_$bond_name.log
else
echo "错误: 无法找到默认网关"
fi
}
monitor_bonding_performance() {
echo "=== 网卡绑定性能监控 ==="
for bond in bond-lb bond-ha bond-lacp; do
if [ -d "/sys/class/net/$bond" ]; then
echo "绑定接口: $bond"
# 获取初始统计
rx_before=$(cat /sys/class/net/$bond/statistics/rx_bytes)
tx_before=$(cat /sys/class/net/$bond/statistics/tx_bytes)
sleep 10
# 获取结束统计
rx_after=$(cat /sys/class/net/$bond/statistics/rx_bytes)
tx_after=$(cat /sys/class/net/$bond/statistics/tx_bytes)
# 计算速率
rx_rate=$(( (rx_after - rx_before) * 8 / 10 / 1024 / 1024 ))
tx_rate=$(( (tx_after - tx_before) * 8 / 10 / 1024 / 1024 ))
echo " RX速率: ${rx_rate} Mbps"
echo " TX速率: ${tx_rate} Mbps"
# 检查从属接口负载分布
echo " 从属接口负载分布:"
slaves=$(cat /sys/class/net/$bond/bonding/slaves)
for slave in $slaves; do
if [ -f "/sys/class/net/$slave/statistics/rx_bytes" ]; then
slave_rx=$(cat /sys/class/net/$slave/statistics/rx_bytes)
slave_tx=$(cat /sys/class/net/$slave/statistics/tx_bytes)
echo " $slave: RX=$(numfmt --to=iec $slave_rx)B, TX=$(numfmt --to=iec $slave_tx)B"
fi
done
echo
fi
done
}
case "$1" in
"status")
monitor_bonding_status
;;
"failover")
test_bonding_failover "$2" "$3"
;;
"performance")
monitor_bonding_performance
;;
*)
echo "用法: $0 {status|failover|performance} [绑定接口] [测试时长]"
;;
esac
EOF
chmod +x /usr/local/bin/bonding_monitor.sh
echo -e "\n=== 多网卡负载均衡与高可用配置完成 ==="
echo "管理命令:"
echo " 状态监控: /usr/local/bin/bonding_monitor.sh status"
echo " 故障转移测试: /usr/local/bin/bonding_monitor.sh failover <绑定接口> [时长]"
echo " 性能监控: /usr/local/bin/bonding_monitor.sh performance"
}
# 执行配置
setup_advanced_bonding
7.5 网络故障排查与诊断
系统化网络故障排查流程
#!/bin/bash
# 系统化网络故障排查脚本
comprehensive_network_diagnosis() {
echo "=== 系统化网络故障排查 ==="
# 1. 基础连通性检查
echo "1. 基础连通性检查..."
# 检查网络接口状态
echo " 网络接口状态:"
ip link show | grep -E "^[0-9]+:" | while read line; do
interface=$(echo $line | cut -d: -f2 | tr -d ' ')
state=$(echo $line | grep -o 'state [A-Z]*' | cut -d' ' -f2)
echo " $interface: $state"
done
# 检查IP配置
echo -e "\n IP地址配置:"
ip addr show | grep -E "inet " | while read line; do
ip=$(echo $line | awk '{print $2}')
interface=$(echo $line | awk '{print $NF}')
echo " $interface: $ip"
done
# 检查路由表
echo -e "\n 路由表检查:"
ip route show | head -10
# 2. DNS解析检查
echo -e "\n2. DNS解析检查..."
# 检查DNS配置
echo " DNS服务器配置:"
cat /etc/resolv.conf | grep nameserver
# 测试DNS解析
echo -e "\n DNS解析测试:"
test_domains=("google.com" "baidu.com" "github.com")
for domain in "${test_domains[@]}"; do
if nslookup $domain >/dev/null 2>&1; then
echo " ✓ $domain: 解析成功"
else
echo " ✗ $domain: 解析失败"
fi
done
# 3. 网关连通性检查
echo -e "\n3. 网关连通性检查..."
default_gateway=$(ip route | grep default | awk '{print $3}' | head -1)
if [ -n "$default_gateway" ]; then
echo " 默认网关: $default_gateway"
if ping -c 3 -W 2 $default_gateway >/dev/null 2>&1; then
echo " ✓ 网关连通正常"
else
echo " ✗ 网关连通异常"
fi
else
echo " ✗ 未找到默认网关"
fi
# 4. 外网连通性检查
echo -e "\n4. 外网连通性检查..."
test_ips=("8.8.8.8" "114.114.114.114" "1.1.1.1")
for ip in "${test_ips[@]}"; do
if ping -c 3 -W 2 $ip >/dev/null 2>&1; then
echo " ✓ $ip: 连通正常"
else
echo " ✗ $ip: 连通异常"
fi
done
# 5. 端口连通性检查
echo -e "\n5. 端口连通性检查..."
# 检查常用服务端口
common_ports=("80:HTTP" "443:HTTPS" "22:SSH" "53:DNS")
for port_info in "${common_ports[@]}"; do
IFS=':' read -r port service <<< "$port_info"
if nc -z -w3 8.8.8.8 $port 2>/dev/null; then
echo " ✓ $service ($port): 可达"
else
echo " ✗ $service ($port): 不可达"
fi
done
# 6. 防火墙状态检查
echo -e "\n6. 防火墙状态检查..."
# 检查iptables规则数量
input_rules=$(iptables -L INPUT --line-numbers | wc -l)
forward_rules=$(iptables -L FORWARD --line-numbers | wc -l)
output_rules=$(iptables -L OUTPUT --line-numbers | wc -l)
echo " iptables规则统计:"
echo " INPUT链: $((input_rules - 2)) 条规则"
echo " FORWARD链: $((forward_rules - 2)) 条规则"
echo " OUTPUT链: $((output_rules - 2)) 条规则"
# 检查默认策略
default_input=$(iptables -L INPUT | head -1 | grep -o 'policy [A-Z]*' | cut -d' ' -f2)
default_forward=$(iptables -L FORWARD | head -1 | grep -o 'policy [A-Z]*' | cut -d' ' -f2)
default_output=$(iptables -L OUTPUT | head -1 | grep -o 'policy [A-Z]*' | cut -d' ' -f2)
echo " 默认策略:"
echo " INPUT: $default_input"
echo " FORWARD: $default_forward"
echo " OUTPUT: $default_output"
# 7. 网络性能检查
echo -e "\n7. 网络性能检查..."
# 检查网络接口流量
echo " 网络接口流量统计:"
for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' ' | grep -v lo); do
if [ -f "/sys/class/net/$interface/statistics/rx_bytes" ]; then
rx=$(cat /sys/class/net/$interface/statistics/rx_bytes)
tx=$(cat /sys/class/net/$interface/statistics/tx_bytes)
echo " $interface: RX=$(numfmt --to=iec $rx)B, TX=$(numfmt --to=iec $tx)B"
fi
done
# 8. 系统资源检查
echo -e "\n8. 系统资源检查..."
# 检查网络相关进程
echo " 网络相关进程:"
ps aux | grep -E "(dhcp|network|ssh|http)" | grep -v grep | head -5
# 检查网络连接数
tcp_connections=$(ss -t | wc -l)
udp_connections=$(ss -u | wc -l)
echo -e "\n 网络连接统计:"
echo " TCP连接: $((tcp_connections - 1))"
echo " UDP连接: $((udp_connections - 1))"
# 9. 生成诊断报告
echo -e "\n9. 生成诊断报告..."
report_file="/tmp/network_diagnosis_$(date +%Y%m%d_%H%M%S).log"
{
echo "=== 网络诊断报告 ==="
echo "生成时间: $(date)"
echo "主机名: $(hostname)"
echo "内核版本: $(uname -r)"
echo
echo "=== 网络接口信息 ==="
ip addr show
echo
echo "=== 路由信息 ==="
ip route show
echo
echo "=== ARP表 ==="
arp -a
echo
echo "=== 网络连接 ==="
ss -tuln
echo
echo "=== 防火墙规则 ==="
iptables -L -n
} > $report_file
echo " 诊断报告已保存到: $report_file"
}
# 网络性能测试
network_performance_test() {
local target_host="$1"
local test_duration="$2"
if [ -z "$target_host" ]; then
echo "用法: network_performance_test <目标主机> [测试时长秒]"
return 1
fi
test_duration=${test_duration:-60}
echo "=== 网络性能测试: $target_host ==="
# 1. 延迟测试
echo "1. 延迟测试..."
ping_result=$(ping -c 10 $target_host 2>/dev/null)
if [ $? -eq 0 ]; then
avg_latency=$(echo "$ping_result" | tail -1 | cut -d'/' -f5)
packet_loss=$(echo "$ping_result" | grep "packet loss" | cut -d',' -f3 | cut -d'%' -f1 | tr -d ' ')
echo " 平均延迟: ${avg_latency}ms"
echo " 丢包率: ${packet_loss}%"
else
echo " ✗ 无法连接到目标主机"
return 1
fi
# 2. 带宽测试 (使用iperf3如果可用)
echo -e "\n2. 带宽测试..."
if command -v iperf3 >/dev/null 2>&1; then
echo " 使用iperf3进行带宽测试..."
iperf3 -c $target_host -t $test_duration 2>/dev/null || echo " iperf3测试失败,可能目标主机未运行iperf3服务器"
else
echo " iperf3未安装,跳过带宽测试"
fi
# 3. 路径追踪
echo -e "\n3. 路径追踪..."
traceroute $target_host 2>/dev/null | head -10 || echo " traceroute失败"
# 4. 端口扫描 (常用端口)
echo -e "\n4. 常用端口检查..."
common_ports=(22 80 443 3389 5432 3306)
for port in "${common_ports[@]}"; do
if nc -z -w3 $target_host $port 2>/dev/null; then
echo " 端口 $port: 开放"
else
echo " 端口 $port: 关闭"
fi
done
}
# 网络故障自动修复
auto_network_repair() {
echo "=== 网络故障自动修复 ==="
# 1. 检查并修复网络接口
echo "1. 检查并修复网络接口..."
for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' ' | grep -v lo); do
state=$(ip link show $interface | grep -o 'state [A-Z]*' | cut -d' ' -f2)
if [ "$state" = "DOWN" ]; then
echo " 修复接口: $interface (状态: $state)"
ip link set $interface up
if [ $? -eq 0 ]; then
echo " ✓ 接口 $interface 已启用"
else
echo " ✗ 接口 $interface 启用失败"
fi
fi
done
# 2. 检查并修复DNS配置
echo -e "\n2. 检查并修复DNS配置..."
if ! grep -q "nameserver" /etc/resolv.conf; then
echo " 修复DNS配置..."
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
echo "nameserver 114.114.114.114" >> /etc/resolv.conf
echo " ✓ 已添加备用DNS服务器"
fi
# 3. 检查并修复路由
echo -e "\n3. 检查并修复路由..."
if ! ip route | grep -q "default"; then
echo " 检测到缺少默认路由..."
# 尝试从DHCP获取路由
for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' ' | grep -E "eth|ens|enp"); do
echo " 尝试从 $interface 获取DHCP配置..."
dhclient $interface 2>/dev/null
if ip route | grep -q "default"; then
echo " ✓ 已通过 $interface 获取默认路由"
break
fi
done
fi
# 4. 重启网络服务
echo -e "\n4. 重启网络服务..."
if systemctl is-active --quiet NetworkManager; then
echo " 重启NetworkManager..."
systemctl restart NetworkManager
echo " ✓ NetworkManager已重启"
elif systemctl is-active --quiet networking; then
echo " 重启networking服务..."
systemctl restart networking
echo " ✓ networking服务已重启"
fi
# 5. 验证修复结果
echo -e "\n5. 验证修复结果..."
if ping -c 3 -W 2 8.8.8.8 >/dev/null 2>&1; then
echo " ✓ 网络连通性恢复正常"
else
echo " ✗ 网络连通性仍然异常,需要手动检查"
fi
}
case "$1" in
"diagnosis")
comprehensive_network_diagnosis
;;
"performance")
network_performance_test "$2" "$3"
;;
"repair")
auto_network_repair
;;
*)
echo "用法: $0 {diagnosis|performance|repair} [目标主机] [测试时长]"
echo " diagnosis - 执行全面网络诊断"
echo " performance - 执行网络性能测试"
echo " repair - 执行自动网络修复"
;;
esac
7.6 网络性能优化最佳实践
系统级网络优化
#!/bin/bash
# 系统级网络性能优化配置
optimize_network_performance() {
echo "=== 系统级网络性能优化 ==="
# 1. 内核网络参数优化
echo "1. 内核网络参数优化..."
cat > /etc/sysctl.d/99-network-performance.conf << 'EOF'
# 网络性能优化参数
# TCP优化
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 5000
net.core.netdev_budget = 600
# TCP缓冲区优化
net.ipv4.tcp_rmem = 4096 65536 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 786432 1048576 26777216
# TCP连接优化
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
# TCP拥塞控制
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
# IP转发和路由优化
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 网络安全优化
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
# IPv6优化
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
EOF
# 应用内核参数
sysctl -p /etc/sysctl.d/99-network-performance.conf
echo " ✓ 内核网络参数优化完成"
# 2. 网络接口优化
echo -e "\n2. 网络接口优化..."
for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' ' | grep -E "eth|ens|enp"); do
if ethtool $interface >/dev/null 2>&1; then
echo " 优化接口: $interface"
# 启用硬件特性
ethtool -K $interface rx on tx on sg on tso on gso on gro on lro on 2>/dev/null
# 调整环形缓冲区大小
ethtool -G $interface rx 4096 tx 4096 2>/dev/null
# 调整中断合并
ethtool -C $interface rx-usecs 50 tx-usecs 50 2>/dev/null
echo " ✓ $interface 优化完成"
fi
done
# 3. CPU亲和性优化
echo -e "\n3. CPU亲和性优化..."
# 获取CPU核心数
cpu_cores=$(nproc)
# 为网络中断分配CPU
irq_list=$(grep -E "eth|ens|enp" /proc/interrupts | cut -d: -f1 | tr -d ' ')
cpu_index=0
for irq in $irq_list; do
if [ -f "/proc/irq/$irq/smp_affinity" ]; then
cpu_mask=$((1 << cpu_index))
printf "%x" $cpu_mask > /proc/irq/$irq/smp_affinity 2>/dev/null
echo " IRQ $irq -> CPU $cpu_index"
cpu_index=$(((cpu_index + 1) % cpu_cores))
fi
done
echo " ✓ CPU亲和性优化完成"
# 4. 文件描述符优化
echo -e "\n4. 文件描述符优化..."
cat > /etc/security/limits.d/99-network.conf << 'EOF'
# 网络相关文件描述符限制
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
EOF
echo " ✓ 文件描述符限制优化完成"
# 5. 创建性能监控脚本
echo -e "\n5. 创建性能监控脚本..."
cat > /usr/local/bin/network_performance_monitor.sh << 'EOF'
#!/bin/bash
# 网络性能监控脚本
monitor_network_performance() {
echo "=== 网络性能监控 ==="
# 1. 网络接口性能
echo "1. 网络接口性能:"
for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' ' | grep -E "eth|ens|enp|bond"); do
if [ -f "/sys/class/net/$interface/statistics/rx_bytes" ]; then
# 获取初始统计
rx_bytes_before=$(cat /sys/class/net/$interface/statistics/rx_bytes)
tx_bytes_before=$(cat /sys/class/net/$interface/statistics/tx_bytes)
rx_packets_before=$(cat /sys/class/net/$interface/statistics/rx_packets)
tx_packets_before=$(cat /sys/class/net/$interface/statistics/tx_packets)
sleep 5
# 获取结束统计
rx_bytes_after=$(cat /sys/class/net/$interface/statistics/rx_bytes)
tx_bytes_after=$(cat /sys/class/net/$interface/statistics/tx_bytes)
rx_packets_after=$(cat /sys/class/net/$interface/statistics/rx_packets)
tx_packets_after=$(cat /sys/class/net/$interface/statistics/tx_packets)
# 计算速率
rx_rate=$(( (rx_bytes_after - rx_bytes_before) * 8 / 5 / 1024 / 1024 ))
tx_rate=$(( (tx_bytes_after - tx_bytes_before) * 8 / 5 / 1024 / 1024 ))
rx_pps=$(( (rx_packets_after - rx_packets_before) / 5 ))
tx_pps=$(( (tx_packets_after - tx_packets_before) / 5 ))
echo " $interface:"
echo " RX: ${rx_rate} Mbps, ${rx_pps} pps"
echo " TX: ${tx_rate} Mbps, ${tx_pps} pps"
fi
done
# 2. TCP连接统计
echo -e "\n2. TCP连接统计:"
ss -s | grep TCP
# 3. 网络缓冲区使用情况
echo -e "\n3. 网络缓冲区使用情况:"
echo " 接收缓冲区: $(cat /proc/sys/net/core/rmem_default) / $(cat /proc/sys/net/core/rmem_max)"
echo " 发送缓冲区: $(cat /proc/sys/net/core/wmem_default) / $(cat /proc/sys/net/core/wmem_max)"
# 4. 网络错误统计
echo -e "\n4. 网络错误统计:"
for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' ' | grep -E "eth|ens|enp|bond"); do
if [ -f "/sys/class/net/$interface/statistics/rx_errors" ]; then
rx_errors=$(cat /sys/class/net/$interface/statistics/rx_errors)
tx_errors=$(cat /sys/class/net/$interface/statistics/tx_errors)
rx_dropped=$(cat /sys/class/net/$interface/statistics/rx_dropped)
tx_dropped=$(cat /sys/class/net/$interface/statistics/tx_dropped)
if [ $rx_errors -gt 0 ] || [ $tx_errors -gt 0 ] || [ $rx_dropped -gt 0 ] || [ $tx_dropped -gt 0 ]; then
echo " $interface: RX错误=$rx_errors, TX错误=$tx_errors, RX丢弃=$rx_dropped, TX丢弃=$tx_dropped"
fi
fi
done
# 5. 中断统计
echo -e "\n5. 网络中断统计:"
grep -E "eth|ens|enp" /proc/interrupts | head -5
}
# 网络性能调优建议
performance_tuning_advice() {
echo "=== 网络性能调优建议 ==="
# 检查当前配置
current_congestion=$(cat /proc/sys/net/ipv4/tcp_congestion_control)
current_qdisc=$(cat /proc/sys/net/core/default_qdisc)
echo "当前配置:"
echo " TCP拥塞控制: $current_congestion"
echo " 默认队列规则: $current_qdisc"
# 提供建议
echo -e "\n优化建议:"
if [ "$current_congestion" != "bbr" ]; then
echo " 建议启用BBR拥塞控制算法以提高吞吐量"
fi
if [ "$current_qdisc" != "fq" ]; then
echo " 建议使用fq队列规则配合BBR算法"
fi
# 检查网络接口配置
for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' ' | grep -E "eth|ens|enp"); do
if ethtool $interface >/dev/null 2>&1; then
# 检查硬件特性
features=$(ethtool -k $interface 2>/dev/null)
if echo "$features" | grep -q "rx-checksumming: off"; then
echo " 建议启用 $interface 的RX校验和卸载"
fi
if echo "$features" | grep -q "tx-checksumming: off"; then
echo " 建议启用 $interface 的TX校验和卸载"
fi
if echo "$features" | grep -q "generic-segmentation-offload: off"; then
echo " 建议启用 $interface 的GSO功能"
fi
fi
done
}
case "$1" in
"monitor")
monitor_network_performance
;;
"advice")
performance_tuning_advice
;;
*)
echo "用法: $0 {monitor|advice}"
echo " monitor - 监控网络性能"
echo " advice - 提供调优建议"
;;
esac
EOF
chmod +x /usr/local/bin/network_performance_monitor.sh
echo -e "\n=== 系统级网络性能优化完成 ==="
echo "管理命令:"
echo " 性能监控: /usr/local/bin/network_performance_monitor.sh monitor"
echo " 调优建议: /usr/local/bin/network_performance_monitor.sh advice"
}
# 执行优化
optimize_network_performance
8. 总结与展望
8.1 核心知识点回顾
通过本文档的深入学习,我们系统掌握了Linux网络技术的核心要点:
技术架构层次
- 硬件层: 网卡驱动、虚拟网卡、硬件卸载
- 内核层: 网络协议栈、路由子系统、Netfilter框架
- 用户层: 网络配置工具、监控诊断、应用程序
关键技术组件
- 网络接口管理: 物理网卡、虚拟接口、绑定技术
- VLAN技术: 网络隔离、QoS、安全策略
- 路由与策略: 多路径、负载均衡、故障转移
- 防火墙安全: iptables/nftables、网络安全最佳实践
8.2 实践应用价值
企业级应用场景
- 数据中心网络: 虚拟化、容器化、微服务架构
- 云计算平台: 多租户隔离、弹性扩展、高可用设计
- 网络安全: 边界防护、流量控制、入侵检测
运维管理效益
- 自动化运维: 脚本化配置、监控告警、故障自愈
- 性能优化: 系统调优、瓶颈分析、容量规划
- 故障排查: 系统化诊断、快速定位、预防措施
8.3 技术发展趋势
新兴技术方向
- 软件定义网络(SDN): 网络虚拟化、集中控制、可编程性
- 容器网络: Kubernetes CNI、服务网格、微服务通信
- 边缘计算: 5G网络、IoT设备、实时处理
- 网络安全: 零信任架构、AI驱动防护、自适应安全
学习发展建议
- 深化理论基础: 网络协议原理、系统架构设计
- 扩展实践技能: 云原生技术、自动化工具、监控平台
- 关注行业动态: 开源项目、技术标准、最佳实践
- 培养综合能力: 问题分析、方案设计、团队协作
8.4 持续学习资源
官方文档
- Linux内核网络文档
- 各发行版网络配置指南
- 开源项目官方文档
实践平台
- 虚拟化实验环境
- 容器化测试平台
- 云服务提供商实验室
社区资源
- 技术论坛和博客
- 开源项目贡献
- 技术会议和培训
本文档为Linux网络技术的系统性学习指南,涵盖了从基础概念到高级应用的完整知识体系。通过理论学习与实践操作相结合,帮助读者建立扎实的网络技术基础,并具备解决实际问题的能力。
持续学习,不断实践,在Linux网络技术的道路上不断前进!
8. 技术对照表
| 概念 | 作用层次 | 核心功能 | 关键工具/命令 |
|---|---|---|---|
| 网卡 | 数据链路层 (L2) | 物理网络连接 | ip link, ethtool |
| 虚拟网卡 | 数据链路/网络层(L2/L3) | 逻辑网络连接、隧道、VLAN | ip link (创建veth, VLAN) |
| VLAN | 数据链路层 (L2) | 逻辑划分广播域 | ip link add link eth0 name eth0.10 type vlan id 10 |
| IP地址 | 网络层 (L3) | 逻辑寻址 | ip addr |
| 路由 | 网络层 (L3) | 路径选择 | ip route |
| 策略路由 | 网络层 (L3) | 基于策略的路径选择 | ip rule |
| 防火墙/NAT | 网络层 (L3) | 包过滤、地址转换 | iptables, nftables (下一代) |
总结
这套网络知识体系涵盖了Linux网络配置和管理的核心概念:
核心要点
- 网卡与虚拟网卡:从物理硬件到软件模拟的网络接口
- VLAN技术:实现网络逻辑分段和安全隔离
- 配置工具演进:从传统工具(ifconfig)到现代工具(ip命令族)
- 路由与策略路由:灵活的数据包路径控制
- 防火墙技术:网络安全和流量控制
关键关系
- 层次关系:从物理硬件到虚拟接口,再到配置工具
- 协作关系:各工具配合实现复杂网络功能
- 演进关系:技术工具的发展和替代
实践价值
这些技术在现代网络环境中密切配合,支撑着:
- 企业网络分段和安全隔离
- 虚拟化和容器网络
- 复杂路由和流量控制
- 网络故障排查和优化
这套知识体系为网络管理员和系统工程师提供了完整的Linux网络配置和管理能力,是现代网络基础设施的重要组成部分。