前言
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服务器,可以在容器中抓包确认流量命中。
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重定向成功。