跳轉到內容

Oracle Cloud Debian 系統 IPv6 配置完全指南 | DD 後自動獲取教程

Oracle Cloud Debian IPv6 Configuration

在 Oracle Cloud(甲骨文雲)上通過 DD(重裝)方式安裝 Debian 系統後,很多用戶發現 IPv6 無法正常使用。這是因為 DD 過程改變了原有的網絡配置,導致系統無法從 Oracle Cloud 控制檯獲取已分配的 IPv6 地址。雖然 IPv4 連接正常,但浪費了 Oracle 提供的免費 IPv6 資源。本文將詳細介紹如何通過 systemd-networkd 重新配置網絡,讓 Debian 系統自動獲取並正常使用 IPv6。

為什麼 DD 後 IPv6 會失效?

問題根源分析

原因說明
🔄 網絡配置被覆蓋DD 過程寫入新的網絡配置文件,覆蓋 Oracle 默認配置
📄 ifupdown 侷限性Debian 默認的 ifupdown 不支持 Oracle Cloud 的 IPv6 分配機制
🔧 缺少 DHCPv6 客戶端DD 後的系統可能缺少必要的 DHCPv6 工具
⚙️ 內核參數缺失未啟用 IPv6 轉發和相關內核模塊

Oracle Cloud IPv6 分配機制

Oracle Cloud 使用 SLAAC(Stateless Address Autoconfiguration)DHCPv6 結合的方式分配 IPv6:

Oracle Cloud 控制檯
    ↓ 分配 IPv6 CIDR
虛擬雲網絡 (VCN)
    ↓ 路由配置
子網 (Subnet)
    ↓ 綁定到 VNIC
雲服務器實例
    ↓ SLAAC/DHCPv6
操作系統獲取 IPv6

關鍵點:

  • Oracle Cloud 為每個 VCN 分配一個 /56 的 IPv6 CIDR
  • 每個子網可以劃分多個 /64 子網
  • 實例通過 VNIC 自動獲取 IPv6 地址
  • 需要正確的網絡配置才能激活

解決方案對比

方案一:systemd-networkd(推薦)✅

優勢:

  • ✅ 系統自帶,無需額外安裝
  • ✅ 配置簡單,穩定性高
  • ✅ 支持自動獲取和持久化
  • ✅ Ubuntu 官方推薦方案

適用場景:

  • Debian 10/11/12
  • Ubuntu 18.04+
  • 所有 Oracle Cloud 實例類型

方案二:Netplan(Ubuntu 專用)

優勢:

  • ✅ Ubuntu 默認網絡管理工具
  • ✅ YAML 格式配置,易讀
  • ✅ 後端使用 systemd-networkd

劣勢:

  • ❌ Debian 需手動安裝
  • ❌ 增加依賴複雜度

方案三:手動配置靜態 IPv6

優勢:

  • ✅ 完全可控
  • ✅ 不依賴 DHCP

劣勢:

  • ❌ 配置複雜
  • ❌ IP 變更需手動更新
  • ❌ 不推薦動態雲環境

本文采用方案一:systemd-networkd,這是最穩定、最通用的解決方案。

前置準備

1. 確認 Oracle Cloud 控制檯已啟用 IPv6

在配置系統之前,確保 Oracle Cloud 控制檯已完成以下設置:

檢查清單:

☑️ VCN 已添加 IPv6 CIDR 塊
☑️ 子網已啟用 IPv6
☑️ 路由表已添加 ::/0 規則(指向 Internet Gateway)
☑️ 安全列表已允許 IPv6 流量
☑️ 實例 VNIC 已分配 IPv6 地址

如未完成,請參考:👉 Oracle Cloud 免費服務器開啟 IPv6

2. 備份現有網絡配置

bash
# 備份 interfaces 文件
sudo cp /etc/network/interfaces /etc/network/interfaces.backup

# 備份當前網絡狀態
ip addr show > ~/network_backup.txt
ip route show >> ~/network_backup.txt

# 記錄當前網卡名稱
ip link show | grep -E "ens|enp" | awk -F': ' '{print $2}'

3. 確保 SSH 連接穩定

