IPv6

使用 Incus 和 OpenWrt 实现 IPv6 自动配置及网络转发

本文总结了在 Incus(原 LXD)环境中配置 OpenWrt 容器,并通过系统配置实现 IPv6 自动化配置及网络转发的过程。通过配置网络接口和调整防火墙规则,能够实现 IPv6 的正常使用。

来自ChatGPT润色,不明白为何所有AI都要删除我这个原话,应该是口语化以及不确定。

混合systemd-networkd配置openwrt0网卡,添加默认路由,额外配置接受RA,sysctl应该被systemd-networkd屏蔽了

事实上sysctl设置的参数,确实没用。在网上看到了相关说法。

一、OpenWrt 容器配置

首先,OpenWrt 容器通过 Incus 配置好网络接口。以下是容器的部分配置:

architecture: x86_64
config:
  boot.autostart: "true"
  security.privileged: "true"
devices:
  eth0:
    nictype: physical
    parent: eth0
    type: nic
  eth1:
    network: openwrt0
    type: nic
  ppp:
    path: /dev/ppp
    type: unix-char
profiles:
- default

关键点:

  1. eth0 接口 连接到宿主机的物理网络。
  2. eth1 接口 连接到虚拟网络 openwrt0,用于内部网络通信。

二、OpenWrt 网络配置

在 OpenWrt 容器中,设置了 IPv6 的 DHCPv6 和路由通告服务,使得局域网中的设备能够自动配置 IPv6 地址。关键配置如下:

config interface 'lan'
    option proto 'static'
    option device 'eth1'
    option ipaddr '10.209.47.254'
    option netmask '255.255.255.0'
    option ip6assign '64'
    option dhcpv6 'server'
    option ra 'server'

关键点:

  • IPv4 地址 设置为 10.209.47.254,用于内部网络管理。
  • IPv6 地址 通过 ip6assign 和 DHCPv6 服务自动分配,确保局域网设备可以通过 SLAAC 获取 IPv6 地址。

三、宿主机网络配置

宿主机通过 systemd-networkd 管理虚拟网卡 openwrt0,并接受来自 OpenWrt 容器的路由通告。以下是相关的 systemd-networkd 配置文件:

[Match]
Name=openwrt0

[Network]
Gateway=10.209.47.254
Address=10.209.47.1/24
IPv6AcceptRA=yes
IPv6Forwarding=yes

关键点:

  • IPv6AcceptRA:启用该选项确保宿主机接受来自 OpenWrt 的路由通告,自动获取 IPv6 地址。
  • IPv6Forwarding:开启 IPv6 转发,允许网络中的设备通过宿主机的 IPv6 地址进行通信。

四、手动启动 eth1 接口并添加防火墙规则

为了确保每次启动时 eth1 网络接口正常工作,并设置合适的防火墙规则,创建了一个 systemd 服务文件:

[Unit]
Description=Add default route and up eth1 after LXD startup
After=incus.service

[Service]
Type=oneshot
ExecStart=sh -c 'ip link set eth1 up && ip6tables -A FORWARD -j ACCEPT'

[Install]
WantedBy=multi-user.target

关键点:

  • eth1 接口 在 Incus 启动后自动启用。
  • 防火墙规则 设置为接受所有 IPv6 转发流量,确保网络之间的通信正常。

总结

通过合理配置 OpenWrt 容器和宿主机的网络接口,以及添加必要的防火墙规则,可以有效实现 IPv6 的自动配置和网络转发功能。这一方案适用于需要在虚拟化环境中构建复杂网络拓扑的场景。