BT 的机制会将本机的 IPv6“昭告天下”,可能会引来外部刺探,抵消 IPv6 超大地址空间的天然安全优势。
因此,想用 Docker 给 BT 分配一个独立的 IPv6 。
我在过去的帖子有讨论过类似的做法,简单过一下。
建一个 macvlan 网卡:
docker network create -d macvlan \
--subnet=192.168.x.0/24 \
--gateway=192.168.x.1 \
--ipv6 --subnet=fd00:8::/80 \
-o parent=外网网卡 \
-o macvlan_mode=bridge macvlan1
开一个 BT 的 Docker:
docker run -d \
--name=qbittorrent \
-e PUID=??? \ #防止文件权限都是 root 影响其他应用
-e PGID=??? \
-e TZ=Asia/Shanghai \
-e WEBUI_PORT=6666 \
--ip=192.168.x.211 --net=macvlan1\
--add-host=tracker.example.com:9.9.9.9 \ #固定 tracker 为 IPv4 地址,减少双栈上报的问题
-v 配置路径:/config \
-v 下载路径:/downloads \
--restart unless-stopped \
linuxserver/qbittorrent:4.4.5
要远程访问 IPv6 Docker ,一种是直接 DDNS ,过去的帖子讨论过。但配 SSL 还是有点小麻烦,这里选择在宿主的反代上统一处理,也顺便隐藏了 WebUI 入口。然而 macvlan 默认禁止宿主访问,可以参考网友的方案(国内 国外)来绕过:
ip link add brmv0 link 外网网卡 type macvlan mode bridge
ip addr add 192.168.x.210/32 dev brmv0 #子网中未用过的 IP
ip link set brmv0 up
ip route add 192.168.x.211/32 dev brmv0 #目标 Docker 的 IP
如此宿主就能通过 192.168.x.211:6666 访问容器。重启会失效,可以加入到开机脚本。顺便一提,也可用 IPv6 的私有段来互通。
如此配置,IPv4 的 UPnP 工作如常,容器能从路由获取 SLAAC IPv6 并正常访问,系统重启后亦是如此。
查看客户端回报到 tracker 的信息,IPv4 是公网 IP ,但 IPv6 却是 [::]。
此时在配置界面修改 BT 的监听端口或者网络接口一次,IPv6 上报就会变为容器的公网 IPv6 。
但容器只要重启,IPv6 上报的问题就会再次出现。
尽管只是一个小问题,还是让人有点头疼,尝试修改了多项 qBittorrent 的配置也未能解决。
个人推测,可能是 qBittorrent 启动得“太快”了,以至于网络接口还没来得及配置好 IPv6 。而当配置完成后,软件也没有及时更新信息。
于是,想到了一种简单粗暴的办法,即直接修改容器的启动脚本:
docker exec -it qbittorrent vi /init
在靠前的位置插入:
sleep 5
保存后再重启容器,IPv6 回报的问题就消失了。
考虑到 IPv6 配置延迟的问题可能会在不止这一个场景下出现,而且这个办法实在有失优雅,所以发出来想了解一下是否有更好的解决方案。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.