Caddy 与 Xray (VLESS + WS) 部署与 DNS 去广告

本文将记录如何在 Ubuntu 服务器上部署一套兼顾速度、隐蔽性与隐私保护的网络环境。我们将使用 Caddy 作为前端 Web 服务器(自动申请 HTTPS),Xray 作为后端处理 VLESS 协议,并通过 WebSocket (WS) 进行分流。最后,我们将探讨如何通过 DNS 层面过滤广告,提升浏览体验。

1. 系统优化:开启 BBR

TCP BBR (Bottleneck Bandwidth and Round-trip propagation time) 是 Google 开发的一种 TCP 拥塞控制算法,能显著提高服务器在高丢包环境下的吞吐量。

原生 BBR vs. 脚本 (BBR Plus/BBRv3)

在部署之前,很多教程会推荐使用“一键脚本”安装 BBR Plus 或 BBRv3。我们需要了解两者的区别:

  • 原生 BBR (sysctl 方式)
    • 优点:稳定性极高,集成在 Linux 内核中(4.9+ 版本),无需更换内核,安全性好。
    • 缺点:在极端丢包环境下,抢占带宽的能力略逊于修改版。
    • 结论:对于生产环境或追求稳定的个人服务,强烈建议使用原生 BBR
  • 脚本魔改版 (BBRv3/Plus)
    • 优点:算法激进,带宽利用率可能更高。
    • 缺点:通常需要更换非官方编译的内核(XanMod 等),可能导致系统不稳定甚至无法启动。

启用原生 BBR

Ubuntu 20.04+ 的内核均已支持 BBR,直接通过 sysctl 开启即可:

# 写入配置
echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf

# 使配置生效
sudo sysctl -p

# 验证是否开启(有返回值即成功)
lsmod | grep bbr

2. 安装 Caddy

Caddy 是一个强大的 Web 服务器,最大的特点是全自动管理 SSL 证书

使用官方源安装(确保获取最新版):

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf '[https://dl.cloudsmith.io/public/caddy/stable/gpg.key](https://dl.cloudsmith.io/public/caddy/stable/gpg.key)' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf '[https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt](https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt)' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

安装完成后,Caddy 会自动作为 systemd 服务运行。

3. 安装 Xray

使用官方推荐的安装脚本,方便后续升级和管理:

bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

安装完成后,我们需要生成一个 UUID 用于后续配置:

xray uuid
# 请记录输出的 UUID,下文配置中需要填入

4. 配置 Xray 与 Caddy 联动

修改 Xray 配置

我们将 Xray 配置为监听本地端口(127.0.0.1:10086),仅接受来自 Caddy 的流量。

编辑配置文件: nano /usr/local/etc/xray/config.json

{
   "log": {
       "loglevel": "warning"
  },
   "inbounds": [
      {
           "port": 10086,
           "listen": "127.0.0.1",
           "protocol": "vless",
           "settings": {
               "clients": [
                  {
                       "id": "此处填入上一步生成的UUID",
                       "level": 0
                  }
              ],
               "decryption": "none"
          },
           "streamSettings": {
               "network": "ws",
               "wsSettings": {
                   "path": "/ray"
              }
          },
           "sniffing": {
               "enabled": true,
               "destOverride": [
                   "http",
                   "tls"
              ]
          }
      }
  ],
   "outbounds": [
      {
           "protocol": "freedom",
           "settings": {}
      },
      {
           "protocol": "blackhole",
           "settings": {},
           "tag": "blocked"
      }
  ],
   "routing": {
       "domainStrategy": "IPIfNonMatch",
       "rules": [
          {
               "type": "field",
               "ip": [
                   "geoip:private"
              ],
               "outboundTag": "blocked"
          }
      ]
  }
}

重启 Xray 使配置生效:

systemctl restart xray

配置 Caddy 反向代理

编辑 Caddyfile: nano /etc/caddy/Caddyfile

yourdomain.com {
  # 正常的网站内容(可选)
  # root * /var/www/html
  # file_server

  # 将 /ray 路径流量转发给 Xray
  # 请确保和 Xray 配置中的 path 保持一致
  reverse_proxy /ray 127.0.0.1:10086
}

