使 tproxy 模式支持 docker 容器

由于默认情况下 docker 加载的 iptables 网桥模块并不被 tproxy 所支持,v2rayA 在 tproxy 模式下会添加一条规则跳过 docker 容器的代理。而根据 springzfx/cgproxy#10 ,如果你不需要避免 hairpin nat 问题,可通过一些操作使得 tproxy 模式重新支持代理 docker 容器。

下面介绍利用透明代理生命周期钩子修改 iptables 规则使得 tproxy 支持 docker 容器。生命周期钩子的介绍见 生命周期钩子 一节。

编写如下脚本,将其存储于 /etc/v2raya/tproxy-hook.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash

# parse the arguments
for i in "$@"; do
case $i in
--transparent-type=*)
TYPE="${i#*=}"
shift
;;
--stage=*)
STAGE="${i#*=}"
shift
;;
-*|--*)
echo "Unknown option $i"
shift
;;
*)
;;
esac
done


case "$STAGE" in
post-start)
# at the post-start stage
if [ "$TYPE" = "tproxy" ]; then
# we check if the transparent type is tproxy, and if so, we disable the bridge netfilter call and remove the docker rule in the TP_RULE chain.
modprobe br_netfilter
sysctl net.bridge.bridge-nf-call-ip6tables=0
sysctl net.bridge.bridge-nf-call-iptables=0
sysctl net.bridge.bridge-nf-call-arptables=0
iptables -t mangle -D TP_RULE -i br-+ -j RETURN
iptables -t mangle -D TP_RULE -i docker+ -j RETURN
fi
;;
*)
;;
esac

exit 0

赋予可执行权限:

1
sudo chmod +x /etc/v2raya/tproxy-hook.sh

启动 v2raya 时添加参数 --transparent-hook /etc/v2raya/tproxy-hook.sh