fix: prefer RHEL paths in BIND path detection to avoid ambiguity
之前的探测顺序优先 Debian 路径 (/etc/bind/named.conf.local), 在某些混合/历史场景下会选错:当两个 named.conf.local 都存在时 (RHEL 默认 /etc/named.conf.local + 之前手动 touch 的 /etc/bind/named.conf.local), named 实际只读其中一个,但代码会写到另一个,导致 zone 写出来了 但 named 不加载。 调整候选顺序,把 RHEL 路径(/etc/named.conf.local、/etc/named.conf) 放在 Debian 路径前面: BIND_CONF_LOCAL: /etc/named.conf.local -> /etc/bind/named.conf.local BIND_CONF_OPTIONS: /etc/named.conf -> /etc/bind/named.conf.options Dev 环境(Debian)行为不变(/etc/bind/named.conf.options 和 /etc/bind/named.conf.local 实际存在,依然命中 Debian 路径)。 README '配置 BIND' 一节明确两套发行版的差异,并强调 named 主配置 必须 include 对应的 named.conf.local 文件,否则 zone 文件存在但 named 不会加载。
This commit is contained in:
@@ -90,10 +90,19 @@ apt-get install -y bind9 bind9utils dnsutils
|
|||||||
|
|
||||||
### 2. 配置 BIND
|
### 2. 配置 BIND
|
||||||
|
|
||||||
#### Debian/Ubuntu(默认路径)
|
不同发行版默认路径、默认 include 的文件都不同,下面分别给出**全新机器**的初始化步骤。如果机器上已经有 BIND 在跑,只看对应小节的"追加 include"步骤即可。
|
||||||
|
|
||||||
|
**核心要点**:Web UI 写入 zone 声明的文件(`named.conf.local`)**必须**被 named 主配置 include,否则 zone 文件存在但 named 不会加载。
|
||||||
|
|
||||||
|
#### Debian / Ubuntu(bind9)
|
||||||
|
|
||||||
|
默认路径:`/etc/bind/named.conf`、`/etc/bind/named.conf.options`、`/etc/bind/named.conf.local`、`/etc/bind/zones/`。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 创建 zone 文件目录
|
apt-get update
|
||||||
|
apt-get install -y bind9 bind9utils dnsutils
|
||||||
|
|
||||||
|
# 创建 zone 文件目录(项目代码默认就写这里)
|
||||||
mkdir -p /etc/bind/zones
|
mkdir -p /etc/bind/zones
|
||||||
chown bind:bind /etc/bind/zones
|
chown bind:bind /etc/bind/zones
|
||||||
|
|
||||||
@@ -111,46 +120,42 @@ options {
|
|||||||
};
|
};
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# named.conf(包含 options + local + default-zones)
|
# named.conf(bind9 包默认就是这套,确认一下即可)
|
||||||
cat > /etc/bind/named.conf << 'EOF'
|
grep -q '/etc/bind/named.conf.local' /etc/bind/named.conf || \
|
||||||
include "/etc/bind/named.conf.options";
|
echo 'include "/etc/bind/named.conf.local";' >> /etc/bind/named.conf
|
||||||
include "/etc/bind/named.conf.local";
|
|
||||||
include "/etc/bind/named.conf.default-zones";
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# named.conf.local(空,由 Web UI 自动填充)
|
# named.conf.local(空,由 Web UI 自动填充;首次部署建一个空文件)
|
||||||
cat > /etc/bind/named.conf.local << 'EOF'
|
touch /etc/bind/named.conf.local
|
||||||
// Local zone configurations - managed by DNS Web UI
|
chown bind:bind /etc/bind/named.conf.local
|
||||||
EOF
|
|
||||||
|
|
||||||
# 启动 BIND
|
|
||||||
systemctl enable named
|
systemctl enable named
|
||||||
systemctl start named
|
systemctl restart named
|
||||||
```
|
```
|
||||||
|
|
||||||
#### RHEL / CentOS 7 / Rocky Linux
|
#### RHEL / CentOS 7 / Rocky Linux / AlmaLinux
|
||||||
|
|
||||||
CentOS 默认 BIND 路径在 `/var/named/` 和 `/etc/named.conf`,需要:
|
默认路径:`/etc/named.conf`、`/var/named/`、`/etc/named.conf.local`(默认**不创建**)、`/etc/rndc.key`。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yum install -y bind bind-utils
|
yum install -y bind bind-utils
|
||||||
|
|
||||||
# Zone 文件目录(默认 /var/named 即可;如想用 /etc/bind/zones 也可以,但需同步修改下方环境变量)
|
# /var/named 默认就有;如果没建过,手动建
|
||||||
mkdir -p /var/named
|
mkdir -p /var/named
|
||||||
chown root:named /var/named
|
chown root:named /var/named
|
||||||
chmod 2770 /var/named
|
chmod 2770 /var/named
|
||||||
|
|
||||||
# named.conf(追加 include,让 named 加载 Web UI 写入的 named.conf.local)
|
# 关键:RHEL 的 /etc/named.conf 默认不 include /etc/named.conf.local,
|
||||||
grep -q 'named.conf.local' /etc/named.conf || \
|
# 必须手动追加,否则 Web UI 写的 zone 声明不会生效
|
||||||
|
grep -q '/etc/named.conf.local' /etc/named.conf || \
|
||||||
echo 'include "/etc/named.conf.local";' >> /etc/named.conf
|
echo 'include "/etc/named.conf.local";' >> /etc/named.conf
|
||||||
|
|
||||||
# 给 Web UI 一个空白的入口文件
|
# 空白入口文件,让 named 重启时不报"include 文件不存在"
|
||||||
touch /etc/named.conf.local
|
touch /etc/named.conf.local
|
||||||
chown root:named /etc/named.conf.local
|
chown root:named /etc/named.conf.local
|
||||||
chmod 640 /etc/named.conf.local
|
chmod 640 /etc/named.conf.local
|
||||||
|
|
||||||
systemctl enable named
|
systemctl enable named
|
||||||
systemctl start named
|
systemctl restart named
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. 安装 Web 应用
|
### 3. 安装 Web 应用
|
||||||
@@ -212,11 +217,13 @@ systemctl start dns-web
|
|||||||
|------|----------|
|
|------|----------|
|
||||||
| `BIND_CONF_DIR` | `/etc/bind` → `/etc` → `/etc/named` |
|
| `BIND_CONF_DIR` | `/etc/bind` → `/etc` → `/etc/named` |
|
||||||
| `BIND_ZONES_DIR` | `/etc/bind/zones` → `/var/named` → `/var/named/data` |
|
| `BIND_ZONES_DIR` | `/etc/bind/zones` → `/var/named` → `/var/named/data` |
|
||||||
| `BIND_CONF_LOCAL` | `/etc/bind/named.conf.local` → `/etc/named.conf.local` |
|
| `BIND_CONF_LOCAL` | `/etc/named.conf.local` → `/etc/bind/named.conf.local` |
|
||||||
| `BIND_CONF_OPTIONS` | `/etc/bind/named.conf.options` → `/etc/named.conf` |
|
| `BIND_CONF_OPTIONS` | `/etc/named.conf` → `/etc/bind/named.conf.options` |
|
||||||
| `BIND_RNDC_KEY` | `/etc/bind/rndc.key` → `/etc/rndc.key` → `/var/named/key` |
|
| `BIND_RNDC_KEY` | `/etc/bind/rndc.key` → `/etc/rndc.key` → `/var/named/key` |
|
||||||
| `BIND_SERVICE` | 固定 `named` |
|
| `BIND_SERVICE` | 固定 `named` |
|
||||||
|
|
||||||
|
> **`BIND_CONF_LOCAL` / `BIND_CONF_OPTIONS` 探测顺序说明**:RHEL/CentOS 的 `/etc/named.conf` 默认 include 的是 `/etc/named.conf.local`,Debian/Ubuntu 默认 include 的是 `/etc/bind/named.conf.local`。代码里**优先探测 RHEL 路径**——这样可以避免"两个文件都存在但 named 只读其中一个"的歧义场景(典型踩坑:zone 文件写出来了,但 named 不加载)。
|
||||||
|
|
||||||
大多数情况下**无需任何配置**——Debian 上自然走 `/etc/bind/*`,CentOS/RHEL 上自然走 `/var/named` + `/etc/named.conf*`。
|
大多数情况下**无需任何配置**——Debian 上自然走 `/etc/bind/*`,CentOS/RHEL 上自然走 `/var/named` + `/etc/named.conf*`。
|
||||||
|
|
||||||
只有以下两种场景需要用环境变量强制覆盖:
|
只有以下两种场景需要用环境变量强制覆盖:
|
||||||
|
|||||||
@@ -31,11 +31,17 @@ db = SQLAlchemy(app)
|
|||||||
# 自动探测按"哪个目录/文件存在就用谁"在常见路径里回退,覆盖 Debian/Ubuntu、
|
# 自动探测按"哪个目录/文件存在就用谁"在常见路径里回退,覆盖 Debian/Ubuntu、
|
||||||
# RHEL/CentOS/Rocky、AlmaLinux、FreeBSD 等发行版默认布局;如有特殊安装路径,
|
# RHEL/CentOS/Rocky、AlmaLinux、FreeBSD 等发行版默认布局;如有特殊安装路径,
|
||||||
# 可用环境变量强制指定。
|
# 可用环境变量强制指定。
|
||||||
|
#
|
||||||
|
# 注意 BIND_CONF_LOCAL 的探测顺序:/etc/named.conf.local 优先于
|
||||||
|
# /etc/bind/named.conf.local —— 因为 RHEL/CentOS 的 /etc/named.conf 默认
|
||||||
|
# include 的是 /etc/named.conf.local,而 Debian/Ubuntu 默认 include 的是
|
||||||
|
# /etc/bind/named.conf.local。优先探测 RHEL 路径可以避免"两边文件都存在但
|
||||||
|
# named 只读其中一份"的歧义场景。
|
||||||
_BIND_PATH_CANDIDATES = {
|
_BIND_PATH_CANDIDATES = {
|
||||||
"BIND_CONF_DIR": ["/etc/bind", "/etc", "/etc/named"],
|
"BIND_CONF_DIR": ["/etc/bind", "/etc", "/etc/named"],
|
||||||
"BIND_ZONES_DIR": ["/etc/bind/zones", "/var/named", "/var/named/data"],
|
"BIND_ZONES_DIR": ["/etc/bind/zones", "/var/named", "/var/named/data"],
|
||||||
"BIND_CONF_LOCAL": ["/etc/bind/named.conf.local", "/etc/named.conf.local"],
|
"BIND_CONF_LOCAL": ["/etc/named.conf.local", "/etc/bind/named.conf.local"],
|
||||||
"BIND_CONF_OPTIONS": ["/etc/bind/named.conf.options", "/etc/named.conf"],
|
"BIND_CONF_OPTIONS": ["/etc/named.conf", "/etc/bind/named.conf.options"],
|
||||||
"BIND_RNDC_KEY": ["/etc/bind/rndc.key", "/etc/rndc.key", "/var/named/key"],
|
"BIND_RNDC_KEY": ["/etc/bind/rndc.key", "/etc/rndc.key", "/var/named/key"],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user