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

张开发
2026/4/12 6:46:28 15 分钟阅读

分享文章

【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这个配置做了几件重要的事为enp0s3内网设置了到192.168.1.0/24的路由为enp0s8外网设置了默认路由0.0.0.0/0通过routing-policy确保来自外网IP的流量使用正确的路由表用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这相当于设置了三条路由策略来自外网IP的流量走表100去往203.0.113.0/24的流量走表101同时满足来源和目标的流量走表1024. 验证与排错4.1 应用配置改完配置后执行以下命令应用sudo netplan generate sudo netplan apply建议先generate再apply这样能先检查语法错误。如果直接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.384.3 常见问题排查如果遇到网络不通按这个顺序检查ping 127.0.0.1检查本地网络栈ping 192.168.x.1检查网关连通性ping 8.8.8.8检查外网连通性traceroute 8.8.8.8查看路由路径如果发现路由不对可以临时修改sudo ip route del default sudo ip route add default via 192.168.2.1 dev enp0s8但记住这只是临时生效重启就没了永久修改还是要靠Netplan配置。5. 生产环境优化建议在实际部署中我总结了几个优化点多配置测试先在测试环境验证配置特别是路由策略复杂的场景配置版本控制把/etc/netplan/下的配置纳入git管理监控告警设置对网关切换的监控比如用Prometheus的blackbox_exporter备用方案准备一个带网络恢复功能的救援镜像对于需要高可用的场景可以考虑结合Keepalived实现网关冗余但这又是另一个话题了。

更多文章