来源:马哥Linux运维 | 发布日期:2026-05-31
网络基础必知必会
排查网络故障的核心逻辑: 先打通物理层 → 数据链路层 → 网络层 → 传输层 → 应用层,逐层递进。搞清楚 IP、掩码、网关、路由、DNS、防火墙这几个概念,80% 的网络问题能在 5 分钟内定位。
一、IP 地址基础
二进制转换
IP 地址是 32 位二进制数,点分十进制表示。
192.168.1.1 = 11000000.10101000.00000001.00000001
速算口诀: 记住 2 的幂次方:128·64·32·16·8·4·2·1。
192 = 128+64,168 = 128+32+8,255 = 全部加起来。
私有地址(RFC 1918,内网自由使用)
| 网段 | 范围 | 用途 |
|---|---|---|
| 10.0.0.0/8 | 10.0.0.0 - 10.255.255.255 | 大型内网 / VPC |
| 172.16.0.0/12 | 172.16.0.0 - 172.31.255.255 | 中型内网 |
| 192.168.0.0/16 | 192.168.0.0 - 192.168.255.255 | 小型内网 / 家庭 |
云服务器、容器网络、虚拟机默认都用私有地址。
特殊 IP
| 地址 | 含义 |
|---|---|
127.0.0.1 |
回环地址,不走网卡 |
0.0.0.0/0 |
任意地址 |
169.254.0.0/16 |
DHCP 获取失败时自动分配 |
192.168.1.0 |
网络地址(代表整个网段) |
192.168.1.255 |
广播地址 |
二、子网掩码与 CIDR
核心原理
子网掩码 32 位中 1=网络位,0=主机位。
255.255.255.0 = 11111111.11111111.11111111.00000000 → /24
192.168.1.100 & 255.255.255.0 = 192.168.1.0(网络地址)
判断两台机器是否同网段: IP 分别与掩码做 AND 运算,结果相同即同网段。
常用 CIDR 速查
/30 → 255.255.255.252 2 可用(点对点链路)
/29 → 255.255.255.248 6 可用
/28 → 255.255.255.240 14 可用
/27 → 255.255.255.224 30 可用
/26 → 255.255.255.192 62 可用
/25 → 255.255.255.128 126 可用
/24 → 255.255.255.0 254 可用 ← 最常用
/23 → 255.255.254.0 510 可用
/22 → 255.255.252.0 1022 可用
/16 → 255.255.0.0 65534 可用
计算公式: 可用主机数 = 2^(32 - CIDR) - 2(减去网络地址和广播地址)
子网划分实战
192.168.0.0/24 划分给 4 个部门(每个 /26,64 地址):
| 部门 | 网段 | 可用范围 | 广播 |
|---|---|---|---|
| A | 192.168.0.0/26 | .1 - .62 | .63 |
| B | 192.168.0.64/26 | .65 - .126 | .127 |
| C | 192.168.0.128/26 | .129 - .190 | .191 |
| D | 192.168.0.192/26 | .193 - .254 | .255 |
验证工具: ipcalc 192.168.0.0/26 → 输出 Address/Netmask/Network/HostMin/HostMax/Broadcast。
# 批量子网划分:192.168.0.0/24 均分成 4 个 /26
ipcalc 192.168.0.0/24 -s 64 64 64 64
同网段判断(Python):
def same_subnet(ip1, ip2, cidr):
mask = (0xFFFFFFFF >> (32-cidr)) << (32-cidr)
i1 = sum(int(x) << (8*(3-i)) for i, x in enumerate(ip1.split('.')))
i2 = sum(int(x) << (8*(3-i)) for i, x in enumerate(ip2.split('.')))
return (i1 & mask) == (i2 & mask)
print(same_subnet("192.168.1.100", "192.168.1.200", 24)) # True
print(same_subnet("192.168.1.100", "192.168.2.100", 24)) # False
三、默认网关
作用: 跨网段通信转发。同网段直接通信,不同网段必须通过网关。
# 查看网关
ip route show
# default via 192.168.1.1 dev eth0 ← 默认网关
# 192.168.1.0/24 dev eth0 ← 直连网段
# 添加/删除默认网关
ip route add default via 192.168.1.1 dev eth0
ip route del default via 192.168.1.1
# 查看网关 MAC 地址
arp 192.168.1.1
云环境: VPC 子网的网关由云平台统一管理,通常是网段第一个 IP(如 192.168.1.1)。
四、VLAN 虚拟局域网
作用
一个物理交换机上划分多个 VLAN 实现广播域隔离。不同 VLAN 无法直接通信,需三层路由。
Linux 配置
modprobe 8021q
ip link add link eth0 name eth0.100 type vlan id 100
ip addr add 192.168.1.10/24 dev eth0.100
ip link set eth0.100 up
交换机端口模式
| 模式 | 用途 | 特点 |
|---|---|---|
| Access | 连接服务器/PC | 单 VLAN,帧不带 tag |
| Trunk | 交换机互联 | 多 VLAN,帧带 tag |
| Hybrid | 华为设备特有 | 灵活配置哪些 VLAN 打 tag |
# Cisco 交换机配置示例
# Access 口
interface GigabitEthernet0/1
switchport mode access
switchport access vlan 100
# Trunk 口
interface GigabitEthernet0/24
switchport mode trunk
switchport trunk allowed vlan 100,200,300
五、路由基础
路由表与最长前缀匹配
ip route show
# 192.168.1.0/24 dev eth0 ← 直连,无需网关
# 10.0.0.0/8 via 192.168.1.1 dev eth0 ← 静态路由
# default via 192.168.1.1 dev eth0 ← 默认路由
匹配规则: 最长前缀优先。目标 10.20.30.40 有 4 条匹配时,选匹配位最多的那条。
# 添加静态路由
ip route add 10.10.0.0/16 via 192.168.1.1 dev eth0
ip route add blackhole 10.10.10.0/24 # 静默丢弃
# 永久保存(CentOS):/etc/sysconfig/network-scripts/route-eth0
# 永久保存(Debian):/etc/network/interfaces 中添加 up ip route add ...
策略路由
基于源地址/端口等条件的路由:
ip rule add from 192.168.1.0/24 table 100
ip route add default via 192.168.1.1 dev eth0 table 100
六、网络排查分层流程
ping 127.0.0.1 → 失败:TCP/IP 协议栈问题
↓ 成功
ping 本机 IP → 失败:网卡 down / IP 配置错误
↓ 成功
ping 网关 IP → 失败:ARP 问题 / 链路问题
↓ 成功
ping 目标 IP → 失败:中间网络 / 路由问题
↓ 成功
nslookup 域名 → 失败:DNS 问题
↓ 成功
telnet/curl 目标端口 → 失败:防火墙 / 服务问题
常用命令速查
ip addr show # 查 IP 配置
ip route show # 查路由表
ip neigh show / arp -a # 查 ARP
ping -c 3 <ip> # 测连通性
traceroute -m 10 <ip> # 追路由
nc -zv <ip> <port> # 测端口
nslookup / dig +short # 查 DNS
ss -tlnp # 查监听端口
iptables -L -n -v # 查防火墙
七、常见故障案例
案例 1:获取到 169.254.x.x 地址
原因: DHCP 获取失败。解决:
dhclient -r eth0 && dhclient eth0 # 重新获取
# 或手动配置静态 IP
ip addr add 192.168.1.100/24 dev eth0
ip route add default via 192.168.1.1
案例 2:同网段 ping 不通
排查: 确认 IP/掩码正确 → arp -a 看 MAC → iptables -L INPUT 查 ICMP 是否被 DROP。
案例 3:跨网段 ping 不通
排查: 确认网关 ip route → ping 网关 通吗?→ 检查回程路由(目标→源的路径往往被忽略)。
案例 4:DNS 正常但无法访问
排查: nc -zv 测端口 → traceroute 追跳点 → iptables -L OUTPUT → 检查 MTU(ping -M do -s 1400)、检查代理变量 echo $http_proxy。
八、防火墙基础
iptables 概要
四表:raw > mangle > nat > filter
五链:PREROUTING → INPUT → FORWARD → OUTPUT → POSTROUTING
# 常见放行规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已建立连接
iptables -A INPUT -p tcp --dport 3306 -s 10.0.1.0/24 -j ACCEPT # MySQL 白名单
# 保存规则
iptables-save > /etc/iptables/rules.v4
最小权限原则
# 限制 SSH 来源
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# 内核安全参数
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # 防放大攻击
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter # 防 IP 欺骗
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects # 防重定向攻击
九、Docker/K8s 网络补充
# Docker 网络
docker network ls
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name
# 常见 CNI 网段
# Flannel: 10.244.0.0/16 Calico: 10.244.0.0/16 Cilium: 10.244.0.0/16
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'
kubectl exec pod_name -- ip addr
十、网络优化参数
# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 65536 6291456
net.netfilter.nf_conntrack_max = 1048576
sysctl -p
关联页面
| 页面 | 说明 |
|---|---|
| network-troubleshooting-order | 网络排障分层七步法 |
| dns-troubleshooting-practical-guide | DNS 故障排查指南 |
| linux-kernel-tuning-production | Linux 内核参数调优 |
| k8s-service-access-troubleshooting | K8s 服务网络排障 |