
1. 为什么Ubuntu 16.04的网络配置依然值得深究你可能觉得一个2016年发布的LTS版本现在谈它的网络配置是不是有点过时了毕竟Ubuntu 22.04 LTS都发布好一阵子了。但恰恰相反深入理解Ubuntu 16.04的网络配置在今天依然有非常现实的意义。首先很多企业内部的遗留系统、生产环境中的特定服务或者一些对稳定性要求极高的工业控制场景依然在稳定运行着Ubuntu 16.04。其次从学习的角度看16.04是一个承上启下的关键版本它同时支持了传统的ifupdown/etc/network/interfaces和当时新引入的Netplan作为技术预览是理解Linux网络配置演变的最佳标本。最后很多网络问题的排查思路和底层原理是相通的你在16.04上踩过的坑、学到的技巧在更新版本的系统上同样适用甚至能帮你更快地理解新工具的设计哲学。我自己就遇到过不少情况接手一个老项目服务器就是16.04网络不通导致部署卡住或者在虚拟机里复现某个老环境网络配置是第一步。网上教程虽多但要么过于简略只给命令要么新旧方法混杂让人困惑。这篇文章我就结合自己多年的运维和开发经验把Ubuntu 16.04网络配置的里里外外、从基础到排错给你一次讲透。无论你是刚接触Linux的新手还是需要维护老系统的运维都能找到直接可用的“抄作业”方案和避坑指南。2. 核心概念Ubuntu 16.04的网络管理“双轨制”在动手配置之前我们必须先理清Ubuntu 16.04网络管理的“门派”。这直接决定了你该编辑哪个文件使用哪套命令。很多人配置失败第一步就错了。2.1 传统派ifupdown与/etc/network/interfaces这是Linux世界沿用多年的经典网络配置方式通过编辑/etc/network/interfaces这个纯文本文件来定义网络接口。在Ubuntu 16.04上它默认仍然是主力配置方式。它的管理工具是ifup和ifdown命令以及/etc/init.d/networking服务。它的工作逻辑非常直观系统启动时networking服务会读取interfaces文件并按照里面的配置逐个“拉起”ifup定义的接口。你可以手动执行sudo ifdown eth0 sudo ifup eth0来重启某个接口。这种方式的优点是透明、直接配置内容一目了然排错时容易跟踪。缺点是对于复杂的、动态的网络环境比如多个网卡、VLAN、绑定bonding配置起来稍显繁琐且缺乏动态响应网络事件如热插拔网卡的能力。2.2 革新派Netplan的初代登场Ubuntu 17.10开始Netplan才成为默认配置工具。但在16.04中它已经作为一个“技术预览”被引入了。这意味着系统里已经安装了netplan.io包并且有一套基于YAML的全新配置方式。Netplan的设计理念是作为一个“渲染器”它本身不直接配置网络而是根据/etc/netplan/*.yaml中的声明式配置在后台生成对应底层网络守护程序如networkd或NetworkManager的配置文件再由它们去执行实际的网络配置。在16.04上Netplan默认的后端renderer是networkd即systemd-networkd。这是一个更现代化、更倾向于脚本化和自动化的网络管理方式。对于新手我强烈建议在16.04上优先使用并掌握传统的/etc/network/interfaces方式因为这是系统默认且最稳定的路径。Netplan可以作为了解未来趋势的备选但在生产环境的老系统上改动默认且稳定的工作方式需要充分测试。2.3 如何判断当前系统使用哪种方式这是一个非常关键的步骤。你可以通过以下命令快速判断检查关键配置文件ls -lh /etc/netplan/如果这个目录存在且里面有yaml文件比如01-netcfg.yaml说明系统可能启用了Netplan配置。但注意有文件不代表它正在生效。检查网络服务状态systemctl status systemd-networkd如果这个服务是active (running)并且/etc/netplan/下有配置那么很可能是Netplan在通过networkd管理网络。同时检查传统服务systemctl status networking如果它是active (exited)说明interfaces文件配置已被加载过。查看网络接口的当前管理者ps aux | grep -E (NetworkManager|networkd)或者使用ip link show查看接口但更准确的是看谁在管理/run/network/下的状态文件。一个简单的经验法则如果你的Ubuntu 16.04是桌面版并且你在桌面右上角看到了网络管理器小程序那么NetworkManager很可能在管理网络尽管它也可能读取interfaces。如果是服务器版且你没有手动安装NetworkManager那么默认就是ifupdown/etc/network/interfaces在管理。注意最危险的情况是两种方式混合配置同一个接口这会导致不可预测的行为比如接口反复被拉起、放下IP地址冲突等。在开始配置前请确保你只使用其中一套方案。3. 实战使用/etc/network/interfaces配置静态IP与动态IP这是最经典、最可靠的方法。我们假设你的主网络接口名是ens33在虚拟机中很常见或eth0在一些老硬件或云主机中。你可以用ip addr或ifconfig -a需安装net-tools来查看接口名。3.1 配置静态IP地址静态IP意味着网络参数IP、网关、DNS由你手动指定不会变化。这适用于服务器、需要固定地址访问的设备。首先备份原始配置文件sudo cp /etc/network/interfaces /etc/network/interfaces.backup然后用文本编辑器如vim或nano打开/etc/network/interfacessudo vim /etc/network/interfaces文件内容通常如下# The loopback network interface auto lo iface lo inet loopback # The primary network interface auto ens33 iface ens33 inet dhcp我们要将ens33从dhcp改为static并指定参数。修改后像这样# The loopback network interface auto lo iface lo inet loopback # The primary network interface - 静态IP配置 auto ens33 iface ens33 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.4 dns-search localdomain逐行解释与避坑点auto ens33告诉系统在启动时自动配置ens33接口。iface ens33 inet static定义接口ens33使用IPv4协议inet和静态配置static。address你为这台机器设定的固定IP地址。确保它在你的局域网网段内且未被占用。netmask子网掩码决定了本地网络的规模。255.255.255.0对应/24网段即IP地址前24位是网络号。gateway网关地址通常是你的路由器内网IP。所有非本网段的流量都会发往这里。填错会导致无法访问外网。dns-nameserversDNS服务器地址。可以写多个用空格隔开。这里用了谷歌的公共DNS。你也可以用你的运营商DNS或114.114.114.114。这个配置项非常关键没有它或填错会导致能ping通IP但无法解析域名如ping www.baidu.com失败。dns-searchDNS搜索域。当你不输入完整的域名时系统会尝试拼接这个后缀。例如设置dns-search mycompany.com后ping server1可能会尝试解析server1.mycompany.com。配置完成后需要重启网络服务使配置生效sudo systemctl restart networking或者更精准地重启单个接口sudo ifdown ens33 sudo ifup ens33重要提示如果你是通过SSH连接到这台服务器进行配置的并且SSH连接正是通过ens33这个接口那么执行sudo ifdown ens33会立即断开你的连接这是一个经典坑。安全的做法是使用screen或tmux会话这样即使网络断开命令仍在服务器上执行。将重启网络服务的命令设置为延迟执行例如sudo shutdown -r 2两分钟后重启整机慎用。最稳妥的办法是直接在服务器显示器前操作或者配置IP时额外添加一个临时IP确保至少有一条连接通路。验证配置ip addr show ens33 # 查看IP和掩码是否配置成功 ip route show # 查看默认网关default via ...是否正确 cat /etc/resolv.conf # 查看DNS配置是否已更新注意这里可能被其他服务覆盖 ping -c 4 8.8.8.8 # 测试网络连通性 ping -c 4 www.baidu.com # 测试DNS解析3.2 配置动态IPDHCP动态IP配置更简单适用于大多数桌面环境或不需要固定IP的客户端。如果你的网络中有DHCP服务器通常是无线路由器那么这是最省事的配置。同样编辑/etc/network/interfaces确保对应接口的配置是auto ens33 iface ens33 inet dhcp是的就这么简单。dhcp关键字告诉系统这个接口的所有网络参数IP、网关、DNS都从DHCP服务器自动获取。重启接口后用ip addr show ens33就能看到获取到的IP地址了。DHCP模式下DNS服务器信息通常也会由DHCP服务器下发并自动写入/etc/resolv.conf。3.3 多网卡与特殊配置示例有时一台服务器会有多个网卡用于不同的网络平面比如一个连接公网一个连接内网存储。假设我们有ens33公网和ens34内网。# 公网接口 - DHCP或静态 auto ens33 iface ens33 inet dhcp # 内网接口 - 静态IP不设默认网关 auto ens34 iface ens34 inet static address 10.0.0.100 netmask 255.255.255.0 # 注意这里没有gateway # 可以设置一个内网DNS或留空关键点默认网关gateway通常只在一个接口上设置。如果多个接口都设置了gateway系统会产生多个默认路由导致路由混乱网络行为不可预测。内网接口通常不需要网关或者需要添加特定的路由规则通过up route add ...命令。4. 探索与排错当网络不通时我们该如何一步步揪出问题配置写好了服务重启了但ping不通网关也上不了网。别慌这是学习网络最好的机会。按照以下链路从底层到上层系统性地排查。4.1 物理层与链路层检查首先确认最基础的东西有没有问题。ip link show ens33查看输出重点关注两个状态state UP表示网络接口物理上已启用link state。如果是state DOWN说明网卡没被激活。可以用sudo ip link set ens33 up来开启。LOWER_UP表示网线已连接物理链路通。如果看不到LOWER_UP检查网线是否插好或者虚拟机网络连接是否设置为“已连接”。对于虚拟机如VMware还要检查虚拟网络编辑器的设置确保你使用的网络模式NAT、桥接、仅主机符合你的预期。桥接模式下虚拟机会获得一个和宿主机同网段的独立IP像一台真实机器。NAT模式下虚拟机通过宿主机的IP共享上网外部网络无法直接访问虚拟机。4.2 网络层IP配置检查确认IP地址、子网掩码、网关是否按预期配置。ip addr show ens33检查inet后面跟着的IP和brd前面的掩码是否正确。一个常见错误是子网掩码算错了导致机器认为自己在一个错误的网段里。接着检查路由表ip route show你需要看到一条类似default via 192.168.1.1 dev ens33的条目这就是默认路由指向你的网关。如果没有说明网关没配成功。如果有多条default路由就会出问题。手动添加临时路由测试重启失效sudo ip route add default via 192.168.1.1 dev ens33如果添加后网络通了说明问题就在网关配置上回去检查/etc/network/interfaces里的gateway项。4.3 网关与ARP通信测试能ping通自己的IP但ping不通网关。这可能不是IP层的问题而是链路层的地址解析ARP出了问题。arp -n这个命令查看本地的ARP缓存表看是否有网关IP如192.168.1.1对应的MAC地址。如果没有或者显示incomplete说明ARP请求没收到回应。可能的原因网关IP地址写错了根本不存在这个IP。防火墙如网关上的禁止了ICMP或ARP回应。你和网关不在同一个二层广播域VLAN隔离等。你可以手动发送ARP请求并监听sudo arping -c 4 192.168.1.1如果收不到回复重点排查物理连接和网关设备本身。4.4 传输层及以上DNS与防火墙如果你能ping通网关192.168.1.1也能ping通公网IP如8.8.8.8但就是打不开网页那问题大概率出在DNS。cat /etc/resolv.conf检查里面的nameserver指向是否正确。在ifupdown体系下这个文件通常由resolvconf工具管理/etc/network/interfaces中的dns-nameservers配置会在接口up时被写入。但有时其他程序如NetworkManager、dhclient会覆盖它。可以手动修改/etc/resolv.conf测试但这不是持久化的方法。测试DNS解析nslookup www.baidu.com或者dig www.baidu.com如果超时或返回servfail说明DNS服务器不可达或配置错误。可以临时修改/etc/resolv.conf将nameserver改为8.8.8.8再测试。另一个隐形杀手是防火墙。Ubuntu 16.04默认安装了ufwUncomplicated Firewall但默认是禁用状态。检查一下sudo ufw status如果状态是active并且没有放行必要的端口就会阻断连接。对于内部测试可以先暂时关闭防火墙sudo ufw disable注意在生产环境关闭防火墙是最后的手段正确做法是添加允许规则。4.5 服务与配置回溯如果以上所有步骤都检查无误网络依然不通可能是更底层的问题。检查/etc/network/interfaces语法一个多余的空格、缩进错误虽然interfaces对缩进不严格但dns-nameservers等选项必须缩进都可能导致配置不被完全读取。可以用ifup -n ens33做一次“模拟”启动它会打印出将要执行的命令帮助发现错误。查看系统日志日志是排错的金矿。sudo journalctl -xe -u networking或者查看传统的系统日志sudo tail -f /var/log/syslog在重启网络服务时观察日志里有没有报错信息比如“unknown keyword”、“interface not found”等。核验DHCP过程如果是DHCP获取IP失败可以查看DHCP客户端的日志。sudo dhclient -v ens33这个命令会前台运行dhclient并输出详细过程看它是否发送了请求是否收到了服务器的offer。5. 进阶话题Netplan在Ubuntu 16.04上的尝鲜与局限虽然不推荐在生产环境的16.04上主要使用Netplan但了解它有助于平滑过渡到新版本。如果你的系统已经存在/etc/netplan/01-netcfg.yaml其内容可能类似network: version: 2 renderer: networkd ethernets: ens33: dhcp4: yes要配置静态IP可以修改为network: version: 2 renderer: networkd ethernets: ens33: addresses: [192.168.1.100/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4]关键步骤与区别子网掩码表示法不同Netplan使用CIDR表示法192.168.1.100/24等价于address 192.168.1.100和netmask 255.255.255.0。应用配置编辑完YAML文件后使用sudo netplan apply来应用配置。这个命令会生成systemd-networkd的配置文件并重启相关服务。调试如果配置不生效可以先用sudo netplan --debug apply查看详细生成过程。systemd-networkd的日志可以用sudo journalctl -u systemd-networkd查看。在16.04上使用Netplan的注意事项优先级冲突如果/etc/network/interfaces和/etc/netplan/都配置了同一个接口谁生效取决于系统启动顺序和服务依赖。为了避免混乱务必只使用其中一种方式。如果决定用Netplan建议将/etc/network/interfaces里对应接口的配置注释掉并禁用networking服务sudo systemctl disable networking。功能可能不全16.04的Netplan版本较早一些新版本的语法和功能可能不支持。遇到复杂配置如网桥、绑定时可能不如直接写interfaces文件或使用新版本系统方便。学习成本YAML格式对缩进敏感写错了格式会导致应用失败。对于从interfaces文件转过来的人需要适应新的语法。6. 虚拟机与云环境下的特殊配置考量很多朋友是在VMware、VirtualBox或公有云上安装Ubuntu 16.04这里有一些额外的坑点。6.1 VMware虚拟机网络适配器类型在VMware中创建虚拟机时网络适配器类型可以选择“桥接”、“NAT”、“仅主机”等。这决定了虚拟机的网络位置。桥接模式虚拟机会直接连接到宿主机所在的物理网络像一个新设备。配置静态IP时需要确保IP在物理网络的网段内且未被占用。这是最像真实机器的模式。NAT模式虚拟机通过宿主机的IP地址共享上网。此时虚拟机的网关地址通常是宿主机虚拟网卡如VMnet8的IP例如192.168.xxx.2而不是物理路由器的IP。在Ubuntu里配置静态IP时gateway必须填这个地址可以在宿主机的VMware Network Editor里查看DNS可以填这个网关地址或者像8.8.8.8这样的公网DNS。仅主机模式虚拟机只和宿主机及其他同模式虚拟机组成一个封闭网络无法访问外网。通常用于纯内部测试。常见问题在NAT模式下按照物理网络的参数配置了IP和网关导致无法上网。务必搞清楚虚拟机所处的虚拟网络拓扑。6.2 云主机AWS/Aliyun/Tencent Cloud等公有云主机的情况更特殊。它们通常通过一个名为cloud-init的服务在首次启动时注入网络配置。这个配置可能会覆盖你手动修改的/etc/network/interfaces。在Ubuntu 16.04的云镜像上网络配置往往由/etc/network/interfaces.d/目录下的文件管理而主interfaces文件只是source它们。例如source /etc/network/interfaces.d/*在这种情况下直接修改主文件可能无效。你需要找到具体的配置文件比如/etc/network/interfaces.d/50-cloud-init.cfg。修改前最好先了解云服务商的最佳实践有些云商推荐通过控制台或元数据服务来修改网络配置而不是直接改系统文件。另一个云环境的典型问题是网卡名称可能不是eth0而是类似ens5、eno1这样的“可预测网络接口名”。你需要用ip link确认正确的名称。6.3 配置持久化与重启验证无论怎么配最后一定要做一件事重启验证。sudo reboot重启后再次登录系统使用ip addr、ip route、ping等命令检查网络配置是否在重启后依然正确生效。很多问题如服务启动顺序、脚本权限只在重启时才会暴露。这是将临时配置变为永久配置的最后一道检验。网络配置是系统管理的基本功在Ubuntu 16.04这个经典版本上掌握好/etc/network/interfaces这套方法足以应对绝大多数场景。理解每个配置项的含义掌握从物理层到应用层的排错链路比死记硬背命令更有价值。当你再遇到“网络不通”的提示时希望这篇文章能帮你快速定位到那个被填错的网关或者那条被遗忘的DNS。