当前位置: 首页 > news >正文

【Ubuntu】Netplan实战:双网卡环境下的精准路由与网关配置

1. 双网卡环境下的网络困境与Netplan优势

最近在给一台Ubuntu 22.04服务器配置双网卡时,遇到了一个典型问题:机器重启后网关会随机漂移,导致网络连接不稳定。这台服务器一个网卡连接内网管理网络(192.168.1.0/24),另一个连接外网业务网络(192.168.2.0/24)。每次重启都像开盲盒,不知道这次会走哪个网关,运维同事都快被搞疯了。

传统解决方案是用ifupdown或者直接改/etc/network/interfaces,但在Ubuntu新版本中,Netplan才是官方推荐的工具。Netplan最大的优势在于它是个抽象层,把配置转换成systemd-networkd或NetworkManager能理解的格式。我实测下来,用Netplan配置双网卡路由特别稳,配置语法也简洁明了。

这里有个生活化的类比:想象你有两个快递员(网卡),一个负责同城快递(内网),一个负责跨省快递(外网)。如果不明确分工,两个快递员可能会抢同一个包裹,最后导致快递送错地方。Netplan就像是个智能调度系统,可以精确指定哪个快递员负责哪类包裹。

2. 实战前的准备工作

2.1 确认网卡信息

首先得搞清楚手头的网卡情况。在终端输入:

ip -c a

这个命令会列出所有网络接口,带颜色高亮显示,比单纯的ip a更易读。输出大概长这样:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:9b:5d:3e brd ff:ff:ff:ff:ff:ff inet 192.168.1.38/24 brd 192.168.1.255 scope global enp0s3 valid_lft forever preferred_lft forever 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:9b:5d:3f brd ff:ff:ff:ff:ff:ff inet 192.168.2.38/24 brd 192.168.2.255 scope global enp0s8 valid_lft forever preferred_lft forever

重点记下两个网卡名称(如enp0s3和enp0s8)及其IP地址信息。建议用手机拍个照,后面配置时会频繁用到。

2.2 备份现有配置

动网络配置前一定要备份!我吃过亏,有一次改崩了连不上服务器,只能去机房接显示器。现在我的习惯是:

