Ubuntu系统下Bind9 DNS配置白名单:仅允许指定网站访问,屏蔽其余所有网络连接
Ubuntu系统下Bind9 DNS配置白名单:仅允许指定网站访问,屏蔽其余所有网络连接
兄弟,我来帮你搞定这个Bind9的白名单配置问题!之前你试了RPZ和转发没成功,大概率是配置细节没做对,我给你一步步捋清楚:
先确认Bind9状态
首先确保你的Bind9是正常运行的,先查状态:
sudo systemctl status bind9
如果没启动就先启动:
sudo systemctl start bind9
顺便设个开机自启,省得重启后还要手动开:
sudo systemctl enable bind9
第一步:创建RPZ白名单区域文件
RPZ(Response Policy Zone)是Bind官方推荐的黑白名单实现方式,咱们用它来做白名单。在/etc/bind/目录下新建一个RPZ配置文件,比如rpz-whitelist.db:
sudo nano /etc/bind/rpz-whitelist.db
把下面的内容粘贴进去,记得替换成你要允许的网站:
$TTL 604800 @ IN SOA localhost. root.localhost. ( 2 ; Serial,每次修改文件后把这个数字+1 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS localhost. ; ========== 这里是你的白名单网站 ========== google.com. IN A 8.8.8.8 # 替换成网站的真实IP,或者用CNAME也行 github.com. IN A 140.82.113.3 www.baidu.com. IN CNAME www.a.shifen.com. # 有些网站用CNAME更灵活 ; 可以继续添加更多你需要允许的域名,包括子域名 ; ========== 屏蔽所有其他域名 ========== * IN A 0.0.0.0 # 所有非白名单域名解析到无效IP,无法访问
保存退出(nano里按Ctrl+O,回车,再Ctrl+X)。
第二步:修改Bind主配置文件
接下来修改Bind的主配置/etc/bind/named.conf.options,把RPZ和转发配置加进去:
sudo nano /etc/bind/named.conf.options
把内容改成这样(注意替换你的局域网网段,比如192.168.1.0/24):
options { directory "/var/cache/bind"; // 允许你的客户端网段查询解析,替换成你的局域网IP段 recursion yes; allow-recursion { 127.0.0.1; 192.168.1.0/24; }; allow-query { 127.0.0.1; 192.168.1.0/24; }; // 配置转发器,把白名单域名的解析请求转发到公共DNS(比如谷歌的8.8.8.8) forwarders { 8.8.8.8; 8.8.4.4; }; forward only; // 启用RPZ规则,指向咱们刚才创建的白名单区域 response-policy { zone "rpz-whitelist"; }; }; // 引入RPZ白名单区域文件 zone "rpz-whitelist" { type master; file "/etc/bind/rpz-whitelist.db"; allow-query { none; }; // 禁止外部查询这个白名单区域,保证安全 };
保存退出。
第三步:验证配置并重启服务
先检查配置文件的语法是否正确,避免出错:
sudo named-checkconf # 检查主配置 sudo named-checkzone rpz-whitelist /etc/bind/rpz-whitelist.db # 检查RPZ区域文件
如果没有报错,就重启Bind9让配置生效:
sudo systemctl restart bind9
第四步:在客户端测试效果
把客户端的DNS服务器地址改成你的Bind服务器的IP,然后测试:
- 访问白名单里的网站,比如
ping google.com,应该能正常解析到正确IP并连通 - 访问非白名单网站,比如
ping yahoo.com,应该会解析到0.0.0.0,无法访问
一些重要注意事项
- 子域名需要单独添加:比如如果要允许
mail.google.com,得在RPZ文件里单独加一条记录,不然默认会被屏蔽 - 网站IP可能变化:如果用A记录,定期检查网站的官方IP;用CNAME会更灵活,自动跟随目标IP变化
- 修改RPZ文件后要更新Serial号:每次修改白名单,把文件里的Serial数字加1,然后重启Bind或者用
sudo rndc reload重载配置 - 确保客户端网段正确:
allow-recursion和allow-query里的网段一定要包含你的客户端IP,不然客户端无法使用这个DNS服务
备注:内容来源于stack exchange,提问作者Imran Ikram




