Logo
Esc
输入关键词开始搜索
Overview

由宿主机直接访问本机中其他网络分组的容器

发布于 2026年4月30日 10:37
编辑于 2026年4月30日 12:35
1 分钟阅读
-

情景描述

在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 会自动运行。

评论