---
url: https://eoht.net/vps/oracle-cloud/debian-ipv6.md
description: >-
  DD Debian 后先核对 Oracle Cloud 云端 IPv6、实际网卡和网络管理器，再为 DHCPv4 场景配置
  systemd-networkd，并通过控制台切换、DNS 检查、回退与重启验证确认结果。
---

# 甲骨文云 DD Debian 系统自动获取 IPv6 {#oracle-cloud-debian-ipv6-setup}

DD 重装会改变系统镜像和网络配置；即使控制台已经给 VNIC 分配 IPv6，新系统也不一定已配置获取方式。先完成 [Oracle Cloud 云端 IPv6 配置](./ipv6.md)，再检查系统。Debian 镜像可能使用 ifupdown、systemd-networkd、NetworkManager，或由 cloud-init / Netplan 生成配置，不能按发行版名称直接判断。

本文的 `.network` 示例适用于使用 systemd-networkd、IPv4 由 DHCP 获取、IPv6 使用 DHCPv6 与路由通告（RA）的实例；配置语义参考 Debian 12 对应的 systemd 252。静态 IPv4、多网卡、策略路由或专用网络镜像需要保留其额外配置，不能直接替换成此最小示例。

## 识别网卡与当前管理器 {#identify-network-interface}

```sh
cat /etc/os-release
ip -br link
ip -br address
ip route
ip -6 route
systemctl is-active networking systemd-networkd NetworkManager
systemctl is-enabled networking systemd-networkd
ls -l /etc/resolv.conf
cat /etc/resolv.conf
```

结合服务状态和配置文件核对实际接口。`ens3`、`enp0s6` 等都只是可能的名称，与 CPU 类型不能形成可靠的一一对应关系。

设置后续检查使用的变量，把示例值替换为实际接口；更换终端会话后也需重新设置：

```sh
net_if='ens3'
```

| 当前配置来源 | 处理方式 |
| --- | --- |
| 已由 systemd-networkd 直接管理 | 用 `networkctl status 接口名` 找到命中的 `.network` 文件，在原配置中合并 IPv6 设置 |
| Netplan 或 cloud-init 生成 | 修改其源配置，避免只改生成文件导致重启后被覆盖 |
| ifupdown | 查看 `/etc/network/interfaces` 及其引入文件；需要迁移时按后文控制台流程处理 |
| NetworkManager | 使用其连接配置管理 IPv6，不同时让 networkd 接管相同接口 |

DNS 要单独确认：networkd 获得 DNS 地址不等于应用已经在使用它。若已使用 systemd-resolved，应确认服务和 `/etc/resolv.conf` 链接有效；若 DNS 文件依赖 ifupdown/resolvconf 生成，必须先安排迁移后的解析方式，不能停掉旧管理器后还依赖其更新该文件。

## 创建或合并 .network 配置 {#create-systemd-networkd-config}

先保留现有配置和服务启用状态。下面以确实存在 `/etc/network` 的 ifupdown 主机为备份示例；根据已确认的管理方式备份对应目录，并把备份路径另行记录：

```sh
network_backup="$HOME/network-before-$(date +%Y%m%d-%H%M%S)"
mkdir -m 700 "$network_backup"
sudo cp -a /etc/network "$network_backup/network"
if [ -d /etc/systemd/network ]; then
  sudo cp -a /etc/systemd/network "$network_backup/networkd"
fi
sudo cp -a /etc/resolv.conf "$network_backup/resolv.conf"
systemctl is-enabled networking systemd-networkd > "$network_backup/unit-state.txt"
printf '%s\n' "$network_backup"
```

`is-enabled` 遇到 disabled 等状态可返回非零；检查记录内容，区分正常状态和单元不存在。任一配置备份失败时先处理失败，不进入切换。

已由 networkd 管理时，编辑 `networkctl status` 显示的源文件并保留原有配置。首次从 ifupdown 迁移时，可新建 `/etc/systemd/network/10-oracle-ipv6.network`，但要先确认这个文件名未被使用，且没有排序更靠前、会匹配同一接口的 `.network` 文件。

```ini
[Match]
Name=ens3

[Network]
DHCP=yes
IPv6AcceptRA=yes
LinkLocalAddressing=ipv6
```

