]> mj.ucw.cz Git - pynsc.git/blob - nsconfig/sink.py
198a6b74e35eabe42dd6305adab2c4a320505e05
[pynsc.git] / nsconfig / sink.py
1 from typing import List
2
3 from nsconfig.core import Nsc, NscZonePrimary
4 from nsconfig.util import IPNetwork, parse_network
5
6 # Networks which should have blackhole reverse zones as recommended by RFC 6303
7 BLACKHOLE_NETWORKS = [
8     '0.0.0.0/8',                # IPv4 reserved
9     '10.0.0.0/8',               # IPv4 private
10     '169.254.0.0/16',           # IPv4 link-local
11     '192.0.2.0/24',             # IPv4 test
12     '192.168.0.0/16',           # IPv4 private
13     '198.51.100.0/24',          # IPv4 test
14     '203.0.113.0/24',           # IPv4 test
15     '255.255.255.255/32',       # IPv4 broadcast
16     '::0/128',                  # IPv6 unspecified
17     '2001:0db8::/32',           # IPv6 example
18     'fd00::/8',                 # IPv6 unique local
19     'fe80::/12',                # IPv6 link-local
20     'fe90::/12',
21     'fea0::/12',
22     'feb0::/12',
23 ] + [f'172.{i}.0.0/16' for i in range(16, 32)]  # IPv4 private
24
25
26 def generate_localhost(nsc) -> None:
27     z = nsc.add_zone('localhost')
28     (z[""]
29         .NS(z.config.origin_server)
30         .A('127.0.0.1', '::1'))
31
32     r4 = nsc.add_zone(reverse_for='127.0.0.0/8')
33     r4[""].NS(z.config.origin_server)
34
35     r6 = nsc.add_zone(reverse_for='::1/128')
36     r6[""].NS(z.config.origin_server)
37
38
39 def generate_blackhole(nsc: Nsc,
40                        skip_networks: List[IPNetwork] = [],
41                        admin_email: str = 'nobody@invalid',
42                        **kwargs) -> None:
43     invalid_zone = nsc.add_zone('invalid', admin_email=admin_email, **kwargs)
44     invalid_zone[""].NS(invalid_zone.config.origin_server)
45     assert isinstance(invalid_zone, NscZonePrimary)
46     for raw_net in BLACKHOLE_NETWORKS:
47         net = parse_network(raw_net)
48         if net not in skip_networks:
49             nsc.add_zone(reverse_for=net, alias_for=invalid_zone)