Netzwerk: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
Zeile 33: | Zeile 33: | ||
Nach anpassen der zone die serial inkrementieren und ''systemctl restart nsd unbound'' ausführen. | Nach anpassen der zone die serial inkrementieren und ''systemctl restart nsd unbound'' ausführen. | ||
=== | === Let's Encrypt === | ||
Damit Dienste wie der Türserver ein gültiges Zertifikat bekommen, gibt es auf dem dhcp ein Dienst auf Port 8080 eine API, die ein ACME Key im DNS hinterlegen kann. | Damit Dienste wie der Türserver ein gültiges Zertifikat bekommen, gibt es auf dem dhcp ein Dienst auf Port 8080 eine API, die ein ACME Key im DNS hinterlegen kann. | ||
Zeile 45: | Zeile 45: | ||
certbot certonly --manual -d door.nerdberg.de --preferred-challenges dns --agree-tos --manual-auth-hook /opt/certbotdns.sh --manual-public-ip-logging-ok -i apache | certbot certonly --manual -d door.nerdberg.de --preferred-challenges dns --agree-tos --manual-auth-hook /opt/certbotdns.sh --manual-public-ip-logging-ok -i apache | ||
Der Token befindet sich auf dem DHCP im API Script: | |||
/opt/api.py | |||
<pre> | |||
import sys, os | |||
from http.server import BaseHTTPRequestHandler, HTTPServer | |||
from urllib import parse | |||
import subprocess | |||
FILE = os.path.join("/etc/nsd/zones","nerdberg.de.zone") | |||
TOKEN = "TOKEN" | |||
def changeZone(challenge, domain): | |||
with open(FILE) as file: | |||
data = file.readlines() | |||
nextline = False | |||
for line in range(len(data)): | |||
if "SOA" in data[line]: | |||
nextline = True | |||
continue | |||
if nextline: | |||
serial = int(data[line].strip().split(" ")[0]) | |||
data[line] = data[line].replace(str(serial),str(serial+1)) | |||
nextline = False | |||
if data[line].startswith("_acme"): | |||
data[line] = '_acme-challenge.'+domain+' 60 IN TXT "'+challenge+'"\n' | |||
with open(FILE, "w") as file: | |||
file.writelines(data) | |||
subprocess.run(['systemctl', 'reload', 'nsd']) | |||
class GetHandler(BaseHTTPRequestHandler): | |||
def do_GET(self): | |||
qs = parse.parse_qs(parse.urlsplit(self.path).query) | |||
if 'token' in qs and TOKEN in qs['token'] and 'challenge' in qs and 'domain' in qs: | |||
changeZone(qs['challenge'][0], qs['domain'][0]) | |||
self.send_response(200) | |||
self.send_header('Content-type', 'text/html') | |||
self.end_headers() | |||
self.wfile.write(bytes("Okay","utf8")) | |||
else: | |||
self.send_response(500) | |||
self.send_header('Content-type', 'text/html') | |||
self.end_headers() | |||
self.wfile.write(bytes("Error","utf8")) | |||
if __name__ == '__main__': | |||
server = HTTPServer(('0.0.0.0', 8080), GetHandler) | |||
server.serve_forever() | |||
</pre> |
Version vom 11. Februar 2023, 09:49 Uhr
Netzwerkeinstellungen
DHCP regelt die IPs.
IP Netze:
- 10.73.36.0/23 dynamisch
- 10.73.37.0/24 für statische IPs, werden auch vom DHCP vergeben
- DHCP range 10.73.36.10-10.73.37.254
Geräte wie der Laser, die kein DHCP sprechen, werden statisch in das 36er Netz zugeteilt und der Start der DHCP range entsprechend angepasst.
Statische IPs
- 10.73.36.1 Gateway/Modem/FritzBox
- 10.73.36.2 DHCP / DNS
- 10.73.36.3 TFTP Server
- 10.73.36.4 Proxmox Hypervisor
- 10.73.36.5 Laser!
- 10.73.36.6 Laser VM
- 10.73.37.14 freepbx
- 10.73.37.3 door server
DNS
Es gibt drei DNS-Server, die alle auf dem dhcp.nerdberg.de laufen.
- dnsmasq lauscht auf Port 53531, macht dhcp und ist authoritativ für die zone "dhcp.nerdberg.de". Diese zone wird via cronjob (nsd-control force_transfer dhcp.nerdberg.de && nsd-control write dhcp.nerdberg.de) 1x/minute per AXFR zone transfer an NSD übermittelt.
- unbound lauscht auf Port 53, ist der rekursive resolver. Er verweist auf nsd für die nerdberg.de zone und auf dnsmasq für die dhcp.nerdberg.de zone, sowie für die internen reverse dns zonen. Ansonsten verweist er auf den DNS server von Bisping für upstream.
- nsd lauscht auf Port 53530 und ist der authoritative DNS Server für die nerdberg.de zone. Die dhcp.nerdberg.de zone ist als secondary ebenfalls vorhanden. Er ist von extern auf port 53 erreichbar.
Das zonefile für nerdberg.de liegt unter /etc/nsd/zones/nerdberg.de.zone. Nach anpassen der zone die serial inkrementieren und systemctl restart nsd unbound ausführen.
Let's Encrypt
Damit Dienste wie der Türserver ein gültiges Zertifikat bekommen, gibt es auf dem dhcp ein Dienst auf Port 8080 eine API, die ein ACME Key im DNS hinterlegen kann.
Aufruf: http://dhcp.nerdberg.de:8080?token=$PASS&challenge=$CERTBOT_VALIDATION&domain=$SUBDOMAIN
Das ganze deployen und verteilen auf allen Nameservern dauert ca. 10 Sekunden. Danach kann mit Certbot eine Abfrage gemacht werden.
Für Apache hat sich folgender Befehl bewährt:
certbot certonly --manual -d door.nerdberg.de --preferred-challenges dns --agree-tos --manual-auth-hook /opt/certbotdns.sh --manual-public-ip-logging-ok -i apache
Der Token befindet sich auf dem DHCP im API Script: /opt/api.py
import sys, os from http.server import BaseHTTPRequestHandler, HTTPServer from urllib import parse import subprocess FILE = os.path.join("/etc/nsd/zones","nerdberg.de.zone") TOKEN = "TOKEN" def changeZone(challenge, domain): with open(FILE) as file: data = file.readlines() nextline = False for line in range(len(data)): if "SOA" in data[line]: nextline = True continue if nextline: serial = int(data[line].strip().split(" ")[0]) data[line] = data[line].replace(str(serial),str(serial+1)) nextline = False if data[line].startswith("_acme"): data[line] = '_acme-challenge.'+domain+' 60 IN TXT "'+challenge+'"\n' with open(FILE, "w") as file: file.writelines(data) subprocess.run(['systemctl', 'reload', 'nsd']) class GetHandler(BaseHTTPRequestHandler): def do_GET(self): qs = parse.parse_qs(parse.urlsplit(self.path).query) if 'token' in qs and TOKEN in qs['token'] and 'challenge' in qs and 'domain' in qs: changeZone(qs['challenge'][0], qs['domain'][0]) self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write(bytes("Okay","utf8")) else: self.send_response(500) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write(bytes("Error","utf8")) if __name__ == '__main__': server = HTTPServer(('0.0.0.0', 8080), GetHandler) server.serve_forever()