Netzwerk: Unterschied zwischen den Versionen

Aus Nerdberg
Wechseln zu:Navigation, Suche
Keine Bearbeitungszusammenfassung
 
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt)
Zeile 17: Zeile 17:
* 10.73.36.5 Laser!
* 10.73.36.5 Laser!
* 10.73.36.6 Laser VM
* 10.73.36.6 Laser VM
* 10.73.36.7 iVentoy
* 10.73.37.14 freepbx
* 10.73.37.14 freepbx


* 10.73.37.3 door server
* 10.73.37.3 door server


== DNS ==
== DNS ==
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.


=== Lets Encrypt ==
=== 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>

Aktuelle Version vom 8. November 2024, 21:29 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.36.7 iVentoy
  • 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()