Ubuntu 系统系列 | 第 10 天(重访·第二季):网络配置与管理——netplan 高级网络、策略路由与生产级防火墙

第 10/30 天(重访·第二季)

引言

在第一季的第 10 天,我们已经学会了用 netplan 配置静态 IP、用 ip 查看地址、用 ss 检查端口、用 ufw 打开防火墙端口。但真实的生产服务器远比「配个 IP、开个端口」复杂得多——服务器有多块网卡如何分工?不同业务流量如何走不同路由?跨机房访问如何做策略路由?防火墙规则如何做到既安全又可审计?

本篇文章是第二季的重访,我们将从「会用命令」跃升到「设计网络」:netplan 的 VLAN 划分与 Bonding 链路聚合、ip 命令的策略路由与网络命名空间、ss 的 TCP 状态机深度诊断、UFW 生产级防火墙策略,以及用 mtrtcpdump 完成一次真实的网络故障定位。如果你已经会配 IP 和开端口,本文会让你真正「驾驭」服务器网络。


一、netplan 高级配置:从「能用」到「可设计」

Ubuntu 从 17.10 起默认使用 netplan 管理网络,它把配置统一写在 YAML 文件中,再由后端(systemd-networkd 或 NetworkManager)执行。第一季我们只用了最基础的 addressesgateway4,下面看生产环境的真实需求。

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 命令进阶:策略路由与网络命名空间

ipifconfig/route 的现代替代品,第一季我们只用了 ip addr。生产排障中,ip routeip 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 深度诊断:从端口占用到连接状态

ssnetstat 更快、信息更全,是排查连接问题的一把好手:

# 列出所有监听端口及对应进程(生产最常用)
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 前务必先放行 SSHCLOSE_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 天回顾总结——第二季完结篇
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容