这三款软件确实代表了不同的方向: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:7890
socks5://宿主机IP:7891
http://clash:7890
socks5://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访问。

  1. 拉取镜像

    1docker pull metacubex/mihomo:latest
    
  2. 准备并放置配置文件: 确保你已经有一个可用的 config.yaml 配置文件。然后创建并进入工作目录:

    1mkdir -p ~/clash/config && cd ~/clash
    2cp /path/to/your/config.yaml ./config/   # 将你的配置文件复制到此处
    
  3. 运行容器: 执行以下命令启动一个名为 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 保证容器在宿主机重启或意外退出后能自动恢复,实现"长时间运行"。

  4. 结果: 完成部署后,你的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配置(适用于拉取镜像)
    1. 为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
      
    2. 重新加载配置并重启Docker服务:
      1sudo systemctl daemon-reload
      2sudo systemctl restart docker
      

      注意:此方法仅影响 docker pull 命令,不适用于运行中的容器。


验证与运维

  • 验证代理是否生效: 在宿主机或任意能访问的客户端运行:

    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:是可选的。如果你的所有服务都运行在自定义网络中,就不需要映射代理端口。但出于调试或外部服务(如浏览器)的使用,可以保留这些映射。

第二步:准备配置文件

  1. 准备config.yaml:在docker-compose.yml同级目录下创建config文件夹,并放入你的config.yaml特别注意allow-lan字段必须设置为truebind-address设置为0.0.0.0,这样代理服务才能监听来自网络内部其他容器的请求。

    1# config/config.yaml (核心片段)
    2port: 7890
    3socks-port: 7891
    4allow-lan: true
    5bind-address: "0.0.0.0"
    
  2. 部署启动

    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有两个核心优势

  1. 极致的服务隔离:所有代理流量都只在Docker的"封闭小区"里流动,既不会因为多个服务抢占代理端口而冲突,也不会受宿主机网络环境影响,是一个干净的内部网络。
  2. 便捷的服务发现:在方案B的自定义网络里,容器之间可以直接使用服务名(如http://clash:7890)进行通信。不再需要去查动态变化的宿主机IP,大大降低了配置和维护成本。

补充提醒与建议

  • 配置即代码,方便迁移:将所有配置写在docker-compose.yml里,可以轻松实现完整的备份和迁移。
  • 关于TUN模式:如果需求需要处理非HTTP/HTTPS流量(如UDP),可以开启TUN模式,但需要更多配置,例如在clash服务中添加cap_add: - NET_ADMINdevices: - /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层流量,包括 TCPUDPICMPping 命令用到的协议)。
核心优势 配置灵活,可按域名或IP灵活分流。 无需应用主动支持,实现真正的全局代理。
典型应用 浏览器、curlwget 等支持代理设置的应用。 游戏加速、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: 给予容器所有系统权限,确保 iptablesip 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: 使用混合协议栈,在性能和兼容性之间取得平衡。如果遇到问题,可以尝试 systemgvisor
  • 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.sbwget -qO- ifconfig.me 等命令,查看返回的公网IP地址是否为代理节点的IP,这也是一种有效验证。
  • 检查系统路由表:在宿主机上执行 ip route show table all | grep utun,如果看到相关的路由条目,说明TUN虚拟网卡已经成功介入系统路由。
  • 检查网络接口:在宿主机上执行 ip a 命令,查看是否出现了一个新的网络接口(通常名为 utun 或类似)。它的存在是TUN模式正常工作的物理证明。

注意事项与常见问题

  1. 权限与冲突:TUN模式需要高权限运行,可能与服务器上其他VPN客户端(如OpenVPN、WireGuard)冲突。如果遇到网络异常,可以先排查是否与其他网络工具冲突。
  2. IP转发与内核模块:确保宿主机已开启IP转发功能:
    1# 检查值是否为 1
    2sysctl net.ipv4.ip_forward
    3# 如果为 0,则执行以下命令开启
    4sudo sysctl -w net.ipv4.ip_forward=1
    5# 同时可以加载所需的 TUN 内核模块(通常默认已加载)
    6sudo modprobe tun
    
  3. 紧急回滚与恢复:一旦发生误操作导致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 方案CXray 方案C 的实现差异:

对比维度 Clash (方案C) Xray (V2Ray方案C)
核心实现 mihomo 内核原生支持 由 Xray-core 内核原生支持
核心组件 metacubex/mihomo 镜像 teddysun/xrayxtls/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_routeiproute2_table 参数会自动创建虚拟网卡、添加路由表,并确保流量被程序捕获。address 可以自定义为一个不冲突的内网IP。
  • 代理出站:这是一个标准 vmess 协议的客户端配置,需要填入你真实V2Ray服务器的各项信息。
  • DNS 与路由:配置专业的 DNS 和路由规则,确保按需分流,并避免 DNS 泄露。

3. 启动与验证

docker-compose.ymlconfig.json 所在目录执行:

1docker-compose up -d

验证代理是否生效:

  • 测试IPcurl 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)或企业安全软件冲突,运行时需要留意。