本文将记录如何在 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!