十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu 16.04网络配置全解析:从interfaces到Netplan的运维实践

Ubuntu 16.04网络配置全解析:从interfaces到Netplan的运维实践 1. 项目概述为什么Ubuntu 16.04的网络配置依然值得深究最近在整理旧项目的服务器环境又翻出了Ubuntu 16.04 LTS这个经典版本。虽然官方主流支持早已结束但直到今天仍有大量企业内网的生产环境、特定的工业控制软件或是某些对稳定性有苛刻要求的遗留系统在跑着这个版本。对于运维工程师和开发者来说遇到一台需要重新配置网络的Ubuntu 16.04服务器依然是大概率事件。很多人觉得网络配置无非就是改改IP但真上手了才发现从传统的/etc/network/interfaces到新贵的Netplan从静态分配到DHCP再到多网卡绑定和复杂路由里面门道不少一个配置不当就可能让服务器“失联”。这篇内容我就结合自己这些年踩过的坑把Ubuntu 16.04下的网络配置从原理到实操掰开揉碎了讲清楚。无论你是刚接手旧系统的运维新手还是需要在虚拟机里复现老环境的开发者这些经验都能让你少走弯路。2. 网络配置的核心思路与方案选型给一台Ubuntu 16.04配置网络本质上是在和操作系统里的网络管理服务打交道。这个版本处在一个过渡期它默认安装了两种网络配置工具经典的ifupdown通过/etc/network/interfaces文件管理和初代Netplan作为后端渲染器。理解它们的关系和适用场景是正确配置的第一步。2.1 传统方案ifupdown与interfaces文件这是最经典、文档最多、也是大多数老管理员最熟悉的方式。其核心思想是声明式配置你编辑一个文本文件/etc/network/interfaces定义好每个网络接口如eth0、ens33应该如何启动、获取IP地址、设置网关等。然后通过ifup、ifdown命令或重启networking服务来使配置生效。它的优势在于直接、透明、可控性强。所有配置一目了然排错时可以直接查看文件。在服务器、尤其是无图形界面的服务器版Ubuntu上这是多年来的标准做法。然而它的缺点是不够灵活对于动态变化的网络环境比如笔记本电脑在多个Wi-Fi间切换支持较弱并且配置逻辑相对底层。2.2 过渡方案Netplan的引入Ubuntu 17.10开始大力推广Netplan而16.04作为LTS版本其实已经包含了早期的Netplan组件。Netplan的设计理念是作为一个“抽象层”或“渲染器”。你编写更简洁、结构化的YAML配置文件通常位于/etc/netplan/目录下Netplan再将这些配置翻译成后端网络服务如networkd或NetworkManager所能理解的指令。在Ubuntu 16.04的桌面版NetworkManager可能更活跃而在服务器版systemd-networkd是更常见的后端。Netplan的好处是提供了统一的配置入口并且其YAML格式更现代、易于版本管理。但在16.04上Netplan可能并非默认的活跃配置方式需要手动启用和切换。2.3 方案选择背后的考量选择哪种方案取决于你的具体环境和需求纯粹的命令行服务器追求稳定和可控优先使用传统的/etc/network/interfaces。这是最保险、兼容性最好的方法几乎所有教程和脚本都基于此。希望为未来升级到18.04做准备可以尝试在16.04上启用并配置Netplan提前熟悉其语法和工作流程。桌面环境或需要频繁切换网络如果安装了桌面环境NetworkManager可能是更好的选择它提供了图形界面和更智能的连接管理。对于绝大多数运维场景尤其是处理存量服务器我强烈建议从掌握/etc/network/interfaces开始。它是基石理解了它再去看Netplan会更容易。下面我们就深入这个经典文件的细节。3. 核心细节解析/etc/network/interfaces文件详解这个文件是网络接口配置的“总司令部”。它的语法看似简单但每个选项都关乎网络的连通性。我们先看一个最基础的静态IP配置示例然后逐一拆解。# 环回接口通常不需要改动 auto lo iface lo inet loopback # 主网络接口这里以eth0为例实际可能是ens33、enp0s3等 auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.43.1 关键指令解析auto interface_name这一行告诉系统在启动networking服务时自动启动这个接口。没有这行接口不会自动启用你需要手动sudo ifup eth0。iface interface_name inet method这是定义接口配置的核心行。interface_name你的网卡设备名。使用ip link show或ifconfig -a需安装net-tools来查看。inet表示IPv4。如果是IPv6则用inet6。method获取IP地址的方式。static静态IP需要手动指定下面所有参数。dhcp通过DHCP自动获取IP、网关、DNS等。manual手动配置通常用于不需要IP协议的桥接或聚合接口。address、netmask、gateway定义了IP地址、子网掩码和默认网关。这三者必须与你的网络环境匹配。网关通常是你的路由器内网IP。dns-nameservers指定DNS服务器。可以跟多个用空格隔开。这是一个极易被忽略但至关重要的配置。即使IP和网关正确DNS配错也会导致无法解析域名从而“上不了网”。我习惯同时配置一个公共DNS如8.8.8.8和一个本地路由器DNS如192.168.1.1作为备份。3.2 高级配置参数对于更复杂的场景这个文件还能定义更多bridge_ports用于配置网桥将物理接口如eth0加入一个虚拟桥接设备。bond-mode用于配置网卡绑定Bonding将多个物理网卡聚合成一个逻辑接口提供冗余或负载均衡。post-up和pre-down这两个指令允许你在接口启动后或关闭前执行自定义脚本。例如在接口启动后添加一条特定的路由规则post-up ip route add 10.10.0.0/16 via 192.168.1.254注意编辑/etc/network/interfaces文件需要root权限务必使用sudo例如sudo nano /etc/network/interfaces。修改前最好先备份原文件。4. 完整实操流程从零配置到验证连通性理论说再多不如动手做一遍。我们假设一个最常见的场景为一台新安装的Ubuntu 16.04服务器配置静态IP并确保它能访问互联网和同局域网内的其他机器。4.1 第一步确定网络接口名称首先你需要知道系统识别出的网卡叫什么。在较新的Linux内核中网卡命名规则从传统的eth0、eth1变成了基于PCI位置等的可预测命名如ens33、enp0s3。打开终端输入ip link show或者安装传统工具后查看sudo apt update sudo apt install net-tools -y ifconfig -a在输出中找到不是lo环回的那个接口记下它的名字比如ens33。4.2 第二步编辑网络配置文件使用你熟悉的文本编辑器如nano或vim编辑interfaces文件sudo nano /etc/network/interfaces将内容修改为如下请根据你的网络环境替换IP、网关、DNS和接口名# The loopback network interface auto lo iface lo inet loopback # The primary network interface auto ens33 iface ens33 inet static address 192.168.31.150 # 你想要设置的静态IP netmask 255.255.255.0 # 子网掩码通常为255.255.255.0 gateway 192.168.31.1 # 你的路由器网关地址 dns-nameservers 192.168.31.1 8.8.8.8 # DNS服务器第一个可以是网关编辑完成后按CtrlX然后按Y再按Enter保存退出。4.3 第三步重启网络服务使配置生效有几种方法可以应用新配置重启整个网络服务最彻底sudo systemctl restart networking在16.04上也可能是sudo service networking restart仅重启特定接口更优雅sudo ifdown ens33 sudo ifup ens33如果ifdown提示接口未配置可以先执行sudo ifup -a。重要心得在远程通过SSH连接服务器进行网络配置时这是一个危险操作。错误的配置可能导致你断连。一个保命的技巧是使用cron或at命令设置一个定时任务在几分钟后自动将配置改回原来的DHCP或已知正确的静态IP。例如echo sudo cp /etc/network/interfaces.backup /etc/network/interfaces sudo systemctl restart networking | at now 5 minutes这样即使配置错误导致断连5分钟后服务器也会自动恢复给你重新连接的机会。4.4 第四步全面验证网络状态配置重启后不要只看能不能ping通网关要做一套完整的检查。检查IP地址是否生效ip addr show ens33确认显示的inet地址和你配置的一致。检查路由表ip route show你应该能看到一条类似default via 192.168.31.1 dev ens33的默认路由以及一条到你本地网络的路由。测试网关连通性ping -c 4 192.168.31.1这是测试二层和三层连通性的基础。测试DNS解析nslookup www.baidu.com 或 dig www.baidu.com如果能返回IP地址说明DNS配置正确。这是很多人“感觉网络通了但打不开网页”的罪魁祸首。测试外网连通性ping -c 4 8.8.8.8如果能通说明你的主机可以访问外部IP。综合测试同时测试DNS和连接curl -I https://www.baidu.com如果返回HTTP状态码如200恭喜你网络配置完全成功。5. 常见问题与排查技巧实录即使按照步骤操作也难免会遇到问题。下面是我总结的几个高频问题及排查思路基本能覆盖90%的情况。5.1 问题一重启网络服务后接口没有启动或获取不到IP现象执行sudo systemctl restart networking后ip addr show里看不到为接口配置的IP地址。排查步骤检查配置文件语法interfaces文件对缩进和格式有一定要求。确保address、netmask等参数前面是一个Tab键或多个空格但不能没有缩进。可以使用cat -A /etc/network/interfaces查看Tab会显示为^I。查看服务日志网络服务的日志是首要排查点。sudo journalctl -u networking.service -f 或 sudo tail -f /var/log/syslog | grep -i dhclient\|ens33 # 将ens33换成你的接口名日志里通常会明确报错比如“找不到接口eth0”说明接口名不对或者“地址已被占用”。检查NetworkManager是否冲突在服务器上NetworkManager有时会和传统的networking服务冲突。可以尝试暂时禁用NetworkManagersudo systemctl stop NetworkManager sudo systemctl disable NetworkManager然后再次重启networking服务。5.2 问题二能ping通IP但无法解析域名现象ping 8.8.8.8通但ping www.baidu.com提示“未知的名称或服务”。排查步骤确认DNS配置首先检查/etc/network/interfaces中的dns-nameservers行是否配置正确且已生效。重启网络服务后查看/etc/resolv.conf文件cat /etc/resolv.conf这个文件应该包含你配置的DNS服务器。如果里面是127.0.0.53之类的地址说明被systemd-resolved服务管理了。在Ubuntu 16.04上一个直接的方法是在interfaces文件中配置DNS并确保/etc/resolv.conf是一个普通文件而不是指向/run/systemd/resolve/stub-resolv.conf的符号链接。你可以sudo rm /etc/resolv.conf # 先删除如果是链接 sudo echo nameserver 8.8.8.8 /etc/resolv.conf # 直接写入测试DNS服务器直接向指定的DNS服务器发起查询排除本地配置问题。nslookup www.baidu.com 8.8.8.8如果这样能解析问题就出在本地的resolv.conf配置上。5.3 问题三配置静态IP后无法访问互联网或局域网现象IP配置看起来正确但就是不通。排查思路逐层排查物理层/链路层网线是否插好虚拟机的话网卡是否连接如VMware的“已连接”状态ip link show ens33状态是否为UP如果不是用sudo ip link set ens33 up启动。网络层IP层IP冲突你设置的静态IP是否已被局域网内其他设备占用尝试更换一个IP试试。子网掩码错误netmask必须和你的网关在同一网段。计算错误会导致路由异常。一个快速验证方法是计算你配置的IP和网关的“网络地址”是否相同。例如IP192.168.31.150/24和网关192.168.31.1/24其网络地址都是192.168.31.0。网关不可达确认网关IP地址是否正确并且该设备通常是路由器确实在线且允许转发。防火墙检查本地是否有防火墙规则阻止了流量。Ubuntu 16.04默认可能安装了ufw。sudo ufw status如果是inactive则防火墙未启用。如果是active可能需要添加规则或暂时禁用(sudo ufw disable)来测试。5.4 问题速查表现象可能原因排查命令/方法接口无IP1. 接口名错误2. 配置文件语法错误3. NetworkManager冲突ip link showsudo cat -A /etc/network/interfacessudo systemctl stop NetworkManager能ping通IP不能ping通域名1. DNS未配置或错误2./etc/resolv.conf被覆盖cat /etc/resolv.confnslookup 域名 8.8.8.8完全无法ping通网关1. IP/网关不在同一网段2. 网关地址错误或设备关机3. 物理连接问题4. IP地址冲突ip route show检查网线/虚拟机设置更换IP地址测试网络服务重启失败1. 配置文件有语法错误2. 依赖服务问题sudo journalctl -u networking.service -xe6. 虚拟机与云环境下的特殊考量在VMware、VirtualBox等虚拟机或公有云如AWS、Azure中安装Ubuntu 16.04网络配置会有一些特殊性。6.1 虚拟机网络适配器模式这是影响虚拟机网络行为的首要设置桥接模式虚拟机的网卡直接连接到物理网络就像一台真实的机器。你需要从物理网络的DHCP服务器获取IP或设置一个与物理网络同网段的静态IP。配置方法与物理机无异。NAT模式虚拟机通过宿主机的IP地址上网。虚拟机通常会从虚拟DHCP服务器如VMware的VMnet8获取一个私有IP如192.168.xx.xx。此时虚拟机的网关是这个虚拟网络的网关而不是你物理路由器的IP。在NAT模式下如果你在虚拟机内设置静态IP必须设置成与虚拟网络同一网段否则无法上网。仅主机模式虚拟机只与宿主机通信形成一个封闭的网络。用于隔离测试。实操心得在虚拟机做网络实验时我推荐先用NAT模式让虚拟机先能通过DHCP上网确保基本系统、工具如net-tools可以安装。完成基础配置后再根据需求切换到桥接模式进行静态IP等高级配置的练习这样更安全。6.2 云服务器的网络配置在AWS EC2、阿里云ECS等云平台上Ubuntu 16.04镜像的网络通常是高度自动化的。云平台会通过元数据服务在实例启动时自动注入网络配置。你不应该也不需要通过修改/etc/network/interfaces来配置主网卡否则可能导致实例失联。云服务器的IP、网关、DNS等信息由云平台底层SDN管理。你需要关注的是安全组相当于云平台的防火墙必须放行相应的端口如SSH的22端口HTTP的80端口。弹性IP/公网IP在控制台进行绑定和解绑操作。多网卡/内网IP如果需要在控制台创建并挂载弹性网卡然后在系统内配置第二张网卡。对于云服务器除非有特殊需求如配置辅助网卡否则最好保持网络配置的默认自动获取状态。7. 从ifupdown向Netplan迁移的探索虽然/etc/network/interfaces在16.04上很稳定但了解Netplan对未来有益。在Ubuntu 16.04上启用Netplan需要一些手动步骤。7.1 安装与启用Netplan首先确保Netplan相关软件已安装sudo apt update sudo apt install netplan.io -y默认情况下系统可能仍在使用ifupdown。你需要禁用旧的网络服务启用Netplan及其后端如systemd-networkd。备份并清空旧配置sudo cp /etc/network/interfaces /etc/network/interfaces.backup sudo echo # 由Netplan管理 | sudo tee /etc/network/interfaces禁用旧服务启用新服务sudo systemctl stop networking sudo systemctl disable networking sudo systemctl stop NetworkManager # 如果不用也禁用 sudo systemctl disable NetworkManager sudo systemctl enable systemd-networkd sudo systemctl start systemd-networkd sudo systemctl enable systemd-resolved sudo systemctl start systemd-resolved # 将resolv.conf链接到systemd-resolved的stub sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf7.2 编写Netplan配置文件Netplan的配置文件在/etc/netplan/目录下通常是YAML格式如01-netcfg.yaml。创建一个配置文件对应之前静态IP的例子sudo nano /etc/netplan/01-static-ip.yaml内容如下network: version: 2 renderer: networkd # 服务器推荐使用networkd ethernets: ens33: # 你的网卡设备名 dhcp4: no addresses: [192.168.31.150/24] # 使用CIDR格式/24等同于255.255.255.0 gateway4: 192.168.31.1 nameservers: addresses: [8.8.8.8, 192.168.31.1]注意YAML的语法对缩进非常敏感必须使用空格不能使用Tab。7.3 应用Netplan配置使用以下命令测试并应用配置sudo netplan generate # 生成配置 sudo netplan apply # 应用配置应用后使用ip addr show和ping等命令验证网络是否正常。迁移警告在16.04上进行此操作有风险因为Netplan的支持可能不如在新版本上完善。务必在可物理接触的机器或做好恢复快照的虚拟机上尝试。我个人在16.04的生产环境中除非有明确需求否则仍倾向于使用经过时间检验的ifupdown方案。
返回列表