网络管理
Linux 网络排查通常按下面的顺序进行:
网卡是否启用 → IP 是否正确 → 路由是否正确 → DNS 是否正常 → 端口是否监听 → 防火墙是否放行 → 抓包确认查看网卡与 IP
ip 是 Linux 中管理网卡、IP、路由和邻居表的主要工具,通常由 iproute2 软件包提供。
查看网络状态
# 简洁显示所有网卡及其 IP
ip -br addr
# 查看网卡状态
ip link show
# 查看指定网卡的详细信息
ip addr show dev eth0
# 查看收发包、丢包和错误统计
ip -s link show dev eth0常见网卡状态:
| 状态 | 说明 |
|---|---|
UP | 网卡已启用 |
DOWN | 网卡未启用 |
LOWER_UP | 物理链路已连接 |
NO-CARRIER | 未检测到物理链路,需检查网线、交换机或虚拟网卡 |
临时配置 IP
下面的配置重启后会失效,适合临时测试:
# 启用网卡
sudo ip link set dev eth0 up
# 添加 IP 地址
sudo ip addr add 192.168.1.22/24 dev eth0
# 删除 IP 地址
sudo ip addr del 192.168.1.22/24 dev eth0执行前应将
eth0替换为实际网卡名,可通过ip -br link查看。
路由与邻居表
路由管理
# 查看路由表
ip route show
# 查看访问目标地址时实际使用的网卡、网关和源 IP
ip route get 8.8.8.8
# 添加默认路由
sudo ip route add default via 192.168.1.1 dev eth0
# 添加静态路由
sudo ip route add 10.10.0.0/16 via 192.168.1.1 dev eth0
# 删除静态路由
sudo ip route del 10.10.0.0/16 via 192.168.1.1 dev eth0不要在远程服务器上直接执行无范围限制的 ip route flush,否则可能删除 SSH 所依赖的路由。需要清理策略路由表时,应明确指定表:
sudo ip route flush table 100策略路由
# 查看策略路由规则
ip rule show
# 让指定源地址使用路由表 100
sudo ip rule add from 192.168.1.100/32 table 100
# 在路由表 100 中添加默认路由
sudo ip route add default via 192.168.1.1 dev eth0 table 100
# 删除规则
sudo ip rule del from 192.168.1.100/32 table 100ARP 与邻居表
ip neigh 同时用于查看 IPv4 ARP 缓存和 IPv6 邻居缓存。
# 查看邻居表
ip neigh show
# 查看指定网卡的邻居表
ip neigh show dev eth0
# 删除异常缓存项,后续通信会重新学习
sudo ip neigh del 192.168.1.1 dev eth0常见状态包括 REACHABLE、STALE、DELAY、FAILED。大量 FAILED 通常表示二层链路、VLAN、地址或网关配置存在问题。
查看组播信息
# 查看网卡加入的组播组
ip maddr show
# 查看组播路由缓存
ip mroute showip maddr add 管理的是链路层组播地址,不能用来让应用加入 239.0.0.0/8 这样的 IPv4 组播组。应用加入 IP 组播组通常由 Socket API 完成;组播路由则通常由 FRR 等路由软件管理。
查看端口与连接
ss 是 netstat 的常用替代工具,速度更快,也能显示连接所属进程。
| 参数 | 说明 |
|---|---|
-n | 直接显示 IP 和端口,不进行名称解析 |
-a | 显示监听和非监听 Socket |
-l | 只显示监听 Socket |
-p | 显示使用 Socket 的进程 |
-t | 显示 TCP Socket |
-u | 显示 UDP Socket |
# 查看所有监听中的 TCP、UDP 端口及所属进程
sudo ss -lntup
# 查看使用 8080 端口的 TCP 连接
sudo ss -ntp 'sport = :8080 or dport = :8080'
# 查看 TCP 连接统计
ss -s普通用户可能无法看到其他用户进程的完整信息,因此排查端口占用时通常需要
sudo。
连通性与 DNS 排查
| 目标 | 命令 | 关注点 |
|---|---|---|
| 检查本机协议栈 | ping -c 4 127.0.0.1 | 本机 TCP/IP 是否正常 |
| 检查网关 | ping -c 4 192.168.1.1 | 二层网络和默认网关是否正常 |
| 检查公网连通性 | ping -c 4 8.8.8.8 | 路由和出口是否正常 |
| 检查 DNS | dig example.com | DNS 服务器、响应码和解析结果 |
| 查看路径 | tracepath example.com | MTU 和经过的路由节点 |
| 测试 TCP 端口 | nc -vz 192.168.1.10 443 | 目标端口是否可以建立连接 |
ping 不通不一定代表服务不可用,目标主机或中间设备可能禁止 ICMP。应继续使用 nc、curl 或业务客户端验证目标端口。
下载文件
wget 常用于命令行下载文件:
| 参数 | 说明 |
|---|---|
-O <file> | 将内容保存为指定文件名 |
--limit-rate=<rate> | 限制下载速度 |
-c | 从已有文件处继续下载 |
wget -O package.tar.gz https://example.com/package.tar.gz
wget -c --limit-rate=2m https://example.com/large-file.iso主机与端口扫描
nmap 用于主机发现和端口扫描。只应扫描自己拥有或已获得明确授权的目标。
| 参数 | 说明 |
|---|---|
-sS | TCP SYN 扫描,通常需要 root 权限 |
-sT | TCP Connect 扫描,无原始报文权限时使用 |
-sn | 只进行主机发现,不扫描端口 |
-p | 指定单个端口、端口列表或端口范围 |
-n | 不进行 DNS 反向解析 |
-v | 显示更详细的扫描过程 |
# 检查网段中存活的主机
nmap -sn 192.168.1.0/24
# 扫描指定主机的常用端口
nmap -n -p 22,80,443 192.168.1.10使用 tcpdump 抓包
| 参数或表达式 | 说明 | 示例 |
|---|---|---|
-i <interface> | 指定监听网卡 | sudo tcpdump -i eth0 |
-i any | 监听所有网卡 | sudo tcpdump -i any |
-s 0 | 抓取完整数据包 | sudo tcpdump -s 0 |
-n | 不解析主机名和服务名 | sudo tcpdump -n |
-A | 以 ASCII 显示报文载荷 | sudo tcpdump -A |
-vvv | 输出更详细的报文信息 | sudo tcpdump -vvv |
-w <file> | 将数据包写入 pcap 文件 | sudo tcpdump -w capture.pcap |
-r <file> | 读取 pcap 文件 | tcpdump -r capture.pcap |
host <ip> | 过滤源地址或目标地址 | host 192.168.1.100 |
tcp port <port> | 过滤指定 TCP 端口 | tcp port 443 |
# 抓取所有网卡上的完整报文并保存
sudo tcpdump -i any -s 0 -w capture.pcap
# 从文件中读取指定主机的报文,不进行名称解析
tcpdump -r capture.pcap -n host 192.168.1.100
# 抓取与指定主机 443 端口相关的 TCP 报文
sudo tcpdump -i any -n 'host 192.168.1.100 and tcp port 443'pcap 文件可能包含账号、Token 和业务数据,应限制文件权限并在分析后妥善清理。HTTPS 报文的应用层内容通常已加密,
-A无法直接显示明文。
使用 Netplan 配置网络
Ubuntu Server 通常使用 Netplan 管理持久化网络配置,配置文件位于 /etc/netplan/。
主备 Bond
active-backup 模式提供网卡冗余,不要求交换机配置链路聚合:
network:
version: 2
renderer: networkd
ethernets:
ens65f0:
dhcp4: false
optional: true
ens65f1:
dhcp4: false
optional: true
bonds:
bond0:
interfaces: [ens65f0, ens65f1]
parameters:
mode: active-backup
mii-monitor-interval: 100
addresses:
- 172.29.101.173/24
routes:
- to: default
via: 172.29.101.1
nameservers:
addresses:
- 10.255.255.88
- 10.255.254.88LACP Bond
802.3ad 模式需要交换机端口预先配置到同一个 LACP 聚合组:
network:
version: 2
renderer: networkd
ethernets:
ens5f0:
dhcp4: false
ens5f1:
dhcp4: false
bonds:
bond0:
interfaces: [ens5f0, ens5f1]
parameters:
mode: 802.3ad
mii-monitor-interval: 100
lacp-rate: fast
mtu: 1500
addresses:
- 172.16.4.100/25
routes:
- to: default
via: 172.16.4.126
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4常见 Bond 模式
| 模式 | 名称 | 交换机要求 | 负载均衡 | 典型场景 |
|---|---|---|---|---|
0 | balance-rr | 通常需要静态链路聚合 | 包级 | 对吞吐要求高且网络设备已正确配置 |
1 | active-backup | 无特殊要求 | 不支持 | 以稳定和故障切换为主的服务器 |
2 | balance-xor | 通常需要静态链路聚合 | 流级 | 不使用 LACP 的静态聚合环境 |
3 | broadcast | 取决于网络设计 | 不支持 | 对报文冗余有特殊要求的场景 |
4 | 802.3ad | 必须支持并配置 LACP | 流级 | 企业机房、虚拟化和数据库服务器 |
5 | balance-tlb | 无特殊要求 | 发送方向 | 发送流量较大的场景 |
6 | balance-alb | 无特殊要求 | 收发方向 | 交换机不支持 LACP 的场景 |
单条 TCP 流通常只会使用一条物理链路,Bond 总带宽提升主要体现在多条并发流量上。
验证并应用配置
修改远程服务器网络前,应确保有带外管理或控制台可用于恢复:
# 检查生成的后端配置
sudo netplan generate
# 限时试用,未确认时自动回滚
sudo netplan try
# 确认无误后应用
sudo netplan apply
# 查看 Bond 运行状态
cat /proc/net/bonding/bond0防火墙
firewalld
# 永久放行 TCP 6443 端口
sudo firewall-cmd --add-port=6443/tcp --permanent
# 重新加载永久配置
sudo firewall-cmd --reload
# 查看当前区域及其规则
sudo firewall-cmd --list-alliptables
# 查看规则、命中计数和规则序号
sudo iptables -L INPUT -n -v --line-numbers
# 将放行规则插入 INPUT 链首部
sudo iptables -I INPUT 1 -p tcp --dport 6443 -j ACCEPT
# 删除相同的规则
sudo iptables -D INPUT -p tcp --dport 6443 -j ACCEPTiptables 命令修改的通常只是当前内存中的规则,重启后是否保留取决于发行版的持久化机制。使用 Docker 时,发布端口的流量不一定经过普通的 INPUT 链;需要限制容器流量时,应重点检查 DOCKER-USER 链:
sudo iptables -L DOCKER-USER -n -v --line-numbers较新的发行版可能由 nftables 后端实现 iptables 兼容命令,可通过下面的命令确认:
iptables --version常用排查清单
# 1. 网卡与 IP
ip -br addr
# 2. 默认路由与实际选路
ip route show
ip route get 8.8.8.8
# 3. DNS
cat /etc/resolv.conf
dig example.com
# 4. 监听端口
sudo ss -lntup
# 5. 防火墙
sudo firewall-cmd --list-all
sudo iptables -L -n -v
# 6. 抓包
sudo tcpdump -i any -n 'host 192.168.1.100 and tcp port 443'