⚠️ 重要警告: 網絡配置修改可能導致 SSH 斷連,建議:

  • 使用 Oracle Cloud Console 的串行控制檯作為備用連接方式
  • 或在本地保存所有命令,一次性執行
  • 或設置定時任務,5 分鐘後自動恢復原配置

詳細配置步驟

步驟 1:查看網口名稱

先用 ip link 命令看一下網卡名稱:

sh
ip link

輸出示例:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 ...
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 ...
    link/ether 02:00:17:05:xx:xx brd ff:ff:ff:ff:ff:ff

常見網卡名稱:

架構類型默認網卡名稱說明
AMD/Intel (x86_64)ens3大多數 AMD 實例
ARM (Aarch64)enp0s6Ampere A1 實例
其他情況eth0少數舊實例

快速判斷方法:

bash
# 查看默認路由對應的網卡
ip route | grep default | awk '{print $5}'

# 或查看有 IPv4 地址的網卡
ip -4 addr show | grep -E "inet " | awk '{print $NF}'

也可以看前面說到的 interfaces 配置文件:

bash
cat /etc/network/interfaces | grep auto

步驟 2:新建配置 .network 文件

新建文件 /etc/systemd/network/10-網卡名稱.network,添加配置如下:

重要提示

將下面的 網卡名稱 替換為你實際的網卡名稱(如 ens3enp0s6

bash
# 創建配置文件(以 ens3 為例)
sudo nano /etc/systemd/network/10-ens3.network

配置內容:

ini
[Match]
Name = ens3

[Network]
DHCP = ipv4
LinkLocalAddressing = ipv6
NTP = 169.254.169.254

[DHCP]
UseDNS = false
UseDomains = false

配置項詳解:

配置項說明
[Match] Nameens3匹配的網卡名稱
[Network] DHCPipv4僅對 IPv4 使用 DHCP
[Network] LinkLocalAddressingipv6啟用 IPv6 鏈路本地地址
[Network] NTP169.254.169.254Oracle Cloud 元數據服務(用於時間同步)
[DHCP] UseDNSfalse不使用 DHCP 提供的 DNS(避免衝突)
[DHCP] UseDomainsfalse不使用 DHCP 提供的域名搜索列表

對於 ARM 架構(網卡名為 enp0s6):

bash
sudo nano /etc/systemd/network/10-enp0s6.network

配置內容相同,只需將 Name = ens3 改為 Name = enp0s6

配置文件命名規則

  • 文件名格式:XX-描述.network
  • XX 是優先級數字(00-99),數字越小優先級越高
  • 建議使用 10- 開頭,確保優先加載

步驟 3:禁用默認的 ifupdown 並啟用 systemd-networkd

這一步是關鍵,需要一次性執行所有命令,避免網絡中斷後無法繼續:

bash
# 停止傳統網絡服務並啟動 systemd-networkd
sudo systemctl stop networking && \
sudo systemctl stop ifup@ens3 && \
sudo systemctl start systemd-networkd && \
sudo systemctl start systemd-resolved

注意事項

  • 上面的命令需要一次過執行(使用 && 連接),不然網絡停掉之後 SSH 也會斷線
  • 一定也要把命令中的 ens3 改成你的實際網卡名稱
  • 如果是 ARM 架構,將 ens3 替換為 enp0s6

驗證網絡連接:

bash
# 測試 IPv4 連通性
ping -c 3 8.8.8.8

# 測試 IPv6 連通性
ping6 -c 3 google.com

# 或
ping -6 -c 3 2001:4860:4860::8888

如果命令執行完後 SSH 正常連線,說明新的網絡配置成功了

步驟 4:驗證 IPv6 配置

檢查 IPv6 地址:

bash
# 查看所有網絡接口
ip -6 addr show

# 或
ifconfig | grep inet6

預期輸出:

2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 state UP qlen 1000
    inet6 2603:c1:3:b500:xxxx:xxxx:xxxx:xxxx/64 scope global dynamic noprefixroute
       valid_lft 7200sec preferred_lft 7200sec
    inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link
       valid_lft forever preferred_lft forever

關鍵字段說明:

  • scope global dynamic:全局單播地址(可公網訪問)
  • fe80:: 開頭:鏈路本地地址(僅內網通信)
  • valid_lft:地址有效期(秒)

檢查路由表:

bash
# 查看 IPv6 路由
ip -6 route show

# 應該有默認路由
::/0 dev ens3 proto ra metric 1024 pref medium

測試 IPv6 連通性:

bash
# 測試 Google IPv6 DNS
ping6 -c 4 2001:4860:4860::8888

# 測試 IPv6 網站
curl -6 https://ipv6.google.com

# 或使用在線測試
curl -6 https://api64.ipify.org

步驟 5:卸載 ifupdown 並設置 systemd-networkd 開機啟動

確認 IPv6 正常工作後,可以清理舊的網絡配置工具:

bash
# 設置 systemd-networkd 開機自啟
sudo systemctl enable systemd-networkd
sudo systemctl enable systemd-resolved

# 卸載 ifupdown 和相關工具
sudo apt purge -y --auto-remove ifupdown isc-dhcp-client

# 重啟網絡服務確保配置生效
sudo systemctl restart systemd-networkd

可選操作

如果你擔心卸載 ifupdown 後出現問題,可以先保留:

bash
# 僅禁用,不卸載
sudo systemctl disable networking
sudo systemctl mask networking

步驟 6:重啟服務器驗證

最後,重啟服務器驗證配置是否持久化:

bash
# 重啟系統
sudo reboot

# 等待 1-2 分鐘後重新 SSH 連接
ssh opc@你的IPv6地址

# 或
ssh -6 opc@[2603:c1:3:b500:xxxx:xxxx:xxxx:xxxx]

重啟後再次驗證:

bash
# 檢查 systemd-networkd 狀態
systemctl status systemd-networkd

# 檢查 IPv6 地址
ip -6 addr show ens3

# 測試連通性
ping6 -c 3 google.com

好了,現在你就可以正常使用 IPv6 了!🎉

故障排查

Q1: systemd-networkd 啟動失敗?

檢查日誌:

bash
sudo journalctl -u systemd-networkd -f
sudo journalctl -u systemd-networkd --since "5 minutes ago"

常見錯誤及解決:

錯誤 1:Failed to load configuration file
→ 檢查配置文件語法是否正確
→ 確認網卡名稱是否匹配

錯誤 2:Permission denied
→ 檢查文件權限:ls -l /etc/systemd/network/
→ 確保文件所有者為 root:chown root:root 文件名

錯誤 3:Device not found
→ 確認網卡名稱是否正確
→ 使用 ip link 重新查看

Q2: 獲取不到 IPv6 地址?

排查步驟:

bash
# 1. 檢查 Oracle Cloud 控制檯是否分配了 IPv6
# 登錄控制檯 → 實例詳情 → VNIC → 查看 IPv6 地址

# 2. 檢查路由器通告(RA)
sudo rddisc6 -D ens3

# 3. 手動請求 IPv6 地址
sudo dhclient -6 ens3

# 4. 檢查防火牆是否阻止 ICMPv6
sudo iptables -L -n | grep icmp6

# 5. 查看 systemd-networkd 日誌
journalctl -u systemd-networkd -f

Q3: IPv6 能獲取但無法上網?

可能原因:

  1. 路由表配置錯誤
  2. 安全列表未允許 IPv6
  3. DNS 解析問題

解決方案:

bash
# 1. 檢查默認路由
ip -6 route show | grep default

# 應該看到類似:
# ::/0 dev ens3 proto ra metric 1024 pref medium

# 2. 測試直接 IP 訪問
ping6 2001:4860:4860::8888

# 如果 IP 能 ping 通但域名不行,是 DNS 問題
# 編輯 /etc/resolv.conf 添加 IPv6 DNS
echo "nameserver 2001:4860:4860::8888" | sudo tee -a /etc/resolv.conf

# 3. 檢查 Oracle Cloud 安全列表
# 確保允許 ::/0 的入站和出站流量

Q4: 重啟後 IPv6 丟失?

檢查 systemd-networkd 是否開機自啟:

bash
systemctl is-enabled systemd-networkd
# 應該輸出:enabled

# 如果沒有啟用
sudo systemctl enable systemd-networkd

檢查配置文件是否存在:

bash
ls -l /etc/systemd/network/10-*.network

檢查是否有其他網絡管理器衝突:

bash
# 檢查 NetworkManager 是否運行
systemctl status NetworkManager

# 如果有,禁用它
sudo systemctl disable NetworkManager
sudo systemctl stop NetworkManager

Q5: 如何回滾到原始配置?

如果新配置出現問題,可以快速恢復:

bash
# 1. 停止 systemd-networkd
sudo systemctl stop systemd-networkd

# 2. 恢復備份的 interfaces 文件
sudo cp /etc/network/interfaces.backup /etc/network/interfaces

# 3. 啟動傳統網絡服務
sudo systemctl start networking

# 4. 重啟網絡
sudo systemctl restart networking

高級配置

1. 配置靜態 IPv6(可選)

如果你希望使用固定的 IPv6 地址,可以手動配置:

ini
# /etc/systemd/network/10-ens3.network

[Match]
Name = ens3

[Network]
DHCP = ipv4
Address = 2603:c1:3:b500:xxxx:xxxx:xxxx:xxxx/64
Gateway = fe80::1
DNS = 2001:4860:4860::8888
DNS = 2001:4860:4860::8844

注意

  • 靜態 IPv6 需要在 Oracle Cloud 控制檯預留該地址
  • 不建議新手使用,動態分配更靈活

2. 啟用 IPv6 轉發(做路由器用)

如果你的服務器需要作為 IPv6 路由器:

bash
# 編輯 sysctl 配置
sudo nano /etc/sysctl.d/99-ipv6-forwarding.conf

# 添加以下內容
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1

# 應用配置
sudo sysctl -p /etc/sysctl.d/99-ipv6-forwarding.conf

3. 配置 IPv6 防火牆

bash
# 安裝 ip6tables
sudo apt install -y ip6tables

# 允許 ICMPv6(IPv6 必需)
sudo ip6tables -A INPUT -p icmpv6 -j ACCEPT

# 允許已建立的連接
sudo ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允許 SSH
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT

# 拒絕其他入站流量
sudo ip6tables -A INPUT -j DROP

# 保存規則
sudo ip6tables-save > /etc/iptables/rules.v6

性能優化

1. 調整 IPv6 MTU

Oracle Cloud 推薦使用 MTU 9000(巨型幀):

bash
# 臨時設置
sudo ip link set dev ens3 mtu 9000

# 永久設置(添加到 .network 文件)
# 在 [Link] 段添加:
# MTUBytes = 9000

2. 禁用 IPv6 隱私擴展

隱私擴展會定期更換 IPv6 地址,可能導致連接不穩定:

bash
# 編輯 sysctl 配置
sudo nano /etc/sysctl.d/99-ipv6-privacy.conf

# 禁用隱私擴展
net.ipv6.conf.all.use_tempaddr = 0
net.ipv6.conf.default.use_tempaddr = 0
net.ipv6.conf.ens3.use_tempaddr = 0

# 應用配置
sudo sysctl -p /etc/sysctl.d/99-ipv6-privacy.conf

總結

為 Oracle Cloud Debian 系統配置 IPv6 的關鍵步驟:

  1. 確認控制檯配置:VCN、子網、路由、安全列表都已啟用 IPv6
  2. 創建 systemd-networkd 配置:編寫 .network 文件
  3. 切換網絡管理器:從 ifupdown 遷移到 systemd-networkd
  4. 驗證 IPv6 功能:測試地址獲取和連通性
  5. 清理舊配置:卸載 ifupdown,設置開機自啟

關鍵收益:

  • 🎯 充分利用 Oracle Cloud 免費 IPv6 資源
  • ⚡ 提升網絡性能和安全性
  • 🌐 支持 IPv6 -only 應用和服務
  • 🔧 配置簡單,維護方便

下一步學習:

享受完整的 IPv6 網絡體驗吧!🚀✨

最後更新於: