第 10/30 天(重访·第二季)
引言
在第一季的第 10 天,我们已经学会了用 netplan 配置静态 IP、用 ip 查看地址、用 ss 检查端口、用 ufw 打开防火墙端口。但真实的生产服务器远比「配个 IP、开个端口」复杂得多——服务器有多块网卡如何分工?不同业务流量如何走不同路由?跨机房访问如何做策略路由?防火墙规则如何做到既安全又可审计?
本篇文章是第二季的重访,我们将从「会用命令」跃升到「设计网络」:netplan 的 VLAN 划分与 Bonding 链路聚合、ip 命令的策略路由与网络命名空间、ss 的 TCP 状态机深度诊断、UFW 生产级防火墙策略,以及用 mtr 和 tcpdump 完成一次真实的网络故障定位。如果你已经会配 IP 和开端口,本文会让你真正「驾驭」服务器网络。
一、netplan 高级配置:从「能用」到「可设计」
Ubuntu 从 17.10 起默认使用 netplan 管理网络,它把配置统一写在 YAML 文件中,再由后端(systemd-networkd 或 NetworkManager)执行。第一季我们只用了最基础的 addresses 和 gateway4,下面看生产环境的真实需求。
1.1 多网卡 + 静态路由:让不同流量走不同出口
假设服务器有 eth0(连接内网 192.168.1.0/24)和 eth1(连接公网),我们希望默认路由走公网,而访问某内网网段走内网接口:
# /etc/netplan/01-network-manager-all.yaml
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses: [192.168.1.10/24]
routes:
- to: 10.0.0.0/8 # 到内网 10 网段
via: 192.168.1.1 # 走内网网关
eth1:
dhcp4: no
addresses: [203.0.113.10/24]
routes:
- to: default # 默认路由
via: 203.0.113.1
# 应用配置(netplan 支持原子化应用,失败自动回滚)
sudo netplan apply
# 检查路由表是否符合预期
ip route show
关键:新版 netplan 已弃用
gateway4字段,统一用routes: [{to: default}]表达默认路由,迁移配置时务必注意。
1.2 VLAN 划分:一张物理网卡分出多个逻辑网络
服务器通过 trunk 口接入交换机时,常用 VLAN 隔离业务:
network:
version: 2
ethernets:
eth0:
dhcp4: no
vlans:
vlan.100:
id: 100
link: eth0
addresses: [10.100.0.10/24]
vlan.200:
id: 200
link: eth0
addresses: [10.200.0.10/24]
sudo netplan apply
ip -br link show | grep vlan # 应看到 vlan.100 和 vlan.200
1.3 Bonding 链路聚合:两块网卡合成一条「粗管道」
服务器双网卡接到交换机两个口,做 Bonding(active-backup 模式)可提高可靠性:
network:
version: 2
ethernets:
eth0: {dhcp4: no}
eth1: {dhcp4: no}
bonds:
bond0:
interfaces: [eth0, eth1]
parameters:
mode: active-backup # 1 主 1 备,也可用 802.3ad(LACP)
mii-monitor-interval: 100
addresses: [192.168.1.10/24]
routes:
- to: default
via: 192.168.1.1
⚠️ 坑:Bonding 生效要求交换机侧也做对应配置(active-backup 至少两端口在同一广播域,LACP 模式需交换机开动态聚合),否则可能出现环路或不通。
二、ip 命令进阶:策略路由与网络命名空间
ip 是 ifconfig/route 的现代替代品,第一季我们只用了 ip addr。生产排障中,ip route 与 ip rule 才是主角。
2.1 策略路由:按源地址/目标分流
单一路由表无法满足「办公网段走专线、其他走默认」这类需求,需要策略路由(policy routing):
# 1. 创建一张独立路由表 100
echo "100 office" | sudo tee -a /etc/iproute2/rt_tables
# 2. 在表 100 里加入默认路由(走专线网关)
sudo ip route add default via 10.0.0.1 dev eth0 table office
# 3. 添加规则:来自 192.168.5.0/24 的流量查表 100
sudo ip rule add from 192.168.5.0/24 lookup office
# 4. 验证
ip rule show
ip route show table office
2.2 网络命名空间:一台机器上的「虚拟路由器」
命名空间(network namespace)是容器网络的基础,可用于隔离测试环境:
# 创建两个命名空间
sudo ip netns add ns1
sudo ip netns add ns2
# 创建 veth 对(虚拟网线,两端分别伸入两个命名空间)
sudo ip link add veth1 type veth peer name veth2
sudo ip link set veth1 netns ns1
sudo ip link set veth2 netns ns2
# 两端配 IP 并启用
sudo ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth1
sudo ip netns exec ns1 ip link set veth1 up
sudo ip netns exec ns2 ip addr add 10.0.0.2/24 dev veth2
sudo ip netns exec ns2 ip link set veth2 up
# 测试连通性
sudo ip netns exec ns1 ping -c 2 10.0.0.2
场景:理解命名空间后,你就读懂了 Docker 容器网络的底层原理——每个容器都有自己的 netns,通过 veth 对和 bridge 与宿主机相连。
三、ss 深度诊断:从端口占用到连接状态
ss 比 netstat 更快、信息更全,是排查连接问题的一把好手:
# 列出所有监听端口及对应进程(生产最常用)
ss -tlnp
# 查看当前 TCP 连接状态统计(判断是否有大量 TIME_WAIT/连接堆积)
ss -s
# 只看某个端口的连接(如排查 3306 是否被大量半连接攻击)
ss -tn state established '( dport = :3306 or sport = :3306 )'
# 找出占用某端口的进程 PID
ss -tlnp | grep 8080
状态机速查:LISTEN(服务在监听)→ SYN-SENT(主动连接发出未回)→ ESTABLISHED(已建立)→ FIN-WAIT/TIME-WAIT(正常关闭)→ CLOSE-WAIT(对端关闭但本地未关,常见于应用代码没 close)。若 TIME_WAIT 上万通常不是问题(2MSL 自然回收),但 CLOSE_WAIT 堆积往往意味着应用层 bug,要重点排查。
四、UFW 生产级防火墙策略
UFW 是 iptables 的前端封装,易用且规则可审计。生产环境建议「默认拒绝、白名单放行」。
4.1 建立默认拒绝 + 白名单基线
# 1. 先设置默认策略:入站拒绝、出站允许
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. 放行 SSH(务必先做,避免把自己锁在外面)
sudo ufw allow OpenSSH
# 3. 按需放行服务
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow from 10.0.0.0/8 to any port 3306 # 数据库仅限内网
# 4. 启用并查看状态
sudo ufw enable
sudo ufw status verbose
⚠️ 保命提示:
ufw enable前先确认 SSH 已放行,且当前 SSH 连接别断——否则规则一应用你就「进不去了」。稳妥做法是先在另一个终端测试sudo ufw --force enable。
4.2 端口转发与限流
# 端口转发:把宿主机的 8443 转发到内网 10.0.0.5 的 443
sudo sed -i 's/#net/ipv4/ip_forward=1/net/ipv4/ip_forward=1/' /etc/ufw/sysctl.conf
sudo ufw route allow proto tcp from any to 10.0.0.5 port 443
sudo ufw allow 8443/tcp
# 再加 DNAT 规则(写入 before.rules 或用 ufw route)
# 限流:SSH 每分钟最多 6 个新连接,防暴力破解
sudo ufw limit OpenSSH
4.3 日志与审计
sudo ufw logging on # 开启日志
sudo tail -f /var/log/ufw.log # 实时观察被拦截的流量
# 统计被拒次数前 10 的来源 IP
sudo awk '$6=="[UFW" && $11=="DROP"{print $12}' /var/log/ufw.log | sort | uniq -c | sort -rn | head
五、生产级网络排障:mtr 与 tcpdump 实战
网络不通时,别盲目 ping,按顺序排查效率最高:
# 1. 确认本地接口与路由
ip addr show && ip route show
# 2. 连续探测路径(mtr 同时显示每跳的丢包与延迟,比 ping 强大得多)
mtr -rw 8.8.8.8
# 3. 抓包确认请求是否真的发出去、有没有响应
sudo tcpdump -i eth0 -nn host 8.8.8.8 and port 443 -c 20
# 解释:-i 指定网卡;-nn 不做域名/端口反向解析;host+port 过滤目标;-c 抓 20 个包后退出
tcpdump 常用过滤器速记:tcp port 443(端口)、host 10.0.0.5(主机)、icmp(协议)、src/dst(方向)、-w file.pcap(存文件给 Wireshark 分析)。
排障口诀:先本地后对端 → 先链路后应用 → 先抓包后猜测。mtr 首跳丢包正常(限速 ICMP),但到目标主机持续丢包且延迟骤增,基本可判定为中间链路或对端带宽问题。
总结与下期预告
网络是 Ubuntu 服务器的「神经系统」,配不好,服务再稳也连不上。本文带你完成了从「配 IP 开端口」到「设计网络」的进阶:理解了 netplan 的路由、VLAN 与 Bonding,掌握了策略路由和网络命名空间的原理,会用 ss 诊断连接状态,用 UFW 建立「默认拒绝」的生产级防火墙基线,并用 mtr + tcpdump 完成系统性排障。记住三个立即可用的要点:ufw enable 前务必先放行 SSH、CLOSE_WAIT 堆积指向应用层 bug 而非网络、排障先抓包再下结论。
下期预告:第 11 天(重访·第二季)将带来《进程管理与监控——性能分析与调优》,深入系统负载模型、pidstat/perf 等性能剖析工具与生产级告警体系。敬请期待!
系列目录
| 天数 | 主题 | 状态 |
|---|---|---|
| 第 1 天 | Ubuntu 简介与版本选择 | ✅ |
| 第 2 天 | 手把手安装 Ubuntu | ✅ |
| 第 3 天 | Ubuntu 桌面环境初探 | ✅ |
| 第 4 天 | Ubuntu 终端基础 | ✅ |
| 第 5 天 | 用户与权限管理 | ✅ |
| 第 6 天 | 软件包管理 | ✅ |
| 第 7 天 | 文件与文本操作 | ✅ |
| 第 8 天 | 系统服务管理 | ✅ |
| 第 9 天 | 磁盘与文件系统管理 | ✅ |
| 第 10 天 | 网络配置与管理 | ✅ |
| 第 11 天 | 进程管理与监控 | ✅ |
| 第 12 天 | 计划任务与自动化 | ✅ |
| 第 13 天 | 备份与恢复策略 | ✅ |
| 第 14 天 | 系统更新与升级管理 | ✅ |
| 第 15 天 | SSH 远程管理与安全加固 | ✅ |
| 第 16 天 | Web 服务器搭建 | ✅ |
| 第 17 天 | 数据库服务器部署 | ✅ |
| 第 18 天 | Docker 容器化管理 | ✅ |
| 第 19 天 | 文件共享服务 | ✅ |
| 第 20 天 | 监控与告警系统 | ✅ |
| 第 21 天 | 邮件服务器基础 | ✅ |
| 第 22 天 | 系统安全加固 | ✅ |
| 第 23 天 | 性能调优与内核参数 | ✅ |
| 第 24 天 | 虚拟化技术 | ✅ |
| 第 25 天 | 容器编排入门 | ✅ |
| 第 26 天 | 高可用与负载均衡 | ✅ |
| 第 27 天 | Ubuntu 自动部署 | ✅ |
| 第 28 天 | 故障排查实战 | ✅ |
| 第 29 天 | Ubuntu 社区与文档 | ✅ |
| 第 30 天 | 30 天回顾总结 | ✅ |
| 第 23 天(重访) | 性能调优与内核参数——生产环境基准测试与踩坑实战 | ✅ |
| 第 24 天(重访) | KVM 虚拟化高级实战——生产级配置与性能调优 | ✅ |
| 第 25 天(重访) | 容器编排进阶——Docker Compose 生产实践与 Kubernetes 单节点集群实战 | ✅ |
| 第 26 天(重访) | 高可用与负载均衡生产实战——Keepalived + HAProxy 深度调优与故障排查 | ✅ |
| 第 27 天(重访) | 自动部署生产实践——PXE + Preseed + Cloud-init 深度进阶与企业级流水线 | ✅ |
| 第 28 天(重访) | 故障排查实战——深度内核调试、文件系统救援与生产级排障 | ✅ |
| 第 29 天(重访) | Ubuntu 社区与文档——从使用者到贡献者深度实践 | ✅ |
| 第 30 天(重访) | 30 天系列完结篇——学习路线图与成长行动指南 | ✅ |
| 第 1 天(重访·第二季) | Ubuntu 新篇章——2026 年生态全景与版本选择 | ✅ |
| 第 2 天(重访·第二季) | 手把手安装 Ubuntu——2026 年全新安装体验与自动化部署 | ✅ |
| 第 3 天(重访·第二季) | Ubuntu 桌面环境深度探索——GNOME 46 新特性与个性化定制 | ✅ |
| 第 4 天(重访·第二季) | Ubuntu 终端与 Shell 高级技巧——现代 CLI 工具链 | ✅ |
| 第 5 天(重访·第二季) | 用户与权限管理——从 ACL 到 PAM 企业级权限体系 | ✅ |
| 第 6 天(重访·第二季) | 软件包管理——apt、dpkg、snap、flatpak 深入对比 | ✅ |
| 第 7 天(重访·第二季) | 文件与文本操作——现代化 CLI 工具链 | ✅ |
| 第 8 天(重访·第二季) | 系统服务管理——systemd 深度剖析与企业级服务治理 | ✅ |
| 第 9 天(重访·第二季) | 磁盘与文件系统管理——LVM 与存储进阶 | ✅ |
| 第 10 天(重访·第二季) | 网络配置与管理——netplan 高级网络、策略路由与生产级防火墙 | 🟢 今日 |
| 第 11 天(重访·第二季) | 进程管理与监控——性能分析与调优 | ⏳ |
| 第 12 天(重访·第二季) | 计划任务与自动化——进阶自动化 | ⏳ |
| 第 13 天(重访·第二季) | 备份与恢复策略——企业级备份方案 | ⏳ |
| 第 14 天(重访·第二季) | 系统更新与升级管理——生产环境升级策略 | ⏳ |
| 第 15 天(重访·第二季) | SSH 远程管理——安全加固进阶 | ⏳ |
| 第 16 天(重访·第二季) | Web 服务器搭建——高性能 Nginx 调优 | ⏳ |
| 第 17 天(重访·第二季) | 数据库服务器部署——生产级数据库运维 | ⏳ |
| 第 18 天(重访·第二季) | Docker 容器化——生产级容器管理 | ⏳ |
| 第 19 天(重访·第二季) | 文件共享服务——高性能存储方案 | ⏳ |
| 第 20 天(重访·第二季) | 监控与告警系统——可观测性平台 | ⏳ |
| 第 21 天(重访·第二季) | 邮件服务器基础——企业邮件方案 | ⏳ |
| 第 22 天(重访·第二季) | 系统安全加固——深度安全策略 | ⏳ |
| 第 23 天(重访·第二季) | 性能调优与内核参数——生产环境优化 | ⏳ |
| 第 24 天(重访·第二季) | 虚拟化技术——KVM 高级虚拟化 | ⏳ |
| 第 25 天(重访·第二季) | 容器编排入门——Docker Compose 与 K8s | ⏳ |
| 第 26 天(重访·第二季) | 高可用与负载均衡——集群方案 | ⏳ |
| 第 27 天(重访·第二季) | Ubuntu 自动部署——自动化运维 | ⏳ |
| 第 28 天(重访·第二季) | 故障排查实战——深度排障 | ⏳ |
| 第 29 天(重访·第二季) | Ubuntu 社区与文档——开源贡献 | ⏳ |
| 第 30 天(重访·第二季) | 30 天回顾总结——第二季完结篇 | ⏳ |















暂无评论内容