Appearance
使用 macvlan 为 qBittorrent 设置独立 IP
很多 PT 网站对盒子(就是专门用来刷上传的 VPS)有限制,如果群晖前面的主路由(比如 iStoreOS)上面配置了魔法工具,可能导致 BT/PT 流量也会走代理,从而被 PT 网站识别为盒子。比较好的解决这个问题的办法是在魔法软件上,通过端口或者 IP 来设置规则,来避免 PT 流量走代理。
但在有些魔法软件上面,并不支持针对端口来设置规则,只能针对 IP 来设置规则,好在为 Docker 设置独立的 IP 也不复杂。下面就介绍如何使用 macvlan 来给 qBittorrent 设置独立的 IP。
这篇教程虽然步骤比较多,但流程比较清晰。教程中涉及到的 IP 如下,为了尽量减少出错,你可以把自己的 IP 也都提前列出来,根据自己的实际情况来替换:
- 主路由 IP:
192.168.2.1
- 群晖 IP:
192.168.2.164
- 独立的 qBittorrent IP:
192.168.2.101
- macvlan 网桥:
192.168.2.102
启用 Open vSwitch
打开 控制面板
-> 网络
-> 网络界面
-> 管理
-> Open vSwitch 设置
,勾选 启用 Open vSwitch
并确定。
使用 SSH 登录 群晖,并切换到 root
用户。查看群晖网络:
sh
ip addr
可以看到,开启 Open vSwitch
之后,群晖通过一个名为 ovs_eth0
的网桥来连接网络。
创建 macvlan 网络
这里介绍下我的网络情况:主路由:192.168.2.1
(主路由安装了魔法),其它设备都通过主路由上网,你可以根据自己的网络情况修改:
如果只需要 IPv4,创建 IPv4 macvlan 网络命令:
sh
#创建一个名为 vlan 的 macvlan 网络,网关为主路由 192.168.2.1,子网为 192.168.2.0/24,ovs_eth0 为默认的网桥
docker network create -d macvlan --subnet=192.168.2.0/24 --gateway=192.168.2.1 -o parent=ovs_eth0 vlan
如果需要 IPv6,创建 IPv4 + IPv6 macvlan 网络命令:
sh
#创建一个名为 vlan 的 macvlan 网络,IPv4 网关为主路由 192.168.2.1,IPv4 子网为 192.168.2.0/24,IPv6 网关为 2408::1,IPv6 子网为 2408::/60,ovs_eth0 为默认的网桥
docker network create -d macvlan --subnet=192.168.2.0/24 --gateway=192.168.2.1 --ipv6 --subnet=2408::/60 --gateway=2408::1 -o parent=ovs_eth0 vlan
创建好之后,可以使用下面的命令查看 docker 网络:
sh
docker network ls
也可以在群晖的 Container Manager
的网络中查看:
如果需要删除创建的 macvlan 网络,可以使用下面的命令:
sh
#vlan 为 macvlan 网络名称
docker network rm vlan
使用 docker 命令安装 qBittorrent
提示
- 由于群晖 Container Manager 暂不支持添加额外的参数(比如
--net
,--ip
),所以只能通过命令安装 qBittorrent。 - 如果你之前装过套件版或者使用 Container Manager 安装了 qBittorrent,请先卸载,然后再用下面的命令重新安装。
建好 macvlan 网络之后,就可以使用下面的命令来安装 qBittorrent 了。可以将下面命令中的 端口
和 文件夹
按需修改:
sh
docker run -d \
--name=qbittorrent \
--net=vlan \
--ip=192.168.2.101 \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-e WEBUI_PORT=8080 \
-e TORRENTING_PORT=50000 \
-p 8080:8080 \
-p 50000:50000 \
-p 50000:50000/udp \
-v /volume1/docker/qbittorrent:/config \
-v /volume1/downloads:/downloads \
--restart unless-stopped \
lscr.io/linuxserver/qbittorrent:latest
这里的 --net=vlan
参数表示使用前面创建的 macvlan 网络,--ip=192.168.2.101
参数就是为 qBittorrent 设置的独立 IP,命令执行成功后,就可以用 192.168.2.101:8080
来访问 qBittorrent 了。
解决宿主机与 macvlan 网络互通问题
为了安全起见,macvlan 禁止宿主机和容器直接通信。以我的群晖为例,qBittorrent 容器的 IP 为 192.168.2.101
,宿主机群晖的 IP 为 192.168.2.164
,那么宿主机和容器之间就无法通信。
在群晖里直接 ping qBittorrent 容器的 IP 就会失败:
而使用网络中的其它设备 ping qBittorrent 容器的 IP 就可以成功:
这就导致群晖上面装的其它应用也无法和 qBittorrent 容器通信。解决办法如下:
创建一个 macvlan 网桥,并设置静态 ip,这里设置为:192.168.2.102
,设置路由,让宿主机(群晖 192.168.2.164
)访问容器的数据经过 macvlan 网桥。命令如下:
sh
ip link add vlan_bridge link ovs_eth0 type macvlan mode bridge
ip addr add 192.168.2.102 dev vlan_bridge
ip link set vlan_bridge up
ip route add 192.168.2.101 dev vlan_bridge
可以看到设置好 vlan_bridge 这个 macvlan 网桥之后,宿主机就可以访问 qBittorrent 容器了:
使用 systemd 管理 macvlan 服务
注意
由于群晖各个版本对 Docker 服务的命名有所变化,所以下面的命令需要根据群晖系统版本进行修改。下面默认的命令均适用于 DSM 7.2
版本。
DSM 7.2
:pkg-ContainerManager-dockerd.serviceDSM 7.1
:pkg-Docker-dockerd.serviceDSM 7.0
:pkgctl-Docker.service
由于群晖开机会重置 macvlan 网络相关的设置,需要添加 systemd
服务(Systemd 是目前 Linux 系统上主要的系统守护进程管理工具)来管理 macvlan。在命令行中输入下面命令:
vi 命令基本操作可以参考:vi 编辑器基本命令
sh
vi /usr/local/lib/systemd/system/macvlan.service
按 i
进入编辑模式,复制粘贴以下内容,作用是将启动、停止 macvlan 配置为 systemd
服务:
yml
[Unit]
Description=Macvlan shim to allow docker to route to host
# Ensure macvlan is stopped if pkg-ContainerManager-dockerd.service stops/fails
BindsTo=pkg-ContainerManager-dockerd.service
# Define dependency
Requires=pkg-ContainerManager-dockerd.service
# Ensure order of startup
After=pkg-ContainerManager-dockerd.service
[Service]
Type=oneshot
ExecStart=/bin/bash /usr/local/bin/macvlan_start.sh
ExecStop=/bin/bash /usr/local/bin/macvlan_stop.sh
RemainAfterExit=yes
Restart=no
[Install]
# Informs systemd to start macvlan after this service at startup
WantedBy=pkg-ContainerManager-dockerd.service
完成后按 esc
,输入:wq
保存退出。
接下来再添加两个脚本:
/usr/local/bin/macvlan_start.sh
用来启动 macvlan/usr/local/bin/macvlan_stop.sh
用来停止 macvlan。
编辑启动脚本:
sh
vi /usr/local/bin/macvlan_start.sh
内容如下:
yml
# 请根据自己的实际情况修改
ip link add vlan_bridge link ovs_eth0 type macvlan mode bridge
ip addr add 192.168.2.102 dev vlan_bridge
ip link set vlan_bridge up
ip route add 192.168.2.101 dev vlan_bridge
编辑停止脚本:
sh
vi /usr/local/bin/macvlan_stop.sh
内容如下:
yml
# 请根据自己的实际情况修改
ip route del 192.168.2.101 dev vlan_bridge || true
ip link set vlan_bridge down || true
ip addr del 192.168.2.102 dev vlan_bridge || true
ip link del vlan_bridge || true
启动脚本和停止脚本添加好之后,重载 systemd
服务:
sh
systemctl daemon-reload
现在就可以使用 systemd 来管理 macvlan 服务了。
sh
#开机启动
systemctl enable macvlan
#取消开机启动
systemctl disable macvlan
#开启 macvlan 服务
systemctl start macvlan
#停止 macvlan 服务
systemctl stop macvlan
#查看 macvlan 服务状态
systemctl status macvlan
执行 systemctl enable macvlan
设置开机启动后,可以重启群晖用上面的 systemctl status macvlan
查看 macvlan 服务是否正常(显示绿色 active
表示已经启动)。
设置访问控制
现在 qbittorrent 已经有独立的 IP(192.168.2.101),那么我们就可以在软路由的魔法插件中设置访问控制了。以 iStoreOS 中的 SSRP 插件为例:
如此,就可以避免 PT 流量走代理,从而被识别为盒子了。