Pi-hole是一款开源且免费的DNS沉洞服务器(DNS sinkhole),能够在不安装任何客户端侧软件的前提下为设备提供网络内容屏蔽服务,非常轻量易用。
部署Docker Pi-hole
首先,我们查看Docker版本的Pi-hole项目地址: https://github.com/pi-hole/docker-pi-hole/
根据Quick Start中的步骤,我们创建一个docker-compose.yml
的文件,内容如下:
1 | version: "3" |
因为Pi-hole要使用自己服务来接管53端口,需要先关闭系统自身的DNS服务(dnsmasp或者systemd-resolved,与系统自身有关):
1 | systemctl stop systemd-resolved |
否则会因为端口抢占导致异常:
1 | ERROR: for pihole Cannot start service pihole: driver failed programming external connectivity on endpoint pihole (cfdba20c40213efab5b1b64f4b0d13ba69d057c77ae5a93daa00c72c45026f78): Error starting userland proxy: listen tcp4 0.0.0.0:53: bind: address already in use |
接下来通过docker-compose来构建和运行:
1 | docker-compose up -d |
安装好以后获取Pi-hole的admin密码:
1 | docker logs pihole | grep random |
登陆后需要在Tools
->Update Gravity
中点击update来更新一次Adlist Domain。
安装Docker Ubuntu
为了验证下Pi-hole的功能,我们拉取一个Ubuntu镜像。
1 | docker pull ubuntu |
建立Docker网桥
我们需要将两个容器关联起来,放进一个网络,这时候需要使用网桥。查看默认的Docker Network:
1 | root@vultr:~# docker network ls |
接下来创建一个自定义的网络,将Ubuntu、Pi-hole都放在该网络中。
1 | $ docker network create pihole_net |
可以在Containers
部分查看到两个容器对应的IP地址。进入Ubuntu系统中可以查看到两块网卡:
1 | ifconfig |
为了方便测试验证,我们在Ubuntu容器中安装基础工具,进行网络验证:
1 | $ apt update |
现在网络已经打通,我们可以通过dig命令指定DNS服务器为pi-hole的IP地址。
1 | $ dig @172.19.0.2 google.com |
可以看到,google.com
能够正常解析,mclean.f.360.cn
已经被sinkhole。
接下来,准备两批域名批量做dig请求测试,一批为Alexa Top 5000,一批为Adlist Top 1000。其中Adlist地址可以在Group Management
->Adlists
中找到。批量通过很简单的shell脚本去实现:
1 | cat t-1.sh |
下面放两张图,分别是Pi-hole配置完的未登录状态和批量测试后的登录状态:
以上就是Pi-hole的Docker版本功能验证了,可以说非常的简单,在家里拿来屏蔽广告是个不错的选择,感兴趣的同学可以自行安装体验。关于sinkhole,实际攻防两方都会使用,我放了参考链接在下面,感兴趣的同学可以看看。
参考
1、https://sspai.com/post/58183
2、https://zh.m.wikipedia.org/zh-hans/DNS%E6%B2%89%E6%B4%9E
3、https://encyclopedia.kaspersky.com/glossary/sinkhole/
4、https://resources.infosecinstitute.com/topic/dns-sinkhole/
5、https://www.malwarepatrol.net/dns-sinkholes-detect-and-protect/