Linux中实现不同域名专属DNS转发需用BIND配置条件转发:在/etc/named.conf中为每个域名(如corp.local、aws.example.com)添加独立zone块,设type forward; forward only; forwarders { IP; };,再重载配置并验证。

在 Linux 系统中,为不同域名配置专属的转发 DNS 服务器,核心是使用 BIND(named) 搭建一台具备 条件转发(Conditional Forwarding) 能力的本地 DNS 服务器。它不是把所有查询都转给上游,而是按域名后缀精准分流——比如 internal.example.com 转给内网 DNS,cloud.company.net 转给云厂商 DNS,其余走公共 DNS。
一、确认服务已安装并监听本地
确保系统已安装 BIND 并正常运行:
- 安装:
sudo dnf install -y bind bind-utils(RHEL/CentOS/Fedora)或sudo apt install -y bind9 dnsutils(Debian/Ubuntu) - 启动并设为开机自启:
sudo systemctl enable --now named - 检查监听状态:
sudo ss -tuln | grep ':53',应看到127.0.0.1:53或0.0.0.0:53 - 开放防火墙:
sudo firewall-cmd --permanent --add-service=dns && sudo firewall-cmd --reload
二、在 named.conf 中配置条件转发区域
编辑主配置文件 /etc/named.conf,在 options 块之后添加 zone 声明,每个目标域名一个独立 zone:
- 对
corp.local及其子域,全部转发到内网 DNS192.168.10.5:
zone "corp.local" IN {
type forward;
forward only;
forwarders { 192.168.10.5; };
};
- 对
aws.example.com,转发到 Amazon Route 53 提供的解析器(如172.31.0.2):
zone "aws.example.com" IN {
type forward;
forward only;
forwarders { 172.31.0.2; };
};
-
forward only表示不回退到递归查询;若希望上游无法响应时仍尝试根域递归,可改用forward first - 域名必须写完整(带结尾点号可选),但不能是通配符;
corp.local会匹配www.corp.local、db.prod.corp.local等所有子域
三、验证语法并重载配置
避免配置错误导致服务中断:
- 检查语法:
sudo named-checkconf /etc/named.conf - 检查区域文件(如有):
sudo named-checkzone corp.local /var/named/corp.local.zone(条件转发无需区域文件,此步仅当混用权威域时需要) - 重载配置(不中断服务):
sudo rndc reconfig或sudo systemctl reload named - 查看日志确认加载成功:
sudo journalctl -u named -n 20 --no-pager,应有类似loading configuration from '/etc/named.conf'和forwarding for 'corp.local' to 192.168.10.5#53的记录
四、客户端指向该 DNS 并测试
让客户端(本机或局域网设备)使用这台条件转发 DNS:
- 临时测试:修改
/etc/resolv.conf,将第一行设为nameserver 127.0.0.1(本机)或nameserver 192.168.x.x(局域网 IP) - 测试转发是否生效:
dig @127.0.0.1 www.corp.local +short,结果应来自192.168.10.5;同时dig @127.0.0.1 example.com +short应走默认递归路径(如根→.com→example.com) - 用
dig +trace或dig +all观察查询路径,确认corp.local类型为forward且无额外迭代跳转











