本文将记录如何在 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 开启即可:
1 2 3 4 5 6 7 8 9
| # 写入配置 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 证书。
使用官方源安装(确保获取最新版):
1 2 3 4 5
| sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl curl -1sLf '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' | sudo tee /etc/apt/sources.list.d/caddy-stable.list sudo apt update sudo apt install caddy
|
安装完成后,Caddy 会自动作为 systemd 服务运行。
3. 安装 Xray
使用官方推荐的安装脚本,方便后续升级和管理:
1
| bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
|
安装完成后,我们需要生成一个 UUID 用于后续配置:
1 2
| xray uuid # 请记录输出的 UUID,下文配置中需要填入
|
4. 配置 Xray 与 Caddy 联动
修改 Xray 配置
我们将 Xray 配置为监听本地端口(127.0.0.1:10086),仅接受来自 Caddy 的流量。
编辑配置文件: nano /usr/local/etc/xray/config.json
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| { "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 使配置生效:
配置 Caddy 反向代理
编辑 Caddyfile: nano /etc/caddy/Caddyfile
1 2 3 4 5 6 7 8 9
| yourdomain.com { # 正常的网站内容(可选) # root * /var/www/html # file_server # 将 /ray 路径流量转发给 Xray # 请确保和 Xray 配置中的 path 保持一致 reverse_proxy /ray 127.0.0.1:10086 }
|
重启 Caddy:
5. 配置 DNS 广告过滤
为了净化网络环境,我们可以在服务器端进行 DNS 过滤。这里介绍两种方案:简单方案和进阶方案。
方案一:使用 Systemd-resolved (简单)
直接修改 Ubuntu 的 DNS 解析器,指向上游带有广告过滤功能的公共 DNS(如 AdGuard DNS)。
编辑配置文件: nano /etc/systemd/resolved.conf
1 2 3 4 5
| [Resolve] # AdGuard Home Public DNS (拦截广告) DNS=94.140.14.14 94.140.15.15 # 备用 FallbackDNS=1.1.1.1
|
重启服务:
1
| systemctl restart systemd-resolved
|
优点:配置只需一分钟。 缺点:无法自定义拦截规则,无法查看日志。
方案二:自建 Technitium DNS (进阶/推荐)
通过 Docker 自建 DNS 服务器,拥有完整的控制面板、日志和自定义规则。
1. 安装 Docker (如果尚未安装):
1
| curl -fsSL https://get.docker.com | bash
|
2. 创建 docker-compose.yml: 我们配置容器只监听本地 127.0.0.1,提高安全性,避免被当作公共 DNS 放大攻击。
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 42 43
| 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=*** # 请修改为您自己的强密码
# 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
# 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. 启动并应用:
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 中没有则添加):
1 2 3 4 5
| "dns": { "servers": [ "127.0.0.1" ] }
|
这样,只有通过 Xray 代理的流量会经过这个带有广告过滤的 Docker 容器,实现精准去广告。
结语
至此,我们完成了一套高隐蔽性的代理服务搭建,并且通过自建 DNS 服务实现了流量加密与广告拦截的双重保障。Enjoy it!