Skip to content

绕过软路由的代理

如果在路由器上部署了代理(如 OpenClash),那么它下面的全部设备都处于代理下。问题在于,有些的应用(比如种子下载器)或设备不应该被代理。尽管它能按MAC地址区分是否代理,但这对同一个机器上的不同应用的流量,还是无能为力。

既然这样,那就让特定的应用的网络数据包,拥有特定的MAC地址就好了🤪。

INFO

MACvLAN:一种网络技术。它允许你在一块物理网卡上创建多个虚拟网卡,每个虚拟网卡都有独立的 MAC 地址,从而实现网络隔离和资源共享。

Docker 应用的 MACvLAN

在MACvLAN时,应用不再能使用宿主机的MAC地址和IP,因此需要指定新的IP。首先确定一些信息:局域网IP的范围,应用的IP,宿主机网卡的名称。
假设:局域网的IP范围为192.168.5/24,指定要绕过代理的应用的IP为192.168.5.40
查看宿主机网卡的名称,用以下命令。假设我的输出是ens34: 00:0c:29:f5:16:a3,那么我的网卡名称是ens34

shell
ip -o link show | grep -v 'docker' | grep -v 'veth' | awk 'NR==2 {print $2, $17}'

那么为Docker创建新的网络,根据以下命令:

shell
docker network create \
--driver macvlan \
--subnet=192.168.5.0/24 \
--gateway=192.168.5.1 \
--ipv6 \
--subnet=fd0d:7eb5:2afd::/64 \
--gateway=fd0d:7eb5:2afd::1 \
-o parent=ens34 \
my-macvlan

至于IPv6部分,不必修改,因为路由器会为其分配公网IP。

yaml
services:
  app:
    image: nginx
    networks:
      my-macvlan:
        ipv4_address: 192.168.5.40
networks:
  my-macvlan:
    external: true

在编写Docker Compose时,网络部分如此书写。

连通应用与宿主机

由于以太网的特性,导致使用MACvLAN的应用和宿主机,网络不连通。它和局域网的其他设备可连通。要解决此问题,可以使用一点小技巧,详见参考

应用绕过

来到 Portainer 的某个容器的详情界面,滑倒最底部,就可以看到其MAC地址。或者命令行法:进入容器后ip link show

OpenWRT 管理页 > OpenClash > 插件设置 > 黑白名单 > 不走代理的局域网设备 Mac
在这里添加刚才获得的MAC地址。

参考

使用 macvlan 为 Docker 配置 IPv6 - Cyrus's Blog