sudo cp /etc/netplan/*.yaml ~/netplan_backup/ sudo cp /etc/resolv.conf ~/netplan_backup/

这样即使改错了也能快速回滚。另外建议开个tmux或screen会话,防止SSH断开导致配置中断。

3. 核心配置实战

3.1 基础双网卡配置

先来看最基本的双网卡静态IP配置。用你喜欢的编辑器打开Netplan配置文件(通常是/etc/netplan/下的yaml文件):

sudo nano /etc/netplan/00-installer-config.yaml

基础配置模板如下:

network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: no addresses: [192.168.1.38/24] nameservers: addresses: [8.8.8.8, 1.1.1.1] enp0s8: dhcp4: no addresses: [192.168.2.38/24]

这个配置给两个网卡分配了静态IP,但还没解决网关冲突问题。如果就这样应用,系统还是会随机选默认网关。

3.2 精准路由配置

关键来了!我们需要用Netplan的routes和routing-policy功能实现精准路由。修改后的配置:

network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: no addresses: [192.168.1.38/24] routes: - to: 192.168.1.0/24 via: 192.168.1.1 metric: 100 enp0s8: dhcp4: no addresses: [192.168.2.38/24] nameservers: addresses: [8.8.8.8, 1.1.1.1] routes: - to: 0.0.0.0/0 via: 192.168.2.1 metric: 100 routing-policy: - from: 192.168.2.38 table: 100

这个配置做了几件重要的事:

  1. 为enp0s3(内网)设置了到192.168.1.0/24的路由
  2. 为enp0s8(外网)设置了默认路由(0.0.0.0/0)
  3. 通过routing-policy确保来自外网IP的流量使用正确的路由表
  4. 用metric参数控制路由优先级

3.3 高级路由策略

对于更复杂的场景,比如需要特定流量走特定网卡,可以这样配置:

enp0s8: ... routing-policy: - from: 192.168.2.38 table: 100 - to: 203.0.113.0/24 table: 101 - from: 192.168.2.38 to: 198.51.100.0/24 table: 102

这相当于设置了三条路由策略:

  1. 来自外网IP的流量走表100
  2. 去往203.0.113.0/24的流量走表101
  3. 同时满足来源和目标的流量走表102

4. 验证与排错

4.1 应用配置

改完配置后,执行以下命令应用:

sudo netplan generate sudo netplan apply

建议先generateapply,这样能先检查语法错误。如果直接apply遇到错误,可能会让网络直接挂掉。

4.2 验证路由表

用这些命令检查配置是否生效:

ip route show ip route show table 100 ip rule list

正常应该看到类似这样的输出:

default via 192.168.2.1 dev enp0s8 proto static metric 100 192.168.1.0/24 via 192.168.1.1 dev enp0s3 proto static metric 100 192.168.2.0/24 dev enp0s8 proto kernel scope link src 192.168.2.38

4.3 常见问题排查

如果遇到网络不通,按这个顺序检查:

  1. ping 127.0.0.1检查本地网络栈
  2. ping 192.168.x.1检查网关连通性
  3. ping 8.8.8.8检查外网连通性
  4. traceroute 8.8.8.8查看路由路径

如果发现路由不对,可以临时修改:

sudo ip route del default sudo ip route add default via 192.168.2.1 dev enp0s8

但记住这只是临时生效,重启就没了,永久修改还是要靠Netplan配置。

5. 生产环境优化建议

在实际部署中,我总结了几个优化点:

  1. 多配置测试:先在测试环境验证配置,特别是路由策略复杂的场景
  2. 配置版本控制:把/etc/netplan/下的配置纳入git管理
  3. 监控告警:设置对网关切换的监控,比如用Prometheus的blackbox_exporter
  4. 备用方案:准备一个带网络恢复功能的救援镜像

对于需要高可用的场景,可以考虑结合Keepalived实现网关冗余,但这又是另一个话题了。

http://www.jsqmd.com/news/627552/

相关文章:

  • nlp_structbert_siamese-uninlu_chinese-base参数详解:max_seq_length与span_max_len调优指南
  • Word宏安全设置调低后,EndNote X9还是闪退?试试这个修改Hosts文件的终极方案
  • lora-scripts在教育培训中的应用:定制学科问答LoRA,打造智能辅导助手
  • Notepad++ 辅助开发:编辑与调试Pixel Couplet Gen配置文件与脚本
  • 造相-Z-Image-Turbo亚洲美女LoRA:无需代码,Web界面直接操作
  • Pandas groupby实战:电商用户分群分析的5个高频场景(附代码)
  • DAMO-YOLO智能安防应用:基于实时视频流的目标检测与告警系统
  • Wan2.2-I2V-A14B高级教程:使用PyCharm进行模型源码调试与优化
  • 【三维重建】DropGaussian:如何用“随机丢弃”策略驯服稀疏视角下的高斯溅射?
  • GLM-4V-9B企业级应用:制造业BOM表图片结构化+ERP系统自动录入
  • MiniCPM-o-4.5-nvidia-FlagOS模型精调教程:使用特定领域数据提升专业任务性能
  • Rust 宏系统的可组合设计
  • Qwen3.5-35B-AWQ-4bit开源镜像部署教程:vLLM+compressed-tensors稳定方案
  • 万物识别中文模型5分钟快速上手:免配置环境一键部署教程
  • 使用Proteus进行nli-distilroberta-base模型服务依赖的可视化架构设计
  • 基于Qwen-Image-2512-Pixel-Art-LoRA 的嵌入式系统UI图标生成方案
  • RetinaFace效果实测:对比不同阈值下的人脸检测精度差异
  • 【SITS2026紧急预警】:2026年起,无伦理溯源日志的AI系统将被全球TOP15云平台自动拒载(附开源EthiLog v2.1集成指南)
  • Graphormer模型推理加速:使用.accelerate库优化计算性能
  • 生物信息学新手必看:5分钟搞定AlphaFold蛋白质结构数据本地化
  • 从零搭建高活跃AI原生技术社区:7步标准化流程、3类核心角色配置清单与实时数据验证模型
  • FireRedASR Pro学术研究辅助工具:自动转写访谈录音与文献摘要
  • Qwen3-Reranker-0.6B部署总结:你已掌握的核心能力与下一步行动建议
  • 输入两字秒出春联:春联生成模型-中文-base新手体验实测
  • Z-Image-GGUF一键部署教程:3步完成Python环境下的文生图模型搭建
  • 文档漂移(Doc Drift)正在吞噬你的AI系统可靠性:一份被27家AI原生企业联合签署的自动化更新白皮书
  • 自动化测试集成:Z-Image-Turbo生成图像的质量评估算法
  • Kandinsky-5.0-I2V-Lite-5s部署案例:高校AI课程实验平台——学生自助生成动态作业
  • 【紧急预警】Kubernetes+LLM协同失控风险正在爆发!3个真实生产事故复盘,及开源可部署的AI-Native Guardrails v1.2
  • 在WSL2中无缝开发与调试:Phi-4-mini-reasoning模型本地化部署指南