Skip to content

原生Docker IPv6 NAT模式 (DSM 7.x)

Windman edited this page Dec 17, 2023 · 1 revision

方法和步骤类似DSM 6,针对DSM 7需略做调整。

⚠️ 操作之前,请确保ip6相关的ko和so模块都已安装到位

修改模块加载列表/usr/syno/etc.defaults/iptables_modules_list的方式在DSM 7中不起作用,经测试是因为系统内置命令iptablestool无法加载模块,原因未知。

采用最直接的方式,修改/var/packages/Docker/scripts/start-stop-status启动脚本,暂时没有更优雅的方式。

在docker启动之前用insmod命令加载模块,并更新/var/packages/Docker/etc/dockerd.json文件,确保ipv6, fixed-cidr-v6, ip6tables, experimental这4个参数存在,启用原生IPv6 NAT模式。

# install modules
iptablestool --insmod "${DockerServName}" ${InsertModules}

$DockerUpdaterBin postinst updatedockerdconf "$(get_install_volume_type)"

insmod /lib/modules/nf_nat_ipv6.ko &> /dev/null
insmod /lib/modules/nf_nat_masquerade_ipv6.ko &> /dev/null
insmod /lib/modules/ip6t_MASQUERADE.ko &> /dev/null
insmod /lib/modules/ip6table_nat.ko &> /dev/null
insmod /lib/modules/ip6table_raw.ko &> /dev/null
insmod /lib/modules/ip6table_mangle.ko &> /dev/null
cat /var/packages/Docker/etc/dockerd.json | jq '. + {experimental: true, "fixed-cidr-v6": "fd07::/64", ip6tables: true, ipv6: true}' > /var/packages/Docker/etc/dockerd.json2; mv -f /var/packages/Docker/etc/dockerd.json{2,}

# start docker
if ! start_docker_daemon; then
    exit 1
fi

⚠️ 注意:DSM 7.2.1 Docker已经更名为ContainerManager,docker配置文件修改参考上文/var/packages/ContainerManager/etc/dockerd.json,启动脚本路径变更为/var/packages/ContainerManager/scripts/start-stop-status。除此之外需要安装更多的mod,否则重启后部分mod会无法加载,原因尚未明确,怀疑是群晖加了限制,对于未签名的ko会在内核启动的某个阶段移除。修改脚本内容如下。

# install modules
iptablestool --insmod "${DockerServName}" ${InsertModules}

$DockerUpdaterBin postinst updatedockerdconf "$(get_install_volume_type)"

# start docker event watcherd
/usr/syno/bin/synosystemctl start "${DockerEventWatcherd}"

insmod /lib/modules/nfnetlink.ko &> /dev/null
insmod /lib/modules/ip_set.ko &> /dev/null
insmod /lib/modules/ip_set_hash_ip.ko &> /dev/null
insmod /lib/modules/xt_set.ko &> /dev/null
insmod /lib/modules/ip_set_hash_net.ko &> /dev/null
insmod /lib/modules/xt_mark.ko &> /dev/null
insmod /lib/modules/xt_connmark.ko &> /dev/null
insmod /lib/modules/xt_comment.ko &> /dev/null

insmod /lib/modules/nf_conntrack_ipv6.ko &> /dev/null
insmod /lib/modules/nf_defrag_ipv6.ko &> /dev/null

insmod /lib/modules/xt_TPROXY.ko &> /dev/null
insmod /lib/modules/xt_socket.ko &> /dev/null
insmod /lib/modules/iptable_mangle.ko &> /dev/null
insmod /lib/modules/textsearch.ko &> /dev/null
insmod /lib/modules/ts_bm.ko &> /dev/null
insmod /lib/modules/xt_string.ko &> /dev/null

insmod /lib/modules/ip6_tables.ko &> /dev/null
insmod /lib/modules/nf_nat.ko &> /dev/null
insmod /lib/modules/nf_nat_ipv6.ko &> /dev/null
insmod /lib/modules/nf_nat_masquerade_ipv6.ko &> /dev/null
insmod /lib/modules/ip6t_MASQUERADE.ko &> /dev/null
insmod /lib/modules/ip6table_nat.ko &> /dev/null
insmod /lib/modules/ip6table_raw.ko &> /dev/null
insmod /lib/modules/ip6table_mangle.ko &> /dev/null
cat /var/packages/ContainerManager/etc/dockerd.json | jq '. + {experimental: true, "fixed-cidr-v6": "fd00::/80", ip6tables: true, ipv6: true}' > /var/packages/ContainerManager/etc/dockerd.json2; mv -f /var/packages/ContainerManager/etc/dockerd.json{2,}

# start docker
if ! start_docker_daemon; then
	exit 1
fi

⚠️ 群晖默认没创建docker这个组,需要把它创建出来并修复权限

sudo synogroup --add docker
sudo chown root:docker /var/run/docker.sock

重启docker (DSM 7.1需重启2次,否则在Docker应用内不显示网络信息,原因未知),DSM 7.2.1重启系统也是可以的。

# DSM 7.1
sudo synopkg restart Docker

# DSM 7.2.1
sudo systemctl restart pkg-ContainerManager-dockerd.service

查看docker状态

# DSM 7.1
sudo synopkg status Docker

# DSM 7.2
sudo systemctl status pkg-ContainerManager-dockerd.service

查看docker日志

sudo tail /var/log/Docker/docker.log -n 100
sudo tail /var/packages/Docker/var/log/docker.log -n 100 (DSM 7.1路径变化)
# DSM 7.2.1 路径
/var/packages/ContainerManager/var/log/docker.log

测试IPv6连通性

sudo docker run --rm busybox ping -6 -c4 2400:3200::1