把 `ens3` 换为真实接口名。`DHCP=yes` 启用 DHCP 客户端支持，`IPv6AcceptRA=yes` 允许接收路由通告；IPv6 地址和默认路由需要分别核对。保留原镜像要求的 DHCP 标识、MTU、路由和 DNS 设置，不用这个最小示例覆盖它们。networkd 采用第一个匹配的 `.network` 文件，新增文件不一定会生效。[systemd 252 的 network 配置说明](https://www.freedesktop.org/software/systemd/man/252/systemd.network.html)

## 通过控制台切换到 systemd-networkd {#disable-ifupdown-and-enable-systemd-networkd}

如果接口已经由 networkd 管理，只需在具有恢复条件时应用修改，并进入下一节验证。下面的迁移流程限定为：单网卡、当前由 ifupdown 管理 IPv4 DHCP、networkd 原先未运行，且 DNS 已有迁移后仍可工作的配置。

::: warning
切换会中断网络。先实际登录云平台串行控制台，确认能执行管理命令；只有 SSH 入口时不要继续。把配置备份路径和下方回退步骤保留在控制台可访问的位置，不依赖中断后的 SSH 会话。
:::

在控制台重新设置前文已核对的接口变量，并检查是否还有对应的 ifup 实例单元：

```sh
net_if='ens3'
systemctl status networking "ifup@${net_if}.service" --no-pager
```

逐步停止已确认的旧管理单元，再启动 networkd。不要在 SSH 会话中把停止与启动命令串成一条来赌连接恢复。

```sh
sudo systemctl stop networking
```

只有上一步确认对应 `ifup@` 单元存在且活动时，才额外停止它：

```sh
sudo systemctl stop "ifup@${net_if}.service"
```

确认旧管理器已释放目标接口后启动新管理器：

```sh
sudo systemctl start systemd-networkd
networkctl status "$net_if"
sudo journalctl -u systemd-networkd -b -n 80 --no-pager
```

检查日志中的配置解析、匹配文件、DHCP 和 RA 情况。如果新配置没有正确接管，先按本页末尾回退，再诊断原因；不要立即移除 ifupdown 或 DHCP 客户端。

## 验证后设置开机管理方式 {#remove-ifupdown-and-enable-networkd-at-boot}

在控制台检查地址、路由和 DNS；`net_if` 使用前文已经核对的接口名。

```sh
ip -4 address show dev "$net_if"
ip -6 address show dev "$net_if"
ip -4 route show
ip -6 route show
getent ahostsv4 www.cloudflare.com
getent ahostsv6 www.cloudflare.com
```

应看到预期的 IPv4、与 VNIC 分配一致的 IPv6 全局地址及所需默认路由。`fe80::` 地址不足以证明公网可用。再通过已安装的 curl 测试两种协议的直连；`--noproxy '*'` 排除代理设置对检查结果的影响：

```sh
curl --noproxy '*' -4 -I --connect-timeout 10 https://www.cloudflare.com/
curl --noproxy '*' -6 -I --connect-timeout 10 https://www.cloudflare.com/
```

另开新的 SSH 会话并验证实际服务。SSH 恢复只证明该次连接可达，不能代替 IPv6、DNS 与重启测试。

从 ifupdown 迁移且以上检查都通过后，编辑原 `/etc/network/interfaces` 及其引入文件，移除目标接口的 `auto` / `allow-hotplug` / `iface` 段，保留回环接口等仍需使用的配置。然后设置启动方式：

```sh
sudo systemctl enable systemd-networkd
sudo systemctl disable networking
```

保留旧软件包和备份，在可接受中断的时间重启，再重复地址、路由、DNS、IPv4/IPv6 连接与新 SSH 会话检查。确认持久性后再评估是否清理旧组件；获取 IPv6 不要求立即卸载 `ifupdown` 或 `isc-dhcp-client`。

### 迁移失败时回退

以下仅对应本文“新建 `10-oracle-ipv6.network`、原由 ifupdown 管理”的迁移。若原本就是 networkd，应恢复编辑前的源配置并重新应用，而不是切换到 ifupdown。

在控制台把 `network_backup` 设为之前记录的真实备份目录，先确认备份存在。停止新管理器，将本次新文件移出匹配目录，恢复原 ifupdown 配置：

```sh
network_backup='替换为先前记录的完整备份路径'
sudo systemctl stop systemd-networkd
sudo mv /etc/systemd/network/10-oracle-ipv6.network "$network_backup/10-oracle-ipv6.network.failed"
sudo cp -a "$network_backup/network/." /etc/network/
sudo systemctl start networking
```

根据备份中的 `unit-state.txt` 恢复原来的开机启用状态；若曾修改 DNS 配置，也应恢复对应的源配置。重复检查原 IPv4、默认路由、DNS 和新 SSH 连接，待恢复后再排查 IPv6。不要在未确认备份与目标路径时照抄回退命令。
