出网白名单网关让一个不许上互联网的隔离网段接入 DitOps:白名单里的域名与端口放行,其余在网关上一律阻断。
它是可选组件。用一个 DitOps 服务端的企业不装它,被管理设备照常工作;只有当被管理设备所在网段不能直接出网、而 DitOps 又需要连到自己那台服务器时,才需要在出口机器上装这一个服务。
1. 它是怎么放行的
网关同时是自己的默认网关,三层各管一件事:
| 层 | 管什么 |
|---|---|
| DNS(dnsmasq) | 白名单里的名字能解析,其余一律 NXDOMAIN |
| TLS 代理(nginx stream) | 按 SNI 放行 HTTPS 域名,共用一个出口地址 |
| 防火墙(nftables) | 只允许白名单 IP / 端口,其余丢弃;443 一律转给 SNI 代理 |
白名单在管理端配置,由企业库统一下发到网关上,不需要在网关上手工改文件。
2. 安装之前
| 项 | 要什么 |
|---|---|
| 机器 | 一台 x86_64 Linux(Debian 12 / Ubuntu 24.04 及以上,glibc ≥ 2.18;dnsmasq ≥ 2.88,安装脚本会查),它就是该网段的默认网关 |
| 网卡 | 一块接隔离网段,一块能出网并访问企业服务器地址 |
| 绑定码 | 管理端「设置 → 组织信息 → 设备绑定码」,形如 123456-7890,与桌面 Agent 用的是同一个 |
| 企业库 | 1.0.33 及以上(用到 register-egress-gateway);要在管理端维护手工白名单与本机保留端口,需要 1.0.34 及以上 |
| 旧防火墙 | 若原来用手写的 ditops-paper 防火墙表,先由安装脚本停掉:它对同一网卡整段丢弃,会盖掉新网关的放行规则。它里面放行的端口(Syncthing、NUT 等)搬进「本机保留端口」,见第 7 节 |
网关机器自己不受这些规则限制,它上面的 Agent 照常上报。
3. 安装(默认干跑)
在出口机器上执行:
curl -fsSL https://downloads.ditops.cn/linux/egress_gateway/install.sh | sudo bash -s -- --bind
- 绑定码在终端提示时输入,不要写进命令行——命令行会进 shell 历史,也会出现在进程列表里。
- 这一步只检查、不写任何东西:缺哪些命令、识别到哪块网卡、算出的网段 / 网关地址 / 上游 DNS、要不要停旧防火墙,全部列出来给你看。
- 干跑不会用绑定码去换凭据,输错不会累计失败次数。它仍会查一次更新目录,确认这个构建能否自更新。
看完输出、确认网段与网关地址无误后,同一条命令加 --apply 真正安装:
curl -fsSL https://downloads.ditops.cn/linux/egress_gateway/install.sh | sudo bash -s -- --bind --apply
--apply 时才会去目录换出企业库地址、再用绑定码换出网关凭据。绑定码不在 /etc 留底(安装时临时用到,装完即删);网段、网关地址、上游 DNS 这些只有本机知道的事实,按探测结果写进策略骨架,白名单留空、由企业库第一次下发时填上。
装完管理端「设置 → 出网网关」立刻多出这台机器(显示主机名与版本),默认启用。
4. 探测结果不对时
网段指错等于把整段网络指错出口。自动探测有歧义时,安装脚本会停下来要求显式指定,也可以直接给:
| 参数 | 说明 |
|---|---|
--interface <网卡> | 接隔离网段的那块网卡 |
--segment <CIDR> | 隔离网段,如 192.168.8.0/24 |
--gateway-ip <地址> | 网关在网段里的地址(网段机器的默认网关) |
--dns-upstream <IP[,IP]> | 上游 DNS(默认读系统 resolv.conf,排除 127.*) |
--replace-paper-firewall | 停用旧的 ditops-paper 防火墙表 |
例如:
curl -fsSL https://downloads.ditops.cn/linux/egress_gateway/install.sh \
| sudo bash -s -- --bind --interface ens224 --segment 192.168.8.0/24 --gateway-ip 192.168.8.2
5. 无人值守安装
绑定码放文件、装完即删,不经过命令行:
curl -fsSLo /tmp/ditops-egress-install.sh https://downloads.ditops.cn/linux/egress_gateway/install.sh
sudo sh -c 'umask 077; cat > /root/binding-code' # 粘贴绑定码,回车后按 Ctrl-D(装完再删)
# 先干跑,确认输出无误后执行第二条
sudo bash /tmp/ditops-egress-install.sh --bind --code-file /root/binding-code
sudo bash /tmp/ditops-egress-install.sh --bind --code-file /root/binding-code --apply
shred -u /root/binding-code /tmp/ditops-egress-install.sh
绑定码是一次性开通凭据,装完就删掉,留在机器上没有用处。
6. 装完之后
安装脚本最后会打印一份核对清单,逐条做完再离开。要点:
# 网关本机
nft list table inet ditops_egress | head -20
systemctl status ditops-egress-proxy ditops-egress-dns
# 网段内一台机器(地址与域名换成实际值)
dig @192.168.8.2 api.deepseek.com # 有 A 记录
dig @192.168.8.2 www.baidu.com # NXDOMAIN
curl -sI https://api.deepseek.com # 通
- 管理端改白名单后,网关每 15 分钟同步一次,内容变了才重新加载(避免无谓的解析 / 连接空窗)。不想等可以
sudo systemctl start ditops-egress-sync.service。 - 每次改策略都先备份当前配置,加载失败自动回滚到上一份。
7. 管理端另外能改的两处
白名单的主体由企业库按当前配置折算下发,有两类内容不在产品开关里,管理端单独留了口子(设置 → 出网网关,需要企业库 1.0.34 及以上)。
手工白名单(页面下方的「手工白名单」):Windows 更新这类管理员自己加的放行。
| 类型 | 写什么 | 例子 |
|---|---|---|
| 域名 | 按 HTTPS(SNI)放行,支持 *. 通配 | *.windowsupdate.com |
| 裸协议服务 | 域名或 IPv4 + 端口,不支持通配 | rd.example.com tcp 21115-21117 |
作用域选「所有网关」时每台出口都拿到,也可以只对某一台生效。Windows 更新的域名会随微软的部署调整,常见的一组是 *.windowsupdate.com、*.update.microsoft.com、download.windowsupdate.com、*.delivery.mp.microsoft.com,以微软公布的清单为准;补丁源在别的网段时,把那个源也加进来。
域名条目只放行 HTTPS(443)。补丁源只提供明文 HTTP 时,改用「裸协议服务」写它的域名或地址加 tcp 80——明文 HTTP 没有 SNI,只靠域名放行不了。
本机保留端口(每台网关的「更多 → 本机保留端口」):原来手写在旧防火墙里的 Syncthing(tcp/udp 22000、udp 21027)、NUT(tcp 3493,只许 192.168.8.8)这类,按网关维护;填源地址就只对那一台机器开放。一旦保存就以管理端这份为准,网关上原本手填、这里没列的端口会被替换掉;清空保存 = 回到网关本机策略里那份,升级前手填的规则不会被清掉。
两处都在下一次同步生效(15 分钟内,或网关上 sudo systemctl start ditops-egress-sync.service);写错的单条会被服务端跳过并在 EF 日志里留一行,不会让整次同步失败。
8. 升级
网关每天检查一次目录端发布的更新:清单验签、核对应用与构建号、下载后比 sha256,全部通过才替换程序,装完重新应用配置,失败换回上一版。
查看与手动执行:
ditops-egress-gateway update # 只看有没有新版
sudo ditops-egress-gateway update --apply
关闭自更新:安装时加 --no-auto-update,或 sudo systemctl disable --now ditops-egress-update.timer(下次带绑定码重装会沿用这个选择)。
9. 常见问题
网页能打开,下载或登录时却提示「连接被意外终止」 — 多半是 ECH:站点在 DNS 的 HTTPS 记录里下发 ECH 配置,浏览器据此把真实域名加密在外层 SNI 里面,网关只看得见公共名 cloudflare-ech.com,于是按「未放行」拒掉。0.3.1+7 起网关会过滤掉 HTTPS 记录,浏览器拿不到配置就退回明文 SNI;升级后把浏览器重启一次(它可能还缓存着旧配置)。这类问题在网关的访问日志里一眼可见一行 cloudflare-ech.com -> 127.0.0.1:1 502,日志位于 /var/log/ditops-egress/access.log,按周轮循、留 8 份。
绑定被拒,说企业码不存在或绑定码无效 — 先核对管理端的设备绑定码。连续输错 5 次,整家企业会被锁 10 分钟,期间任何设备都绑不上。
说企业库没有 register-egress-gateway — 企业库版本低于 1.0.33,先升级企业库。
重装会不会换凭据 — 不会。网关按机器标识认机器,同一台重装沿用原凭据。要换凭据就在管理端删掉这台网关,再重新绑定一次。
绑定码安装之后还能改企业吗 — 不能自动换。企业库删掉这台后同步会一直 401,重新跑一次安装即可。
本地构建的包 — 绑定码安装要求用官网发布的构建(企业库地址编译在程序里)。自己编译的包不含这个地址,只能用手工策略与手工凭据安装。