Linux 高级网络配置
大约 19 分钟约 5585 字
Linux 高级网络配置
简介
Linux 操作系统以其强大的网络功能闻名于世,从 Web 服务器到路由器、从容器网络到 SDN(软件定义网络),Linux 内核提供了丰富的网络功能。高级网络配置涉及 VLAN、网桥、网络命名空间、高级防火墙规则、策略路由、隧道技术、网卡绑定等核心技术,这些技术是构建现代云基础设施、容器编排平台和复杂网络架构的基础。
掌握 Linux 高级网络配置,对于运维工程师、网络工程师和云原生开发者都至关重要。本文将系统性地介绍这些技术的原理和实操方法。
特点
- 内核级实现:网络功能直接在 Linux 内核中实现,性能优异
- 高度可编程:通过 iproute2、nftables 等工具完全控制网络行为
- 命名空间隔离:网络命名空间提供轻量级的网络虚拟化
- 丰富的隧道协议:支持 GRE、IPsec、VXLAN 等多种隧道技术
- 灵活的路由策略:基于源地址、标记、命名空间的多维度路由
- 高性能优化:SR-IOV、DPDK 等技术实现接近线速的网络性能
实现
VLAN 配置
VLAN(Virtual Local Area Network)通过 802.1Q 标签在物理网络上划分逻辑网络。
使用 ip 命令配置 VLAN
# 加载 802.1Q 模块
sudo modprobe 8021q
echo "8021q" | sudo tee -a /etc/modules-load.d/vlan.conf
# 在物理网卡 eth0 上创建 VLAN 子接口
# VLAN ID 100
sudo ip link add link eth0 name eth0.100 type vlan id 100
sudo ip addr add 192.168.100.1/24 dev eth0.100
sudo ip link set eth0.100 up
# VLAN ID 200
sudo ip link add link eth0 name eth0.200 type vlan id 200
sudo ip addr add 192.168.200.1/24 dev eth0.200
sudo ip link set eth0.200 up
# 查看 VLAN 配置
ip -d link show eth0.100
# 删除 VLAN 接口
sudo ip link delete eth0.100使用 NetworkManager 持久化 VLAN
# 使用 nmcli 创建 VLAN 连接
sudo nmcli connection add type vlan \
con-name vlan100 \
dev eth0 \
id 100 \
ip4 192.168.100.1/24 \
ipv4.method manual
sudo nmcli connection add type vlan \
con-name vlan200 \
dev eth0 \
id 200 \
ip4 192.168.200.1/24 \
ipv4.method manual
# 激活连接
sudo nmcli connection up vlan100
sudo nmcli connection up vlan200
# 查看 VLAN 连接
nmcli connection show | grep vlanVLAN 网络配置文件
# /etc/sysconfig/network-scripts/ifcfg-eth0.100
DEVICE=eth0.100
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.100.1
PREFIX=24
VLAN=yes
PHYSDEV=eth0
# /etc/sysconfig/network-scripts/ifcfg-eth0.200
DEVICE=eth0.200
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.200.1
PREFIX=24
VLAN=yes
PHYSDEV=eth0网络桥接(Bridge)
网桥工作在数据链路层,用于连接多个网络段,常用于虚拟化和容器网络。
基础桥接配置
# 创建网桥
sudo ip link add name br0 type bridge
sudo ip link set br0 up
# 将物理网卡加入网桥
sudo ip link set eth0 master br0
# 为网桥配置 IP 地址
sudo ip addr add 192.168.1.100/24 dev br0
# 移除物理网卡的 IP 地址(已由网桥接管)
sudo ip addr flush dev eth0
# 添加默认路由
sudo ip route add default via 192.168.1.1 dev br0
# 查看网桥信息
bridge link show
bridge fdb show
# 从网桥中移除接口
sudo ip link set eth0 nomaster
# 删除网桥
sudo ip link delete br0使用 nmcli 配置网桥
# 创建网桥连接
sudo nmcli connection add type bridge \
con-name br0 \
ifname br0 \
ip4 192.168.1.100/24 \
gw4 192.168.1.1 \
ipv4.method manual
# 将物理网卡绑定到网桥
sudo nmcli connection add type bridge-slave \
con-name br0-slave-eth0 \
ifname eth0 \
master br0
# 激活网桥
sudo nmcli connection up br0
# 查看网桥状态
nmcli device show br0STP(生成树协议)配置
# 启用 STP(防止环路)
sudo ip link set br0 type bridge stp_state 1
# 设置 STP 优先级
sudo ip link set br0 type bridge priority 32768
# 设置端口优先级
sudo ip link set eth0 type bridge_slave priority 128
# 设置端口成本
sudo ip link set eth0 type bridge_slave cost 100
# 查看 STP 状态
bridge link show
cat /sys/class/net/br0/bridge/stp_state网络命名空间(Network Namespace)
网络命名空间是 Linux 网络虚拟化的核心,每个命名空间拥有独立的网络栈。
基础命名空间操作
# 创建网络命名空间
sudo ip netns add ns1
sudo ip netns add ns2
# 列出所有命名空间
ip netns list
# 在命名空间中执行命令
sudo ip netns exec ns1 ip link show
sudo ip netns exec ns1 bash # 进入命名空间的 shell
# 创建 veth pair(虚拟网卡对)
sudo ip link add veth-ns1 type veth peer name veth-ns2
# 将 veth 分别放入两个命名空间
sudo ip link set veth-ns1 netns ns1
sudo ip link set veth-ns2 netns ns2
# 配置命名空间内的网络
sudo ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth-ns1
sudo ip netns exec ns1 ip link set veth-ns1 up
sudo ip netns exec ns1 ip link set lo up
sudo ip netns exec ns2 ip addr add 10.0.0.2/24 dev veth-ns2
sudo ip netns exec ns2 ip link set veth-ns2 up
sudo ip netns exec ns2 ip link set lo up
# 测试连通性
sudo ip netns exec ns1 ping -c 3 10.0.0.2
# 删除命名空间
sudo ip netns delete ns1
sudo ip netns delete ns2命名空间与网桥组网
# 创建网桥连接多个命名空间
sudo ip link add br-test type bridge
sudo ip link set br-test up
sudo ip addr add 10.0.0.254/24 dev br-test
# 创建 3 个命名空间并连接到网桥
for i in 1 2 3; do
sudo ip netns add ns$i
sudo ip link add veth$i type veth peer name veth$i-br
sudo ip link set veth$i netns ns$i
sudo ip link set veth$i-br master br-test
sudo ip netns exec ns$i ip addr add 10.0.0.$i/24 dev veth$i
sudo ip netns exec ns$i ip link set veth$i up
sudo ip netns exec ns$i ip link set lo up
sudo ip link set veth$i-br up
done
# 为命名空间配置默认路由(通过网桥访问外部)
for i in 1 2 3; do
sudo ip netns exec ns$i ip route add default via 10.0.0.254
done
# 启用 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
# 配置 NAT(允许命名空间访问外网)
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE命名空间管理脚本
#!/bin/bash
# netns-manager.sh - 网络命名空间管理工具
create_ns() {
local name=$1
local subnet=$2
local bridge=$3
ip netns add "$name"
ip link add "veth-${name}" type veth peer name "veth-${name}-br"
ip link set "veth-${name}" netns "$name"
ip link set "veth-${name}-br" master "$bridge"
ip link set "veth-${name}-br" up
ip netns exec "$name" ip addr add "$subnet" dev "veth-${name}"
ip netns exec "$name" ip link set "veth-${name}" up
ip netns exec "$name" ip link set lo up
}
delete_ns() {
local name=$1
ip link delete "veth-${name}-br" 2>/dev/null
ip netns delete "$name"
}
case "$1" in
create)
create_ns "$2" "$3" "$4"
;;
delete)
delete_ns "$2"
;;
list)
ip netns list
;;
exec)
ip netns exec "$2" "${@:3}"
;;
*)
echo "用法: $0 {create|delete|list|exec} [参数...]"
;;
esac高级 iptables(NAT、DNAT、SNAT)
NAT 概述
# 查看 NAT 规则
sudo iptables -t nat -L -n -v
# 启用 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-forwarding.confSNAT(源地址转换)
# SNAT:将内网源地址转换为公网地址
# 场景:内网主机通过 Linux 网关访问互联网
sudo iptables -t nat -A POSTROUTING \
-s 192.168.1.0/24 \
-o eth0 \
-j SNAT --to-source 203.0.113.10
# MASQUERADE:动态 SNAT(适用于动态 IP)
sudo iptables -t nat -A POSTROUTING \
-s 192.168.1.0/24 \
-o ppp0 \
-j MASQUERADE
# 针对特定端口的 SNAT
sudo iptables -t nat -A POSTROUTING \
-s 192.168.1.0/24 \
-p tcp --dport 80 \
-j MASQUERADEDNAT(目标地址转换)
# DNAT:将外部访问转发到内网服务器
# 场景:将公网 80 端口的请求转发到内网 Web 服务器
sudo iptables -t nat -A PREROUTING \
-d 203.0.113.10 \
-p tcp --dport 80 \
-j DNAT --to-destination 192.168.1.100:80
# 端口转发:外部 8080 转发到内网 80
sudo iptables -t nat -A PREROUTING \
-d 203.0.113.10 \
-p tcp --dport 8080 \
-j DNAT --to-destination 192.168.1.100:80
# 本地端口重定向(REDIRECT)
sudo iptables -t nat -A PREROUTING \
-p tcp --dport 80 \
-j REDIRECT --to-port 8080
# 范围端口转发
sudo iptables -t nat -A PREROUTING \
-d 203.0.113.10 \
-p tcp --dport 2000:2100 \
-j DNAT --to-destination 192.168.1.100:2000-2100完整的网关防火墙配置
#!/bin/bash
# gateway-firewall.sh - 网关防火墙脚本
# 变量定义
WAN_IF="eth0"
LAN_IF="eth1"
WAN_IP="203.0.113.10"
LAN_NET="192.168.1.0/24"
# 清空规则
iptables -F
iptables -t nat -F
iptables -X
# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许回环接口
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立和相关的连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许内网到外网的流量
iptables -A FORWARD -i $LAN_IF -o $WAN_IF -s $LAN_NET -j ACCEPT
# 允许外部访问内网 Web 服务器(DNAT)
iptables -t nat -A PREROUTING -d $WAN_IP -p tcp --dport 80 \
-j DNAT --to-destination 192.168.1.100:80
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT
# 允许外部访问内网 SSH(DNAT)
iptables -t nat -A PREROUTING -d $WAN_IP -p tcp --dport 2222 \
-j DNAT --to-destination 192.168.1.100:22
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 22 -j ACCEPT
# 内网 NAT 上网(MASQUERADE)
iptables -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j MASQUERADE
# 允许网关自身的 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 ICMP(ping)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT
# 记录被丢弃的包
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4iproute2 高级路由
iproute2 是 Linux 的现代网络配置工具套件,替代了传统的 net-tools。
路由表管理
# 查看路由表
ip route show
ip route show table main
ip route show table local
# 添加静态路由
sudo ip route add 10.10.0.0/16 via 192.168.1.1 dev eth0
# 添加默认路由
sudo ip route add default via 192.168.1.1 dev eth0
# 添加多路径路由(ECMP)
sudo ip route add 10.10.0.0/16 \
nexthop via 192.168.1.1 dev eth0 weight 1 \
nexthop via 192.168.1.2 dev eth1 weight 1
# 删除路由
sudo ip route del 10.10.0.0/16
# 替换路由(不存在则添加)
sudo ip route replace 10.10.0.0/16 via 192.168.1.2 dev eth0
# 查看路由缓存
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多路由表
# /etc/iproute2/rt_tables 定义路由表
# 格式: <优先级> <表名>
echo "100 isp1" | sudo tee -a /etc/iproute2/rt_tables
echo "200 isp2" | sudo tee -a /etc/iproute2/rt_tables
echo "300 vpn" | sudo tee -a /etc/iproute2/rt_tables
# 查看所有路由表
ip route show table all
# 在自定义表中添加路由
sudo ip route add default via 203.0.113.1 dev eth0 table isp1
sudo ip route add default via 198.51.100.1 dev eth1 table isp2
sudo ip route add 10.0.0.0/8 via 172.16.0.1 dev tun0 table vpn策略路由
策略路由(Policy Routing)允许根据多种条件选择不同的路由表。
基于源地址的策略路由
# 双 ISP 策略路由
# ISP1: eth0, 203.0.113.10, 网关 203.0.113.1
# ISP2: eth1, 198.51.100.10, 网关 198.51.100.1
# 配置各 ISP 的路由表
sudo ip route add default via 203.0.113.1 dev eth0 table isp1
sudo ip route add default via 198.51.100.1 dev eth1 table isp2
# 确保本机回包走正确的接口
sudo ip route add 203.0.113.0/24 dev eth0 table isp1
sudo ip route add 198.51.100.0/24 dev eth1 table isp2
# 策略规则:根据源地址选择路由表
sudo ip rule add from 203.0.113.10 table isp1
sudo ip rule add from 198.51.100.10 table isp2
# 查看策略规则
ip rule show
# 测试
ip route get 8.8.8.8 from 203.0.113.10
ip route get 8.8.8.8 from 198.51.100.10基于标记的策略路由
# 使用 fwmark 标记数据包
sudo iptables -t mangle -A PREROUTING \
-p tcp --dport 80 -j MARK --set-mark 100
sudo iptables -t mangle -A PREROUTING \
-p tcp --dport 443 -j MARK --set-mark 200
# 基于标记的策略路由
sudo ip rule add fwmark 100 table isp1
sudo ip rule add fwmark 200 table isp2
# 清除标记规则
sudo ip rule del fwmark 100 table isp1基于网络命名空间的策略路由
# 为特定命名空间使用不同的路由
sudo ip rule add iif veth-ns1 table vpn
sudo ip rule add oif veth-ns1 table vpn隧道技术
GRE 隧道
# GRE 隧道:连接两个远程网络
# 本地: 203.0.113.10, 远程: 198.51.100.10
# 创建 GRE 隧道
sudo ip tunnel add gre1 mode gre \
local 203.0.113.10 \
remote 198.51.100.10 \
ttl 64
# 配置隧道接口
sudo ip addr add 10.0.0.1/30 dev gre1
sudo ip link set gre1 up
# 对端配置
# sudo ip tunnel add gre1 mode gre \
# local 198.51.100.10 \
# remote 203.0.113.10 \
# ttl 64
# sudo ip addr add 10.0.0.2/30 dev gre1
# sudo ip link set gre1 up
# 通过 GRE 隧道路由到远程内网
sudo ip route add 172.16.0.0/16 dev gre1
# 验证隧道
ping 10.0.0.2
# 查看 GRE 隧道信息
ip tunnel show gre1
# 删除隧道
sudo ip tunnel del gre1IPsec 隧道
# 使用 strongSwan 配置 IPsec VPN
sudo yum install -y strongswan
# 配置 IPsec 预共享密钥
# /etc/strongswan/ipsec.secrets
# : PSK "your_pre_shared_key"
# 配置 IPsec 连接
# /etc/strongswan/ipsec.conf
# conn site-to-site
# left=203.0.113.10
# leftsubnet=192.168.1.0/24
# right=198.51.100.10
# rightsubnet=172.16.0.0/16
# authby=secret
# keyexchange=ikev2
# ike=aes256-sha256-modp2048
# esp=aes256-sha256
# auto=start
# 启动 strongSwan
sudo systemctl enable strongswan
sudo systemctl start strongswan
# 查看 IPsec 状态
sudo strongswan status
sudo strongswan statusallVXLAN 隧道
# VXLAN:用于容器和虚拟机覆盖网络
sudo ip link add vxlan0 type vxlan \
id 100 \
local 203.0.113.10 \
remote 198.51.100.10 \
dev eth0 \
dstport 4789
sudo ip addr add 10.1.0.1/24 dev vxlan0
sudo ip link set vxlan0 up
# 多播模式 VXLAN
sudo ip link add vxlan1 type vxlan \
id 200 \
local 203.0.113.10 \
group 239.0.0.1 \
dev eth0 \
dstport 4789
sudo ip link set vxlan1 up网卡绑定(Bonding)
网卡绑定将多个物理网卡组合为一个逻辑接口,提供冗余和负载均衡。
Bonding 模式
模式 0 (balance-rr):轮询负载均衡
模式 1 (active-backup):主备冗余(推荐)
模式 2 (balance-xor):基于 XOR 的负载均衡
模式 3 (broadcast):广播(所有接口发送相同数据)
模式 4 (802.3ad):LACP 动态链路聚合(需要交换机支持)
模式 5 (balance-tlb):自适应发送负载均衡
模式 6 (balance-alb):自适应负载均衡配置 Bonding
# 加载 bonding 模块
sudo modprobe bonding
echo "bonding" | sudo tee -a /etc/modules-load.d/bonding.conf
# 使用 ip 命令配置 bonding
sudo ip link add bond0 type bond mode 802.3ad
sudo ip link set eth0 master bond0
sudo ip link set eth1 master bond0
sudo ip addr add 192.168.1.100/24 dev bond0
sudo ip link set bond0 up
# 配置 bonding 参数
sudo ip link set bond0 type bond miimon 100
sudo ip link set bond0 type bond lacp_rate 1
# 查看 bonding 状态
cat /proc/net/bonding/bond0使用 nmcli 配置持久化 Bonding
# 创建 bond 连接
sudo nmcli connection add type bond \
con-name bond0 \
ifname bond0 \
mode 802.3ad \
miimon 100 \
ip4 192.168.1.100/24 \
gw4 192.168.1.1
# 添加从属接口
sudo nmcli connection add type bond-slave \
con-name bond0-slave-eth0 \
ifname eth0 \
master bond0
sudo nmcli connection add type bond-slave \
con-name bond0-slave-eth1 \
ifname eth1 \
master bond0
# 激活
sudo nmcli connection up bond0-slave-eth0
sudo nmcli connection up bond0-slave-eth1
sudo nmcli connection up bond0SR-IOV 配置
SR-IOV(Single Root I/O Virtualization)允许一个物理网卡虚拟出多个虚拟功能(VF)。
# 检查网卡是否支持 SR-IOV
lspci -vvs | grep -i sr-iov
# 查看当前 VF 数量
cat /sys/class/net/eth0/device/sriov_numvfs
# 启用 VF(例如创建 4 个虚拟功能)
echo 4 | sudo tee /sys/class/net/eth0/device/sriov_numvfs
# 查看创建的 VF
lspci | grep Ethernet
ip link show eth0
# 设置 VF 的 MAC 地址
sudo ip link set eth0 vf 0 mac 00:11:22:33:44:55
sudo ip link set eth0 vf 1 mac 00:11:22:33:44:56
# 设置 VF 的 VLAN
sudo ip link set eth0 vf 0 vlan 100
# 设置 VF 的速率限制(Mbps)
sudo ip link set eth0 vf 0 max_tx_rate 100
sudo ip link set eth0 vf 0 min_tx_rate 10
# 将 VF 分配给虚拟机(libvirt)
# virsh attach-interface domain --type pci \
# --source virtfn0 --persistent
# 持久化 SR-IOV 配置
echo "options igb max_vfs=4" | sudo tee /etc/modprobe.d/igb.conf网络故障排查工具集
连通性诊断
# 基础连通性测试
ping -c 4 8.8.8.8
ping -c 4 example.com
# 路由追踪
traceroute 8.8.8.8
mtr --report 8.8.8.8 # 更好的 traceroute 替代品
# MTR(持续追踪路由质量)
mtr --report-wide --report-cycles 50 8.8.8.8
# DNS 诊断
dig example.com
dig @8.8.8.8 example.com
nslookup example.com
host example.com
# TCP 连接测试
nc -zv 192.168.1.100 80
nc -zv 192.168.1.100 443
# HTTP 请求测试
curl -v http://example.com
curl -o /dev/null -w "HTTP Code: %{http_code}\nTime: %{time_total}s\n" \
http://example.com网络抓包
# tcpdump 基础抓包
sudo tcpdump -i eth0
sudo tcpdump -i eth0 -c 100 # 抓 100 个包
sudo tcpdump -i eth0 -w capture.pcap # 保存到文件
# 按条件过滤
sudo tcpdump -i eth0 host 192.168.1.100
sudo tcpdump -i eth0 port 80
sudo tcpdump -i eth0 tcp port 443
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0' # 只抓 SYN 包
# 抓取 VLAN 标签流量
sudo tcpdump -i eth0 -e vlan
# 抓取 GRE 隧道流量
sudo tcpdump -i gre1
# 按包大小过滤
sudo tcpdump -i eth0 greater 1000 # 大于 1000 字节
sudo tcpdump -i eth0 less 100 # 小于 100 字节
# 显示 ASCII 内容
sudo tcpdump -i eth0 -A port 80网络统计
# 接口统计
ip -s link show eth0
cat /proc/net/dev
# 路由缓存统计
ip -s route show
# 连接统计
ss -s # 摘要
ss -tuln # 监听端口
ss -tunp # 带进程信息
ss -t state established # 已建立的连接
ss -t state time-wait # TIME_WAIT 连接
# 网络连接按状态统计
ss -t | awk '{print $1}' | sort | uniq -c | sort -rn
# iptables 规则命中计数
sudo iptables -L -n -v
# conntrack 连接跟踪
sudo conntrack -L
sudo conntrack -C # 连接计数
sudo conntrack -S # 统计信息网络性能调优
内核参数优化
# /etc/sysctl.d/99-network-tuning.conf
# TCP 缓冲区大小(单位:字节)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# TCP 连接队列
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# TCP 超时优化
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
# TCP 拥塞控制
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
# 允许更多的 TIME_WAIT 连接
net.ipv4.tcp_max_tw_buckets = 65535
# 增加本地端口范围
net.ipv4.ip_local_port_range = 1024 65535
# SYN Cookie(防止 SYN Flood 攻击)
net.ipv4.tcp_syncookies = 1
# 应用配置
sudo sysctl -p /etc/sysctl.d/99-network-tuning.conf网卡中断优化
# 查看网卡中断分布
cat /proc/interrupts | grep eth0
# 设置 IRQ 亲和性(将中断分配到不同 CPU)
# 启用 RPS(Receive Packet Steering)
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus
# 启用 XPS(Transmit Packet Steering)
echo f > /sys/class/net/eth0/queues/tx-0/xps_cpus
# 调整网卡 Ring Buffer
ethtool -g eth0 # 查看当前值
ethtool -G eth0 rx 4096 tx 4096 # 设置 Ring Buffer
# 启用网卡 offload 功能
ethtool -K eth0 gro on # Generic Receive Offload
ethtool -K eth0 gso on # Generic Segmentation Offload
ethtool -K eth0 tso on # TCP Segmentation Offload
ethtool -K eth0 lro off # Large Receive Offload(通常关闭)
# 网卡速率和双工设置
ethtool -s eth0 speed 1000 duplex full autoneg off使用 iperf3 测试网络带宽
# 安装
sudo yum install -y iperf3
# 服务端
iperf3 -s -p 5201
# 客户端 - TCP 测试
iperf3 -c server_ip -p 5201 -t 30 -P 4
# UDP 测试
iperf3 -c server_ip -p 5201 -u -b 1G -t 30
# 双向测试
iperf3 -c server_ip -p 5201 -t 30 -R
# JSON 格式输出
iperf3 -c server_ip -p 5201 -Jnftables 替代 iptables
# nftables 是 iptables 的现代替代品
# 查看当前规则集
sudo nft list ruleset
# 创建表和链
sudo nft add table inet firewall
sudo nft add chain inet firewall input \
'{ type filter hook input priority 0 ; policy drop ; }'
sudo nft add chain inet firewall forward \
'{ type filter hook forward priority 0 ; policy drop ; }'
# 添加规则
sudo nft add rule inet firewall input \
iif lo accept
sudo nft add rule inet firewall input \
ct state established,related accept
sudo nft add rule inet firewall input \
tcp dport { 22, 80, 443 } accept
sudo nft add rule inet firewall input \
icmp type echo-request accept
# NAT 规则
sudo nft add table ip nat
sudo nft add chain ip nat prerouting \
'{ type nat hook prerouting priority -100 ; }'
sudo nft add chain ip nat postrouting \
'{ type nat hook postrouting priority 100 ; }'
sudo nft add rule ip nat postrouting \
oifname "eth0" masquerade
# 保存规则
sudo nft list ruleset | sudo tee /etc/nftables/firewall.nft
# 从文件加载规则
sudo nft -f /etc/nftables/firewall.nft优点
- 灵活性强:内核级网络功能支持各种复杂拓扑
- 性能优异:零拷贝、offload 等技术提供高性能网络
- 标准化:802.1Q、802.3ad、IPsec 等标准协议支持
- 可编程性:通过脚本和工具完全自动化网络配置
- 虚拟化支持:命名空间、VXLAN 等技术支撑云原生网络
缺点
- 学习曲线陡峭:命令繁多,参数复杂
- 配置易出错:网络配置错误可能导致断网
- 版本差异:不同发行版和内核版本的命令可能有差异
- 持久化复杂:临时配置和永久配置需要不同的方法
- 调试困难:多层网络叠加后问题定位困难
性能注意事项
- Ring Buffer 大小:高速网络下增大 Ring Buffer 减少丢包
- 中断亲和性:多队列网卡正确分配 CPU 处理中断
- TCP 调优:缓冲区大小、拥塞控制算法选择
- Offload 功能:利用网卡的 TSO/GRO/GSO 减少 CPU 开销
- 连接跟踪:conntrack 表大小影响 NAT 性能
- MTU 设置:隧道场景注意 MTU 调整避免分片
总结
Linux 高级网络配置是运维和云计算领域的核心技能。VLAN 和网桥提供二层隔离和交换能力,网络命名空间提供轻量级网络虚拟化,iptables/nftables 提供强大的包过滤和 NAT 能力,iproute2 和策略路由提供灵活的路由控制,隧道技术实现跨网络互联,Bonding 和 SR-IOV 提供高可靠性和高性能网络。掌握这些技术的组合使用,能够应对从简单网关到复杂 SDN 的各种网络需求。
关键知识点
- VLAN 802.1Q:在物理网络上划分逻辑隔离网络
- 网桥:二层设备,连接多个网络段,STP 防止环路
- 网络命名空间:独立的网络栈,容器网络的基础
- iptables 五链四表:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
- 策略路由:根据源地址、标记等多条件选择路由表
- Bonding 模式:mode 1(主备)最常用,mode 4(LACP)需要交换机支持
常见误区
- 忘记启用 IP 转发:Linux 默认不转发 IP 包
- iptables 规则顺序错误:规则从上到下匹配,顺序很重要
- MTU 不匹配:隧道/VXLAN 场景需要调低 MTU
- 配置未持久化:ip 命令的配置重启后丢失
- 忽略 conntrack 表满:高并发 NAT 场景需要调大 conntrack 表
- Bonding 模式选择错误:不是所有模式都提供冗余
进阶路线
- eBPF/XDP:内核可编程网络,实现高性能包处理
- DPDK:用户态网络,绕过内核协议栈
- Cilium:基于 eBPF 的 Kubernetes CNI
- Open vSwitch:生产级虚拟交换机
- 自动化网络:Ansible 网络模块、Netplan
- SDN 控制器:ONOS、OpenDaylight
适用场景
- 企业网关:NAT、防火墙、多 ISP 策略路由
- 虚拟化平台:网桥、VLAN、SR-IOV
- 容器网络:命名空间、VXLAN、路由
- VPN 网关:IPsec、GRE 隧道
- 负载均衡:LVS、IPVS
- 网络故障排查:tcpdump、ss、mtr
落地建议
- 配置管理:使用 Ansible 或脚本管理网络配置
- 变更管理:网络变更前备份当前配置
- 监控告警:监控网络流量、丢包率、连接数
- 文档化:记录网络拓扑、IP 分配、路由策略
- 测试环境:先在测试环境验证,再应用到生产
- 回滚方案:每次变更都应有回滚计划
#!/bin/bash
# 网络配置备份脚本
BACKUP_DIR="/var/backups/network/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
ip addr show > "$BACKUP_DIR/ip_addr"
ip route show > "$BACKUP_DIR/ip_route"
ip rule show > "$BACKUP_DIR/ip_rule"
ip link show > "$BACKUP_DIR/ip_link"
iptables-save > "$BACKUP_DIR/iptables"
ip netns list > "$BACKUP_DIR/netns_list"
bridge fdb show > "$BACKUP_DIR/bridge_fdb"
cat /proc/net/bonding/* > "$BACKUP_DIR/bonding_status" 2>/dev/null
cp -r /etc/sysconfig/network-scripts/ "$BACKUP_DIR/ifcfg/"
sysctl -a 2>/dev/null | grep net. > "$BACKUP_DIR/sysctl_net"
echo "网络配置已备份到 $BACKUP_DIR"排错清单
复盘问题
- 你的网络配置是否使用了版本控制?
- 关键网络设备是否有冗余方案?
- 网络变更是否有自动化回滚机制?
- 网络监控覆盖了哪些关键指标?
- 安全策略是否覆盖了所有入口点?
- 多租户/多环境的网络隔离方案是什么?
