在 Oracle Cloud + Proxmox VE 中为 LXC 分配独立公网 IPv4
前言
本文记录如何在 Oracle Cloud Infrastructure(OCI)ARM 实例中添加一块额外 VNIC,并通过 Proxmox VE 宿主机的策略路由和 iptables,为一个 LXC 容器分配独立公网 IPv4。
本文使用的实际环境如下:
| 项目 | 配置 |
|---|---|
| PVE 版本 | Proxmox VE 9.2.9 |
| 宿主系统 | Debian 13 / ARM64 |
| 主网卡 | enp0s3 |
| PVE 容器网桥 | vmbr0 |
| 容器网段 | 10.10.10.0/24 |
| 新增 OCI VNIC | vnic2026080708 |
| 新增 VNIC 在宿主中的名称 | enp1s0 |
| VNIC MAC | 02:00:17:02:64:BB |
| VNIC 私网 IP | 10.0.0.43 |
| VNIC 公网 IP | 158.180.68.192 |
| LXC 容器 ID | 108 |
| LXC 主机名 | debian-vnic |
| LXC 内网 IP | 10.10.10.109 |
文中不包含任何宿主机或容器密码。
一、网络实现原理
OCI 不会直接把公网 IPv4 配置到 Linux 网卡上。公网地址 158.180.68.192 实际由 OCI 映射到 VNIC 的私网地址 10.0.0.43。
完整流量路径如下:
互联网客户端
│
▼
158.180.68.192(OCI 公网 IP)
│ OCI 公网 NAT
▼
10.0.0.43(enp1s0)
│ PVE 宿主 DNAT
▼
10.10.10.109(LXC CT 108)
容器访问互联网时走反向路径:
LXC 10.10.10.109
│ PVE 宿主 SNAT
▼
10.0.0.43(enp1s0)
│ OCI 公网 NAT
▼
158.180.68.192
因此,容器内部仍使用 10.10.10.109,但从公网访问时使用 158.180.68.192,容器主动访问互联网时显示的出口地址也会是 158.180.68.192。
这种方案不会把 OCI VNIC 直接桥接给 LXC,可以避免 OCI 的 MAC/IP 校验与 Linux 同网段多网卡路由冲突。
二、OCI 控制台准备
在 OCI 控制台中完成以下操作:
- 为 PVE 实例创建并附加额外 VNIC。
- 确认 VNIC 与 PVE 实例位于可通信的 VCN 和子网中。
- 为 VNIC 分配私网 IPv4,例如:
10.0.0.43
- 为该私网 IP 关联临时或保留公网 IPv4,例如:
158.180.68.192
- 在 OCI Security List 或 NSG 中放行需要的入站端口,例如 SSH:
Source: 0.0.0.0/0
Protocol: TCP
Destination port: 22
生产环境不建议长期允许任意来源访问 SSH,最好将来源限制为自己的固定公网 IP。
三、确认宿主机识别到了新 VNIC
登录 PVE 宿主机,执行:
ip -br link
ip -br addr
本例新增网卡为:
enp1s0 DOWN 02:00:17:02:64:aa
确认 MAC 地址与 OCI 控制台中显示的 VNIC MAC 一致:
02:00:17:02:64:AA
如果网卡名称不确定,也可以执行:
for dev in /sys/class/net/*; do
printf '%s ' "$(basename "$dev")"
cat "$dev/address"
done
四、创建 LXC 容器
本例使用已经下载到 PVE 的 Debian 13 ARM64 模板:
local:vztmpl/debian-13-trixie-default_20260806_arm64.tar.xz
创建 CT 108:
pct create 108 \
local:vztmpl/debian-13-trixie-default_20260806_arm64.tar.xz \
--hostname debian-vnic \
--arch arm64 \
--ostype debian \
--storage local \
--rootfs local:8 \
--cores 1 \
--memory 512 \
--swap 512 \
--features nesting=1 \
--unprivileged 1 \
--net0 name=eth0,bridge=vmbr0,firewall=1,ip=10.10.10.109/24,gw=10.10.10.1,type=veth \
--nameserver '1.1.1.1 8.8.8.8' \
--searchdomain local \
--password '请替换为强密码' \
--start 1
检查容器状态:
pct status 108
pct config 108
五、修正 Debian 模板的静态网络
部分 LinuxContainers Debian 模板自带 DHCP 网络配置,可能覆盖 PVE 写入的静态地址。可以在容器内显式写入 systemd-networkd 配置:
“`bash
pct exec 108 — bash -c ‘cat > /etc/systemd/network/eth0.network <<EOF
[Match]
Name=eth0
[Network]
Address=10.10.10.109/24
Gateway=10.10.10.1
DNS=1.1.1.1
DNS=8.8.8.8