重启 Caddy:

systemctl restart caddy

5. 配置 DNS 广告过滤

为了净化网络环境,我们可以在服务器端进行 DNS 过滤。这里介绍两种方案:简单方案和进阶方案。

方案一:使用 Systemd-resolved (简单)

直接修改 Ubuntu 的 DNS 解析器,指向上游带有广告过滤功能的公共 DNS(如 AdGuard DNS)。

编辑配置文件: nano /etc/systemd/resolved.conf

[Resolve]
# AdGuard Home Public DNS (拦截广告)
DNS=94.140.14.14 94.140.15.15
# 备用
FallbackDNS=1.1.1.1

重启服务:

systemctl restart systemd-resolved

优点:配置只需一分钟。 缺点:无法自定义拦截规则,无法查看日志。

方案二:自建 Technitium DNS (进阶/推荐)

通过 Docker 自建 DNS 服务器,拥有完整的控制面板、日志和自定义规则。

1. 安装 Docker (如果尚未安装):

curl -fsSL [https://get.docker.com](https://get.docker.com) | bash

2. 创建 docker-compose.yml: 我们配置容器只监听本地 127.0.0.1,提高安全性,避免被当作公共 DNS 放大攻击。

version: "3.7"
services:
dns-server:
  container_name: dns-server
  hostname: dns-server
  image: technitium/dns-server:latest
  ports:
     # 1. 安全性:只将 DNS 53 端口绑定到 127.0.0.1 (本机)
    - "127.0.0.1:53:53/udp"
    - "127.0.0.1:53:53/tcp"

     # 2. 端口冲突:将 Web 管理界面(容器5380)映射到宿主机的 8088
     #   同样只绑定到 127.0.0.1,需要 SSH 隧道访问配置
    - "127.0.0.1:8088:5380/tcp"
     
     # 3. 移除了所有其他端口 (853, 443, 80),因为我们不向公网提供服务

  environment:
     # 4. [重要] 在此设置您的 Web 管理密码 (启动即用)
    - DNS_SERVER_ADMIN_PASSWORD=Password123! # 请修改为您自己的强密码

     # 5. [重要] 启用广告屏蔽功能
    - DNS_SERVER_ENABLE_BLOCKING=true

     # 6. [重要] 预配置主流广告屏蔽列表
    - DNS_SERVER_BLOCK_LIST_URLS=[https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts,https://adaway.org/hosts.txt](https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts,https://adaway.org/hosts.txt)

     # 7. [重要] 预配置上游 DNS
    - DNS_SERVER_FORWARDERS=1.1.1.1,9.9.9.9,8.8.8.8
     
     # 8. [关键] 强制上游 DNS 使用 DNS-over-TLS (DoT),防劫持
    - DNS_SERVER_FORWARDER_PROTOCOL=Tls

  volumes:
    - ./config:/etc/dns # 将配置持久化到当前目录下的 config 文件夹
   
  restart: unless-stopped
  sysctls:
     # 官方推荐的性能优化
    - net.ipv4.ip_local_port_range=1024 65535

volumes:
config:

3. 启动并应用:

docker compose up -d

4. 让服务器使用此 DNS:

虽然容器启动了,但 Ubuntu 默认还在使用旧的 DNS。我们需要让系统或 Xray 使用 127.0.0.1:53

最彻底的方法是修改 /etc/resolv.conf (注意:此文件通常由 systemd-resolved 管理,建议修改 /etc/systemd/resolved.conf 并将 DNS 指向 127.0.0.1,但这需要停止 systemd-resolved 对 53 端口的占用,配置较为繁琐)。

更简单的做法是让 Xray 独享此 DNS

修改 Xray 配置文件的 dns 模块(如果 config.json 中没有则添加):

"dns": {
   "servers": [
       "127.0.0.1"
  ]
}

这样,只有通过 Xray 代理的流量会经过这个带有广告过滤的 Docker 容器,实现精准去广告。

结语

至此,我们完成了一套高隐蔽性的代理服务搭建,并且通过自建 DNS 服务实现了流量加密与广告拦截的双重保障。Enjoy it!

Tagged , . Bookmark the permalink.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注