Initial commit

master
Dustin 2020-09-06 10:25:25 -05:00
commit 08c4d3ed63
4 changed files with 84 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.zone

36
README.rst Normal file
View File

@ -0,0 +1,36 @@
===================================
BIND Response Policy Zone Generator
===================================
The :file:`rpzgen.py` script will generate a BIND response policy zone (RPZ)
definition from a list of "hosts files." These files contain a list of DNS
domains to be "blocked" by the resolver, preventing clients from reaching the
servers at those names.
Currently, the following hosts lists are used:
* `StevenBlack's Consolidated Hosts list`_
* Custom list
Host lists must be in the standard "hosts file" format (i.e. an IP address,
followed by whitespace, followed by a DNS name. Only the first name on each
line is used. Wildcard names are permitted.
Requirements
============
Only Python 3 is required; no external dependencies are used.
Usage
=====
The generated RPZ file is written to standard output. To save it to a file,
use shell redirection:
.. code:: sh
./rpzgen.py > blackhole.rpz.zone
.. _StevenBlack's Consolidated Hosts list: https://github.com/StevenBlack/hosts

6
hosts Normal file
View File

@ -0,0 +1,6 @@
# Block UniFi telementry
0.0.0.0 unifi-report.ubnt.com
0.0.0.0 ping.ui.com
# Block Roomba from accessing "the cloud"
0.0.0.0 *.irobotapi.com

41
rpzgen.py Executable file
View File

@ -0,0 +1,41 @@
#!/usr/bin/env python
import datetime
import string
import sys
import urllib.request
HOST_LISTS = [
'hosts',
'https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/fakenews-gambling/hosts',
]
ZONE_HEADER = string.Template('''\
$$TTL 3H
@ IN SOA @ rname.invalid. (
${serial} ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
nextcloud.pyrocufflink.net CNAME cloud0.pyrocufflink.blue.
''')
serial = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
sys.stdout.write(ZONE_HEADER.substitute(serial=serial))
for hostlist in HOST_LISTS:
if urllib.parse.urlsplit(hostlist).netloc:
f = urllib.request.urlopen(hostlist)
else:
f = open(hostlist, 'rb')
with f:
for line in f.readlines():
if line.startswith(b'0.0.0.0 '):
name = line.strip().split()[1].decode()
sys.stdout.write(f'{name} CNAME .\n')