Ubuntu 16.04 Server / 如何配置静态 IP 地址

在 Ubuntu 16.04 Server 中,由 ifupdown 网络管理工具管理的静态 IPv4(互联网协议第 4 版)地址,应写入 /etc/network/interfaces 或其包含的配置文件。先核实实际接口、地址、子网掩码、网关和 DNS,备份配置并准备恢复控制台后再应用。

确认此方法是否适用

本文用于维护 Ubuntu 16.04 已有 ifupdown 配置中的普通单个有线接口。如果服务器由 Netplan、NetworkManager 或云初始化工具管理,不要直接添加相同配置。先确认当前管理工具和配置来源。

Ubuntu 16.04 是旧发行版,标准支持于 2021 年结束,常规 ESM(Expanded Security Maintenance,扩展安全维护)也于 2026 年结束。继续运行时,应通过 Canonical 的 Ubuntu 16.04 支持说明确认 Legacy 附加支持及迁移计划。本文并非新版 Ubuntu 的默认网络配置方法。

不同服务器的接口名可能不同。以下命令检查发行版、设备名、当前 IPv4 地址和默认路由。请找出实际承载连接的设备,不要直接照抄 enp0s3。

lsb_release -ds
ip -o link show
ip -4 addr show
ip -4 route
cat /etc/network/interfaces
dpkg -l ifupdown resolvconf

ip -4 route 中的 default via 表示默认网关,dev 后是对应接口。将其与配置文件对照,通过 dpkg -l 检查软件包安装状态。若文件不存在或管理方式不同,请停止并使用对应环境的方法。

选择地址、网关和 DNS

静态地址不能在服务器上随意挑选。使用管理员分配的地址,并核实 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)地址池的保留或排除规则,避免重叠。地址没有响应,不代表一定未被使用。

  • 地址与子网掩码:示例为 192.168.10.50 和 255.255.255.0,相当于 192.168.10.50/24。不要把该子网的网络地址 192.168.10.0 或广播地址 192.168.10.255 分配给主机。
  • 网关:示例使用同一网络内可直接到达的 192.168.10.1。本文单接口示例只配置一条默认路由。多网络或策略路由服务器需要单独设计。
  • DNS:指定将域名解析为 IP 地址的 DNS(Domain Name System,域名系统)服务器。示例中的 192.168.10.1 仅在该设备也处理 DNS 查询时适用。内部域名应使用能够解析它们的组织 DNS。

这些值只是一种私有网络示例。请按虚拟机的 NAT、桥接、仅主机网络或云平台分配规则修改。固定虚拟机私有地址与保留外部公网地址可能是不同的操作。

备份配置并将 DHCP 改为 static

  1. 先确认可以使用物理控制台、虚拟化控制台或云恢复控制台。仅靠 SSH(Secure Shell,安全外壳协议)修改地址,断线后可能无法恢复。安排停机窗口,记录旧地址、路由和 DNS。
  2. 将网络配置备份到独立位置。如备份名已存在,使用其他名称。
sudo cp -a /etc/network /etc/network.before-static-ip
sudoedit /etc/network/interfaces

若存在 source 或 source-directory,也要检查包含文件。实际接口定义在 /etc/network/interfaces.d/ 时,应修改该文件,不要在主文件重复定义。如果是云平台生成的文件,还要确认启动时是否会覆盖,以及服务商支持的配置方式。

  1. 找到以下 DHCP 配置段。修改实际接口已有的 IPv4 段,不是另建一个不同的设备名。
auto enp0s3
iface enp0s3 inet dhcp
  1. 仅将该段替换为以下内容。保留其他接口、IPv6、包含指令和回环配置。
auto enp0s3
iface enp0s3 inet static
    address 192.168.10.50
    netmask 255.255.255.0
    gateway 192.168.10.1
    dns-nameservers 192.168.10.1

此代码不能替代整个文件。不要删除已有的 auto lo 和 iface lo inet loopback。auto 指定启动时自动启用的接口,inet static 选择静态 IPv4。语法见 ifupdown interfaces 手册。

确认 dns-nameservers 生效的条件

dns-nameservers 与地址、默认路由的作用不同。Ubuntu 16.04 需要 resolvconf 及其 ifupdown 集成脚本正常工作,才能把该值传递到 DNS 配置。Ubuntu 16.04 resolvconf 手册说明了此集成,以及多个 DNS 地址用空格分隔的方式。

如果 /etc/resolv.conf 自动生成,直接编辑后可能被覆盖。以下命令查看实际目标与内容;若存在 resolvconf,也会列出已登记的 DNS 信息。

readlink -f /etc/resolv.conf
cat /etc/resolv.conf
if command -v resolvconf >/dev/null 2>&1; then
    resolvconf -l
fi

没有相应安装或集成时,单独添加 dns-nameservers 不会更改 DNS。应先确认实际 DNS 管理方式。某些配置在 resolv.conf 中显示本地缓存解析器地址,未直接显示外部 DNS 地址不等于失败。

应用配置并验证结果

  1. 保存后检查 ifupdown 读取到的接口设置。接口名、地址、掩码和网关应符合计划。此命令仅查询配置,不会应用到网络。
ifquery enp0s3

ifquery 成功不代表地址冲突或实际连接已验证。若报告错误或接口未定义,先修正包含文件、接口名和语法。功能范围见 ifupdown ifquery 与 ifup 手册。

  1. 准备好恢复控制台与停机窗口后,重启以应用启动配置。以下命令重启整个服务器,仅在准备完成后执行。
sudo reboot

仅重启网络服务,不保证旧地址和 DHCP 状态都会清除。反复重启也无法修复错误配置。启动后先在控制台核实地址与路由,再连接新 IP。

ip -4 addr show dev enp0s3
ip -4 route
ping -c 3 192.168.10.1
getent ahostsv4 ubuntu.com

按本例,接口应显示 192.168.10.50/24,路由应包含 default via 192.168.10.1 dev enp0s3。分开验证网关通信与域名解析。若环境禁止 ICMP 回复,不要仅凭 ping 失败判断故障,还应测试所需服务及其他客户端的连接。

排查故障并恢复原配置

没有地址时检查设备名、文件位置、管理工具和语法;有地址但无法访问其他网络时,检查掩码、网关和路由。IP 通信正常而名称访问失败时,检查 DNS 及内部域名策略。错误地址、DHCP 重叠分配、其他文件重复定义也可能造成故障。

可用 sudo systemctl status networking.service 和 sudo journalctl -u networking.service -b --no-pager 查看服务错误。服务状态正常不代表地址和通信正确,应与上文验证结果对照。

需要恢复时,在恢复控制台仅还原本次修改的文件。下例假定只修改了 /etc/network/interfaces。若修改了片段文件,应将对应备份恢复到相应位置;不要复制整个目录,覆盖备份后新增的无关配置。

sudo cp -a /etc/network.before-static-ip/interfaces /etc/network/interfaces
sudo reboot

原配置若使用 DHCP,重启后不保证拿到相同地址。在控制台核实分配地址和默认路由,确认 DNS 与管理连接均恢复后再结束操作。