情景描述
在NAS中,如果开启了TUN代理,但此时并不希望所有的容器都被接管,那么可以通过把不想被接管的容器分配到新建的一个网络中并使用独立ip,再把这些ip从代理的配置文件中进行排除。
此时会遇到的问题:假如新建的网络名称为others,那么宿主机从本身的host网络,不能直接通过ip+端口的形式访问到这些位于others网络中的容器。于是以下给出创建虚拟接口的解决方案。
解决方案
假设在others网络中有从192.168.2.210-192.168.2.213这些容器。
下面这套命令可以直接复制到 NAS 的 SSH 里执行。它会:
Plain Text
1. 创建 /usr/local/bin/shim.sh
2. 自动识别 others 网络是 macvlan 还是 ipvlan
3. 创建 shim 虚拟接口
4. 添加 192.168.2.209/32
5. 添加到 192.168.2.208/28 的路由
6. 创建 systemd 开机自启服务直接执行:
Bash
mkdir -p /usr/local/bin
cat > /usr/local/bin/shim.sh <<'EOF'
#!/bin/sh
PARENT_IF="eth1"
SHIM_IF="shim"
SHIM_IP="192.168.2.209/32"
CIDR="192.168.2.208/28"
DOCKER_NET="others"
# 等待 Docker 网络出现,最多等 60 秒
i=0
while [ $i -lt 60 ]; do
DRIVER="$(docker network inspect "$DOCKER_NET" --format '{{.Driver}}' 2>/dev/null)"
if [ -n "$DRIVER" ]; then
break
fi
i=$((i + 1))
sleep 1
done
if [ -z "$DRIVER" ]; then
echo "Docker network $DOCKER_NET not found"
exit 1
fi
# 如果 shim 不存在,则按 others 网络类型创建
if ! ip link show "$SHIM_IF" >/dev/null 2>&1; then
if [ "$DRIVER" = "macvlan" ]; then
ip link add "$SHIM_IF" link "$PARENT_IF" type macvlan mode bridge
elif [ "$DRIVER" = "ipvlan" ]; then
ip link add "$SHIM_IF" link "$PARENT_IF" type ipvlan mode l2
else
echo "Unsupported docker network driver: $DRIVER"
exit 1
fi
fi
# 添加 shim IP
ip addr show "$SHIM_IF" | grep -q "192.168.2.209/32" || \
ip addr add "$SHIM_IP" dev "$SHIM_IF"
# 启用接口
ip link set "$SHIM_IF" up
# 添加到 容器网段的路由
ip route show "$CIDR" | grep -q "$SHIM_IF" || \
ip route add "$CIDR" dev "$SHIM_IF"
echo "shim ready: $DRIVER $SHIM_IF $SHIM_IP -> $CIDR"
EOF
chmod +x /usr/local/bin/shim.sh然后创建开机自启服务:
Bash
cat > /etc/systemd/system/shim.service <<'EOF'
[Unit]
Description=Create shim interface for Docker macvlan/ipvlan network
After=network-online.target docker.service
Wants=network-online.target docker.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/shim.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable shim.service
systemctl start shim.service检查是否成功:
Bash
systemctl status shim.service --no-pager
ip addr show shim
ip route show 192.168.2.208/28正常应该看到类似:
Plain Text
192.168.2.209/32
192.168.2.208/28 dev pt-shim然后在 NAS 本机测试 Lucky 能不能回源:
Bash
curl -I http://192.168.2.211:9091如果你的 qB 是:
Plain Text
192.168.2.210:18091
192.168.2.212:18092
192.168.2.213:18093也可以测试:
Bash
curl -I http://192.168.2.210:18091
curl -I http://192.168.2.212:18092
curl -I http://192.168.2.213:18093以后重启 NAS,shim.service 会自动运行。