前言
BIND(Berkeley Internet Name Domain)作为一款目前市面是最主流的开源DNS软件,占据了市面上DNS服务器软件的九成,市面上的主流操作系统( Linux/Windows/Windows Server) 都可以承载BIND的DNS服务。官网地址:BIND 9 – ISC
安装
这里我使用docker进行安装,所以在此之前确认是否安装了docker和docker compose,可参考文章:Docker入门基础
新建一个docker-compose.yaml文件:
version: "3.7"
services:
bind:
image: sameersbn/bind:latest
ports:
- "53:53/tcp"
- "53:53/udp"
- "10000:10000" # Web 管理界面端口
environment:
- ROOT_PASSWORD=123456 # 设置 Web 管理界面密码
volumes:
- ./data:/data # 持久化数据
restart: always
使用docker-compose up -d新建docker容器,可能会提示53端口被占用了,可通过命令:netstat -tulnp | grep :53,查询是什么进程占用了该端口

这个进程可以停用:
systemctl stop systemd-resolved
systemctl disable systemd-resolved
停用systemd-resolved会导致服务器无法进行解析,需要手动设置DNS解析
vim /etc/resolv.conf
# 添加
nameserver 223.5.5.5
使用docker ps查看服务状态:

配置
Web端访问:https://*.*.*.*:10000/,输入账号密码登录,账号默认是root,密码和配置文件一致。

为了方便配置,进入系统首先设置语言为中文

设置时区

配置文件
编辑配置文件named.conf.options
options {
directory "/var/cache/bind";
dnssec-validation no;
allow-query { any; }; //允许任何IP地址发起DNS查询
listen-on port 53 { any; }; //监听任意网卡的53端口(默认DNS端口)
forward only; //只转发DNS查询,不做递归解析
//指定上游DNS服务器列表,当收到DNS请求时将其转发给这些服务器。
forwarders {
1.1.1.1; //Cloudflare DNS
119.29.29.29; //腾讯 DNSPod
223.5.5.5; //阿里公共 DNS
};
recursion yes; //启用递归解析(用户查不到时,会去帮你查)
};
//定义一个特殊域名的转发规则,当客户端请求*.cosmax.ad 的域名时,BIND不使用全局的forwarders,而是将请求定向到内部DNS服务器10.220.127.38和10.220.127.53
zone "cosmax.ad" {
type forward;
forwarders {
10.220.127.38;
10.220.127.53;
};
};
至此,局域网电脑的DNS设置成服务器IP就可以上网了。搭建这个DNS服务器的主要作用是为了连接本部公司的域网络,所以设置了转发规则,如果只是用做DNS服务器,可以省略转发配置。这只是很浅的应用,深层次的使用还没有实践过。
防火墙设置DNS重定向
使用场景:本地电脑使用公共DNS:223.5.5.5、114.114.114.114、211.136.192.6进行域名解析,但是由于要加入本部的域网络,所以自建了DNS服务器进行域名转发。如果要加域就需要使用DNS服务器地址作为DNS,这明显不利于维护,所以就想通过防火墙将本地的公共DNS重定向到DNS服务器,再通过DNS服务器转发到域服务,这样本地电脑就不要更改网络配置,减少了维护工作量。
飞塔防火墙
飞塔防火墙使用的是【虚拟IP】的功能,设置公共DNS(223.5.5.5)映射到DNS服务器(10.10.181.230)

将常用的DNS都设置映射,然后加入到虚拟IP地址组中

设置防火墙策略,流入接口和流出接口设置成防火墙与核心交换机的接口,目的地址:虚拟IP组,服务:DNS,保存。

还要设置一条策略路由,它的作用我不是很明白,查了下chatgpt:拒绝对目标地址为 10.10.181.230(DNS服务器)的流量使用策略路由,改用默认路由。

可以看到防火墙策略有数据包应该就算设置成功了。
sonicwall防火墙
方法:访问规则 + NAT 把所有 UDP/53 重定向到内网 DNS
首先创建地址对象:Network > Address Objects > Add

依次创建其他公共DNS地址对象,并将他们加入到对象组中(规范化统一管理)


创建服务对象:Objects > Service Objects > Add(可省略)

创建 NAT 规则:Rules > NAT Policies > Add(可省略)

创建防火墙访问规则(匹配 NAT):Policy > Access Rules > LAN → WAN(可省略)

添加一条静态路由到 10.10.181.230,走默认网关:Network > Routing > Add Static Route

Interface:本地 LAN 接口
Gateway: LAN侧默认网关
到这一步就设置完成了,我发现有些步骤看不到流量,应该可以省略,我做了标记,从DNS服务器是可以看到DNS转发记录的,不清楚是否影响其他功能。
验证DNS流量命中
为了进一步确认本地电脑是否通过DNS服务器,可以在容器中抓包确认流量命中。
docker exec -it bind9-container-name bash
apt update && apt install -y tcpdump # 如果没装
#新容器可以没有网络安装tcpdump,需要设置
vim /etc/resolv.conf
nameserver 223.5.5.5
tcpdump -n udp port 53 | grep 10.10.128.30 #筛选日志
可以看到如下日志:

这就说明DNS重定向成功。
使用FQDN匹配流量
公司网络管理过程中,都需要对特定的网址进行带宽选路,对于小型网站可能就只绑定了一个IP地址,直接对特定的IP地址进行流量控制即可,对于国际型的网站在不同地区会有不同的IP地址,这就需要DNS去解析,需要通过FQDN匹配流量。
在我测试过程中,只添加FQDN记录,目标主机还是无法访问网站,需要结合上面在防火墙上设置的【DNS重定向】功能,由DNS服务器去解析目标网站,我猜测是防火墙本身的DNS设置问题,无法对域名进行解析。
以谷歌翻译(translate.google.com)为例,演示一下怎么操作。
首先在防火墙上添加FQDN记录:translate.google.com,然后设置路由让它走特定的带宽线路,去浏览器访问,这时仅仅能访问主网站,谷歌翻译它本身集成了多个网站资源。
使用无痕模式访问,F12打开开发者选项:

可以看到画面显示是有问题的,这是因为有很多资源没有被加载。
fonts.gstatic.com
fonts.googleapis.com
www.gstatic.com
ssl.gstatic.com
apis.google.com
play.google.com
将这些全部加到FQDN对象,指定路由,网页控制台基本没什么报错,网页正常访问就可以了。










