V2Ray、Karing、Clash 使用总结
这三款软件确实代表了不同的方向:V2Ray 是功能强大的协议标准,Clash 是备受推崇的规则引擎,而 Karing 是新生的跨平台通用客户端。你可以先通过下表快速了解它们的核心区别:
| 对比维度 | V2Ray (以v2rayN为例) | Clash (以Clash Verge Rev为例) | Karing |
|---|---|---|---|
| 软件定位 | 代理客户端,专注于V2Ray/Xray生态 | 统一代理平台,以灵活的规则分流为核心 | 通用的、现代化的代理工具,旨在兼容其他配置 |
| 平台支持 | Windows原生支持,Mac/Linux需借助其他前端 | 跨平台,各系统均有成熟GUI | 支持主流平台 (Windows, macOS, Linux, iOS, Android) |
| 核心优势 | 协议支持最广 (VMess/VLESS等),可深度定制 | 规则分流功能强大,代理组策略 (自动测速、故障转移) 成熟 | 上手快,UI现代,配置同步方便,生态融合好 |
| 配置方式 | JSON格式,主要通过图形界面单项添加或导入 | YAML格式,学习曲线陡峭,高度灵活 | 高度兼容Clash/V2Ray等订阅链接,可多源合并 |
| 技术内核 | 直接调用V2Ray/Xray核心 | 基于Clash核心 (Meta/mihomo) | 基于高性能Sing-Box核心,常被形容为"现代化的Clash" |
| 适用人群 | Windows忠实用户,追求最新V2Ray协议 | 追求精细化分流,有多设备同步需求,愿意学习配置 | 追求简单易用、现代UI、跨平台一致体验的用户 |
核心特点深度解析
-
V2Ray (以v2rayN为例):老牌协议专家 它的强大之处在于对V2Ray/Xray生态的全套协议(如VMess, VLESS, Mux等)支持非常全面。如果你对网络代理的原理有研究,追求极致的性能和协议的抗审查能力,它的原始速度和隐匿性在某些场景下更具优势。
缺点:
- 跨平台弱:主要是Windows平台的工具,在macOS和Linux上体验打折扣。
- 规则分流功能较弱:在复杂多节点分流、自动切换策略上,不如Clash和Karing灵活。
-
Clash (以Clash Verge Rev为例):分流规则大师 它真正的价值在于强大的规则分流引擎。你可以通过一个灵活的YAML配置文件,实现一套规则在多台电脑和手机上完美同步,尤其适合订阅了多个机场服务的高级用户。
缺点:
- 学习曲线陡峭:YAML配置对新手不太友好,不熟悉的话会感到困惑。
- 传统客户端问题:经典的"Clash for Windows"已停止维护,建议转向Clash Verge Rev等活跃分支。
- 协议支持不完整:对V2Ray生态中的部分高级协议(如VLESS)支持需要依赖Clash Meta等变种内核。
-
Karing:跨平台现代新秀 Karing更像一个现代化的"集大成者"。它拥有漂亮流畅、界面统一的图形界面,易用性很高。它的兼容性很好,既可以用Clash的YAML配置,也支持V2Ray的链接。此外,它的高级同步功能(如iCloud)和设备间配置同步非常方便。
缺点:
- 作为新项目,生态和深度评测较少。
- 深度定制灵活性:可能与Clash的高阶DIY玩法有一定差距,更适合大多数用户而非"硬核发烧友"。
- 配置兼容性:对部分复杂的Clash配置支持可能不完全。
如何根据你的情况选择?
你可以根据自己的情况和偏好,在以下三个方向中选择:
-
方向一:追求强大分流与多设备同步 → 选Clash (Clash Verge Rev)
- 理想用户:拥有多台设备、习惯于订阅多种服务的用户。
- 核心原因:唯一的YAML配置文件可以在所有平台通用。自动测速和故障转移等高级分流策略能让多节点管理变得非常省心。
-
方向二:渴望极简体验与现代UI → 选Karing
- 理想用户:追求操作简单、开箱即用的用户。
- 核心原因:上手几乎没有门槛,界面现代美观,支持多种流行订阅格式。如果你在寻找一个能统一管理多平台设备、充满现代感的工具,Karing是绝佳选择。
-
方向三:协议至上与性能控 → 选V2Ray (v2rayN)
- 理想用户:熟悉网络技术,希望发挥出节点全部性能的硬核用户。
- 核心原因:它是V2Ray/Xray这个协议家族的"本家"客户端,能第一时间获得对最新协议和混淆技术的支持,性能表现出色。
Docker 中部署 Clash 代理
对于"在Docker中长期运行,并为其他服务提供SOCKS5代理"这个需求,我依然推荐 Clash (Meta内核) 方案。相比V2Ray,它在管理、规则分流和社区生态上都更适合这个场景。
这里主要有三种实现方式,操作复杂度由浅入深。你可以根据对网络隔离度的要求来选择:
三种方案速览与选择
| 特性 | 方案A: 最简端口映射 ✅ 首选 | 方案B: 桥接网络 | 方案C: 透明代理 (TUN) |
|---|---|---|---|
| 场景适用 | 常规服务共享代理(API、爬虫、脚本等) | 服务与代理容器在自定义网络内通信 | 全能型/网关部署(想统一出口,无需应用配置) |
| 优点 | 实现最简单;其他服务只需配置代理地址 | 网络隔离性好;服务名即地址,不依赖宿主机IP | 真正全透明(TCP/UDP/ICMP);不需要应用主动支持 |
| 缺点 | 需要每个应用单独配置代理 | 配置稍复杂;容器间依赖管理 | 配置最复杂;需privileged权限,有一定侵入性 |
| 配置代理地址 | http://宿主机IP:7890socks5://宿主机IP:7891 |
http://clash:7890socks5://clash:7891 |
无需配置,自动接管所有流量 |
| 推荐度 | 高,简单稳定 | 中,适合有网络隔离需求的场景 | 较低,除非有UDP等特殊要求 |
以下是通用的准备工作:
- 选择镜像:由于原版
dreamacro/clash已停止更新,建议使用更活跃的metacubex/mihomo(Clash Meta内核),它支持更多协议。 - 准备配置:需要准备一个
config.yaml文件,通常是你的机场提供的订阅链接转换而成。
文件准备示例 (
config.yaml): 放置一份你最熟悉的配置文件即可。如果你还没有,可以先创建一个最简单的文件作为模板,待确认容器正常工作后再切换。1# config.yaml 核心片段 2port: 7890 3socks-port: 7891 4allow-lan: true 5bind-address: "0.0.0.0" 6mode: rule 7log-level: info 8 9# 上游代理节点列表 (proxies) 10proxies: 11 - name: "My-Node" 12 type: ss 13 server: your.server.com 14 port: 443 15 cipher: chacha20-ietf-poly1305 16 password: "password" 17 18# 代理组策略 (proxy-groups) 19proxy-groups: 20 - name: "PROXY" 21 type: select 22 proxies: 23 - "My-Node" 24 25# 分流规则 (rules) 26rules: 27 - GEOIP,CN,DIRECT 28 - MATCH,PROXY 29 30# 外部控制 (external-controller) 31external-controller: 0.0.0.0:9090
方案A: 最简端口映射(docker run)
这是最直接的方案,通过 -p 参数将容器内的代理端口暴露给宿主机,其他服务即可通过宿主机IP访问。
-
拉取镜像:
1docker pull metacubex/mihomo:latest -
准备并放置配置文件: 确保你已经有一个可用的
config.yaml配置文件。然后创建并进入工作目录:1mkdir -p ~/clash/config && cd ~/clash 2cp /path/to/your/config.yaml ./config/ # 将你的配置文件复制到此处 -
运行容器: 执行以下命令启动一个名为
clash的容器,它会将容器的7890(HTTP)、7891(SOCKS5) 和9090(控制器) 端口映射到宿主机。1docker run -d \ 2 --name clash \ 3 --restart always \ 4 -v ~/clash/config:/root/.config/mihomo \ 5 -p 7890:7890 \ 6 -p 7891:7891 \ 7 -p 9090:9090 \ 8 metacubex/mihomo:latest参数说明:
--restart always保证容器在宿主机重启或意外退出后能自动恢复,实现"长时间运行"。 -
结果: 完成部署后,你的SOCKS5代理地址就是
socks5://宿主机IP:7891,HTTP代理地址为http://宿主机IP:7890。
让你的其他服务"用上"代理
有了上述基础,其他服务就可以通过以下方式使用你的代理了:
- 为Docker容器单独配置:在运行其他容器时,通过
-e参数注入环境变量。1docker run -d \ 2 --name my-service \ 3 -e HTTP_PROXY="http://宿主机IP:7890" \ 4 -e HTTPS_PROXY="http://宿主机IP:7890" \ 5 your-service-image - 为
docker pull配置(适用于拉取镜像):- 为Docker守护进程创建配置文件:
1sudo mkdir -p /etc/systemd/system/docker.service.d 2sudo tee /etc/systemd/system/docker.service.d/proxy.conf <<EOF 3[Service] 4Environment="HTTP_PROXY=http://宿主机IP:7890" 5Environment="HTTPS_PROXY=http://宿主机IP:7890" 6Environment="NO_PROXY=localhost,127.0.0.1,.local" 7EOF - 重新加载配置并重启Docker服务:
1sudo systemctl daemon-reload 2sudo systemctl restart docker注意:此方法仅影响
docker pull命令,不适用于运行中的容器。
- 为Docker守护进程创建配置文件:
验证与运维
-
验证代理是否生效: 在宿主机或任意能访问的客户端运行:
1curl -x http://宿主机IP:7890 https://ip.sb 2curl -x socks5h://宿主机IP:7891 https://ip.sb如果返回的IP地址是你代理服务器的IP,则说明配置成功。
-
常用运维命令:
1docker logs clash # 查看日志 2docker restart clash # 重启容器 3docker stop clash # 停止容器 4docker start clash # 启动容器
方案B: 桥接网络 (Docker Compose)
- 方案B: 桥接网络 (Docker Compose):当需要更精细的网络隔离时,可以使用桥接模式。具体实践可以查阅相关教程。
- 方案C: 透明代理 (TUN):如果要代理不支持设置代理的应用,或需要转发UDP等非HTTP流量,可以考虑开启TUN模式,它需要容器以
host网络模式运行并启用privileged权限。
深入探讨 方案B:桥接网络 (Docker Compose),这是一种在服务间实现清晰隔离与高效协作的绝佳实践。
与方案A直接将代理端口暴露给宿主机不同,方案B的核心是构建一个 完全内部化的代理网络,将运行代理的容器和需要使用代理的服务器容器,都"搬"进同一个由Docker管理的虚拟网络中。所有流量都在这张内部网络中传输,无需经过宿主机网络栈,从而实现了更好的隔离与性能。
下面是详细的实施步骤,共分为三大步,最终能实现"其他容器通过Clash容器名称访问代理"。
第一步:编写 docker-compose.yml
这是方案B的核心,它定义了整个蓝图。它创建一个自定义网络(clash-net),并将两个服务都连接到这个网络上。
1# docker-compose.yml
2
3version: '3.8'
4
5# 1. 定义自定义网络
6networks:
7 clash-net:
8 driver: bridge
9 # 可选:让这个网络可以被外部容器连接,方便调试
10 attachable: true
11
12services:
13 # 2. 代理服务容器 (Mihomo/Clash)
14 clash:
15 image: metacubex/mihomo:latest
16 container_name: clash
17 restart: always
18 volumes:
19 # 将宿主机的配置文件挂载进容器
20 - ./config:/root/.config/mihomo
21 ports:
22 # 可选:如果需要从宿主机外部访问,保留端口映射
23 - "7890:7890" # HTTP 代理端口(可选)
24 - "7891:7891" # SOCKS5 代理端口(可选)
25 - "9090:9090" # 外部控制端口(可选)
26 networks:
27 - clash-net
28 # 如果需要透明代理 (TUN) 模式,取消下面的注释
29 # cap_add:
30 # - NET_ADMIN
31 # devices:
32 # - /dev/net/tun
33
34 # 3. 示例:你的业务服务容器
35 my-app:
36 image: your-service-image:latest
37 container_name: my-app
38 restart: always
39 networks:
40 - clash-net
41 environment:
42 # 内部服务通过服务名访问代理
43 - HTTP_PROXY=http://clash:7890
44 - HTTPS_PROXY=http://clash:7890
45 - NO_PROXY=localhost,127.0.0.1,.local
46 # 这个服务不需要 ports 映射,它在网络内部是隔离的
这个配置文件主要在干三件事:
networks:定义了一个名为clash-net的桥接网络。设置attachable: true是可选的,方便外部容器临时加入调试。services:定义了两个服务。clash:代理服务容器,使用了metacubex/mihomo镜像,并为它设置了网络。my-app:代表你的业务服务容器。关键在于它的networks连接到了clash-net,并在environment中配置了代理,代理地址直接写**clash:7890**(即代理服务的服务名和它内部的HTTP代理端口)。
ports:是可选的。如果你的所有服务都运行在自定义网络中,就不需要映射代理端口。但出于调试或外部服务(如浏览器)的使用,可以保留这些映射。
第二步:准备配置文件
-
准备
config.yaml:在docker-compose.yml同级目录下创建config文件夹,并放入你的config.yaml。特别注意:allow-lan字段必须设置为true,bind-address设置为0.0.0.0,这样代理服务才能监听来自网络内部其他容器的请求。1# config/config.yaml (核心片段) 2port: 7890 3socks-port: 7891 4allow-lan: true 5bind-address: "0.0.0.0" -
部署启动:
1docker-compose up -d
第三步:方案验证
验证内部服务my-app能否通过clash服务访问外网:
1# 进入 my-app 容器内部
2docker exec -it my-app sh
3
4# 在容器内使用 curl 测试
5curl http://ip.sb
如果能看到国外的IP地址,说明配置成功。
方案 B 的优势总结:为什么值得这么做?
相比方案A的"端口映射"法,方案B有两个核心优势:
- 极致的服务隔离:所有代理流量都只在Docker的"封闭小区"里流动,既不会因为多个服务抢占代理端口而冲突,也不会受宿主机网络环境影响,是一个干净的内部网络。
- 便捷的服务发现:在方案B的自定义网络里,容器之间可以直接使用服务名(如
http://clash:7890)进行通信。不再需要去查动态变化的宿主机IP,大大降低了配置和维护成本。
补充提醒与建议
- 配置即代码,方便迁移:将所有配置写在
docker-compose.yml里,可以轻松实现完整的备份和迁移。 - 关于TUN模式:如果需求需要处理非HTTP/HTTPS流量(如UDP),可以开启TUN模式,但需要更多配置,例如在
clash服务中添加cap_add: - NET_ADMIN和devices: - /dev/net/tun。 - 与方案A的对比:方案A适合"服务在宿主机外,但需要连接代理"的场景。而方案B是完全意义上的容器原生方案,是现代云原生应用部署代理服务的标准方式,值得深入掌握。
方案C: 透明代理 (TUN)
方案C的TUN模式,是通过在系统里创建一个虚拟网卡,在更底层"拦截"所有流量并进行分析和路由的技术。它能让应用在"不知情"的情况下,流量就被代理了,从而实现真正的"全局代理"。
下面详细展开它的工作原理、配置方法、测试验证和关键要点。
深度剖析:TUN模式的工作原理
为了更好地理解TUN模式,我们可以把它和之前介绍过的方案A和B做个对比:
| 特性 | 方案A/B: Socks5/HTTP代理 | 方案C: TUN 模式 |
|---|---|---|
| 工作方式 | 工作在应用层(第7层),需要应用主动支持代理协议。 | 在操作系统内核层(第3层)虚拟一个网卡(如 utun),主动"拦截"所有流量。 |
| 代理范围 | 主要处理 HTTP/HTTPS 协议的流量。 | 接管所有IP层流量,包括 TCP、UDP、ICMP(ping 命令用到的协议)。 |
| 核心优势 | 配置灵活,可按域名或IP灵活分流。 | 无需应用主动支持,实现真正的全局代理。 |
| 典型应用 | 浏览器、curl、wget 等支持代理设置的应用。 |
游戏加速、Docker容器代理、系统更新、UDP应用等。 |
| 配置成本 | 较低。 | 较高,需要更多系统权限和网络知识。 |
TUN模式之所以能接管所有流量,主要依赖虚拟网卡、DNS劫持和路由表操作这三个核心技术:
- 虚拟网卡 (
utun):它在系统中创建了一个虚拟网络接口,就如同新增了一张虚拟网卡。系统所有出站的IP数据包(无论是TCP、UDP还是ICMP)都会被复制一份发送给这张虚拟网卡,从而被 Clash 内核捕获。 - DNS 劫持 (DNS Hijacking):这是防止DNS泄露的关键。TUN模式会拦截所有发往标准DNS端口(如53端口)的查询请求,由代理软件接管并用自己的DNS逻辑处理,确保域名解析也通过代理,解决了传统代理模式中DNS可能泄露的问题。
- 路由表操作 (
auto-route):为了确保所有流量都被"引导"到虚拟网卡,Clash会自动修改系统的路由表和策略路由,让这些流量"心甘情愿"地进入我们设置的"通道"。
动手实操:部署 TUN 模式
在Docker中启用TUN模式,通常需要采用 host 网络模式并赋予容器特权。
1. 编写 docker-compose.yml
创建一个 docker-compose.yml 文件,内容如下。这是部署的核心,定义了容器如何运行。
1# docker-compose.yml
2
3services:
4 mihomo:
5 image: metacubex/mihomo:latest
6 container_name: mihomo-tun
7 restart: always
8 # 关键配置1: 必须使用 host 网络模式,才能接管宿主机网络
9 network_mode: "host"
10 # 关键配置2: 赋予特权,让容器能操作宿主机网络设备
11 privileged: true
12 volumes:
13 # 挂载配置文件
14 - ./config.yaml:/root/.config/mihomo/config.yaml:ro
15 # 可选: 挂载UI文件
16 # - ./ui:/ui
17 environment:
18 - TZ=Asia/Shanghai
19 # 关键配置3: 添加必要的系统权限
20 cap_add:
21 - NET_ADMIN
22 - SYS_MODULE
关键点解释:
network_mode: "host": 让容器与宿主机共享网络命名空间,使容器内的网络操作能直接影响宿主机。这是TUN模式的必要条件。privileged: true: 给予容器所有系统权限,确保iptables、ip route等底层命令能成功执行。cap_add: [NET_ADMIN, SYS_MODULE]: 显式允许容器进行网络管理和加载内核模块。
2. 配置 config.yaml
配置的核心是启用 tun 模块并正确设置相关参数。以下是一个配置文件示例,请根据你的实际情况调整。
1# config.yaml
2mixed-port: 7890
3allow-lan: true
4bind-address: '*'
5mode: rule
6log-level: info
7
8# DNS 配置,对 TUN 模式的稳定性至关重要
9dns:
10 enable: true
11 listen: 0.0.0.0:1053
12 enhanced-mode: fake-ip # 推荐使用 fake-ip 模式
13 fake-ip-range: 198.18.0.1/16
14 nameserver:
15 - 223.5.5.5
16 - 119.29.29.29
17 fallback:
18 - https://dns.google/dns-query
19 - https://cloudflare-dns.com/dns-query
20
21# TUN 模式的核心配置
22tun:
23 enable: true # 启用 TUN 模式
24 stack: mixed # 协议栈推荐用 mixed,兼容性更好
25 dns-hijack: # 劫持标准 DNS 端口
26 - any:53
27 auto-route: true # 自动添加路由表
28 auto-redir: true # 自动配置 iptables/nftables 重定向
29 auto-detect-interface: true # 自动检测出口网卡
30
31# 代理节点列表
32proxies:
33 # 在这里填入你的代理节点信息
34 # - name: "example"
35 # type: ss
36 # server: example.com
37 # port: 443
38 # cipher: chacha20-ietf-poly1305
39 # password: "password"
40
41# 代理组策略(可按需配置)
42proxy-groups:
43 - name: "PROXY"
44 type: select
45 proxies:
46 - "DIRECT"
47
48# 分流规则
49rules:
50 # 优先保证本地网络和SSH的连通性
51 - IP-CIDR,127.0.0.0/8,DIRECT
52 - IP-CIDR,192.168.0.0/16,DIRECT
53 - IP-CIDR,10.0.0.0/8,DIRECT
54 - IP-CIDR,172.16.0.0/12,DIRECT
55 # 以下示例将中国的流量直连
56 - GEOIP,CN,DIRECT
57 # 放行所有其他流量
58 - MATCH,PROXY
关键参数解释:
dns.enhanced-mode: fake-ip: 这是TUN模式的最佳搭档,通过返回一个虚拟IP地址来避免DNS污染,能极大提高稳定性和速度。tun.stack: mixed: 使用混合协议栈,在性能和兼容性之间取得平衡。如果遇到问题,可以尝试system或gvisor。- SSH连接 (极其重要!):务必在
rules部分,将你的SSH客户端IP地址或SSH端口(默认为22) 设为DIRECT,否则一旦TUN模式启动,你的SSH连接会立即中断。示例中使用IP段规则IP-CIDR,192.168.0.0/16,DIRECT通常包含了你本地的局域网IP,如果你不确定你的局域网IP段,可以添加一条更精确的规则,例如DST-PORT,22,DIRECT。
测试与验证
部署完成后,可以通过以下方法验证TUN模式是否生效:
- 测试ICMP协议:
ping命令走的是ICMP协议。你可以用ping google.com来测试,如果能够ping通,说明TUN模式已经成功代理了ICMP流量,这是普通HTTP代理做不到的。 - 检查IP归属:使用
curl ip.sb或wget -qO- ifconfig.me等命令,查看返回的公网IP地址是否为代理节点的IP,这也是一种有效验证。 - 检查系统路由表:在宿主机上执行
ip route show table all | grep utun,如果看到相关的路由条目,说明TUN虚拟网卡已经成功介入系统路由。 - 检查网络接口:在宿主机上执行
ip a命令,查看是否出现了一个新的网络接口(通常名为utun或类似)。它的存在是TUN模式正常工作的物理证明。
注意事项与常见问题
- 权限与冲突:TUN模式需要高权限运行,可能与服务器上其他VPN客户端(如OpenVPN、WireGuard)冲突。如果遇到网络异常,可以先排查是否与其他网络工具冲突。
- IP转发与内核模块:确保宿主机已开启IP转发功能:
1# 检查值是否为 1 2sysctl net.ipv4.ip_forward 3# 如果为 0,则执行以下命令开启 4sudo sysctl -w net.ipv4.ip_forward=1 5# 同时可以加载所需的 TUN 内核模块(通常默认已加载) 6sudo modprobe tun - 紧急回滚与恢复:一旦发生误操作导致SSH断连,不要惊慌,可以通过云服务商提供的 VNC/串行控制台 等带外管理方式登录,然后执行
docker stop mihomo-tun停止容器,网络即可恢复正常。
V2Ray 使用 Docker 如何实现 TUN 透明代理
为V2Ray配置TUN模式,关键在于使用它的现代分支——Xray-core。Xray从v1.8.0版本开始原生支持TUN模式,比通过外部工具(如tun2socks)实现更简单、高效。
为什么是 Xray-core?
Xray-core 是 V2Ray 原项目作者主导的现代分支,与 V2Fly 分支兼容,但功能迭代更快。它原生支持TUN模式,意味着配置更简洁、性能更高。
下面的表格清晰地对比了 Clash 方案C 和 Xray 方案C 的实现差异:
| 对比维度 | Clash (方案C) | Xray (V2Ray方案C) |
|---|---|---|
| 核心实现 | 由 mihomo 内核原生支持 |
由 Xray-core 内核原生支持 |
| 核心组件 | metacubex/mihomo 镜像 |
teddysun/xray 或 xtls/xray-core 镜像 |
| 部署复杂度 | 低,配置较简单 | 较高,需理解多种入站/出站协议 |
| 配置方式 | YAML 格式 | JSON 格式,结构更复杂 |
| 灵活性 | 规则强大,分流成熟 | 协议支持全面,高度可编程 |
| 文档与社区 | 丰富,案例众多 | 专业但分散,需自行钻研 |
总的来说,Xray 方案C 面向希望深度掌控且熟悉 V2Ray 配置的用户;如果追求开箱即用和简单配置,之前讨论的 Clash 方案仍是首选。
动手配置
1. 准备 docker-compose.yml
与 Clash 类似,Xray 需要特权模式并接入宿主机网络。
1# docker-compose.yml
2services:
3 xray:
4 # 使用社区维护的 Xray 镜像
5 image: teddysun/xray:latest
6 container_name: xray-tun
7 restart: always
8 # 关键点1: 必须使用 host 网络模式
9 network_mode: "host"
10 # 关键点2: 需要特权模式来配置系统路由和防火墙
11 privileged: true
12 volumes:
13 - ./config.json:/etc/xray/config.json:ro
14 environment:
15 - TZ=Asia/Shanghai
16 # 关键点3: 添加必要的系统能力
17 cap_add:
18 - NET_ADMIN
19 - SYS_MODULE
与 Clash 需要映射端口(如 -p 7890:7890)不同,在 host 网络模式下,不需要 ports 映射。容器会直接使用宿主机的网络栈。
2. 准备核心 config.json
这是最关键的部分。我们需要同时配置TUN入站(接收流量) 和代理出站(转发流量)。
点击展开一个完整的 Xray TUN 模式配置示例
1{
2 "log": {
3 "loglevel": "info"
4 },
5 "dns": {
6 "servers": [
7 "https+local://1.1.1.1/dns-query",
8 "8.8.8.8",
9 "1.1.1.1",
10 "localhost"
11 ]
12 },
13 "inbounds": [
14 {
15 "tag": "tun-in",
16 "protocol": "tun",
17 "settings": {
18 "address": "198.18.0.1/30",
19 "mtu": 1500,
20 "auto_route": true,
21 "iproute2_table": 2022
22 },
23 "sniffing": {
24 "enabled": true,
25 "destOverride": ["http", "tls"]
26 }
27 },
28 {
29 "tag": "socks-in",
30 "protocol": "socks",
31 "port": 10808,
32 "listen": "0.0.0.0",
33 "settings": {
34 "auth": "noauth",
35 "udp": true
36 }
37 }
38 ],
39 "outbounds": [
40 {
41 "tag": "proxy-out",
42 "protocol": "vmess",
43 "settings": {
44 "vnext": [{
45 "address": "你的服务器域名或IP",
46 "port": 端口号,
47 "users": [{
48 "id": "你的UUID",
49 "alterId": 0,
50 "security": "auto"
51 }]
52 }]
53 }
54 },
55 {
56 "tag": "direct-out",
57 "protocol": "freedom"
58 },
59 {
60 "tag": "block-out",
61 "protocol": "blackhole"
62 }
63 ],
64 "routing": {
65 "domainStrategy": "IPIfNonMatch",
66 "rules": [
67 {
68 "type": "field",
69 "ip": ["geoip:private"],
70 "outboundTag": "direct-out"
71 },
72 {
73 "type": "field",
74 "domain": ["geosite:cn"],
75 "outboundTag": "direct-out"
76 },
77 {
78 "type": "field",
79 "inboundTag": ["tun-in"],
80 "outboundTag": "proxy-out"
81 }
82 ]
83 }
84}
此配置文件包含几个关键点:
- TUN 入站:通过
"protocol": "tun"定义。auto_route和iproute2_table参数会自动创建虚拟网卡、添加路由表,并确保流量被程序捕获。address可以自定义为一个不冲突的内网IP。 - 代理出站:这是一个标准
vmess协议的客户端配置,需要填入你真实V2Ray服务器的各项信息。 - DNS 与路由:配置专业的 DNS 和路由规则,确保按需分流,并避免 DNS 泄露。
3. 启动与验证
在 docker-compose.yml 和 config.json 所在目录执行:
1docker-compose up -d
验证代理是否生效:
- 测试IP:
curl ip.sb - 测试UDP/ICMP:执行
ping -c 4 google.com,如果能ping通,则说明TUN模式成功代理了ICMP流量。
验证完毕后,可以通过 docker logs xray-tun 查看日志排查问题;需要停止代理时执行 docker stop xray-tun。
简化之选:v2rayA
如果觉得手写JSON配置太繁琐,v2rayA 是一个提供了Web图形界面的工具,可以大大简化操作。
只需准备好 docker-compose.yml 文件:
1# docker-compose.yml for v2rayA
2services:
3 v2raya:
4 image: mzz2017/v2raya
5 restart: always
6 container_name: v2raya
7 network_mode: "host"
8 privileged: true
9 cap_add:
10 - NET_ADMIN
11 - SYS_MODULE
12 volumes:
13 - ./etc:/etc/v2raya
之后,就可以在浏览器中访问 http://你的服务器IP:2017,通过图形界面完成节点导入、模式切换、规则配置等所有操作,非常便捷。
小提示:v2rayA 提供的代理端口是
20170(SOCKS5) 和20171(HTTP),在设置代理时需要留意。
注意事项
- 容器网络:在同一宿主机上使用
bridge网络模式的Docker容器无法直接使用此代理,需要加入host网络模式。 - SSH连接:务必在配置文件中将SSH的22端口直接排除,避免策略错误导致SSH连接中断。
- 兼容性:TUN模式可能与宿主机上的其他VPN软件(如OpenVPN)或企业安全软件冲突,运行时需要留意。
