Ubuntu Server 22.04 systemd-resolved blockiert Port 53

polyphase

Commander
Registriert
Dez. 2010
Beiträge
2.766
Hintergrund ist, das ich für einen DNS Dienst den Port 53 meines Ubuntu Servers benötige.
Leider wird dieser von systemd-resolved verwendet, da Ubuntu wohl hier einen internen DNS Cache nutzt.

Nun würde ich das gerne ändern, da ich den Port 53 benötige. Eigentlich sollte ich wissen wie das geht und irgendwo hatte ich mir das auch mal aufgeschrieben, nur finde ich das gerade nicht.

Die Anleitungen im Netz sind leider unvollständig, bzw. beziehen sich auf ältere Ubuntu Versionen.
 
Grobe Vermutung, da ich systemd-resolvd noch nicht angerührt habe:
  • systemctl stop systemd-resolved
  • systemctl disable systemd-resolved

Wenn ich mich richtig entsinne, wird zwar so der Port frei da kein DNS-Dienst mehr läuft,
aber dann hat auch das System kein DNS.
Also nicht wundern, dass keine DNS-Auflösung funktioniert, bis du den anderen DNS-Server
zum Laufen bekommen hast.
 
Ja, soweit hatte ich das noch im Kopf.
Man konnte dann aber Ubuntu anweisen den DNS Server zu nehmen, welche von DHCP zugewiesen wird.

Sonst verwendet Ubuntu soweit ich weis einfach die Google DNS Server und das will ich wirklich nicht 😉
 
polyphase schrieb:
Nun würde ich das gerne ändern, da ich den Port 53 benötige.
Darf ich fragen wofür? Standard Ports sollte man lieber in Ruhe lassen, und lieber die anderen ändern, die man anderweitig verwenden will.
 
Für meinen DNS Server, welcher in einem Docker Container läuft.
Zugriff ist über eine Firewall geregelt, die Ubuntu Server Installation läuft in einer VM (Proxmox) meines Homelabs.

Bin dabei alles von VMs auf Container umzustellen, um Ressourcen Frei zu bekommen. Da ich meine Synology ersetzen möchte und dafür Ersatzdienste einrichte.
 
gleiches problem hier:
Code:
nano /etc/systemd/resolved.conf
  DNSStubListener=no

systemctl restart systemd-resolved

in der /etc/resolv.conf dann den richtigen nameserver eintragen.
 
  • Gefällt mir
Reaktionen: madmax2010 und polyphase
0x8100 schrieb:
in der /etc/resolv.conf dann den richtigen nameserver eintragen.
Geht leider nicht, da Ubuntu wieder sein eigenes Süppchen kocht:
Code:
resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

Ich bekomme schon wieder die Krise!
Code:
cd /run/systemd/resolve/
-bash: cd: /run/systemd/resolve/: No such file or directory

Wäre Ubuntu Server mit dem LTS nicht so praktisch würde ich schon längst wieder Debian verwenden, obwohl, das ist manchmal auch recht komisch.

Edit:
Wenn ich dne Dienst wieder starte ist natürlich auch das verzeichnis wieder da! Man bin ich blöd!
Also muss ich erstmal den Link umbiegen.
 
polyphase schrieb:
Sonst verwendet Ubuntu soweit ich weis einfach die Google DNS Server und das will ich wirklich nicht 😉
systemd-resolved nutzt Google DNS nur als vorkonfigurierten Fallback, falls alle anderen DNS Konfigurationen nicht funktionieren. Ansonsten beachtet resolved die via DHCP kommunizierten oder die manuell konfigurierten DNS Server.

Wenn du einen eigenen DNS-Server in einen Container werfen willst, dann würde ich resolved beim Host unangetastet lassen.
Lösungansätze sehen Imho so aus: https://stackoverflow.com/questions...ainer-to-specific-external-interface#32054957

Ich habe mit Containern nicht viel am Hut, aber es wäre arg unsinnig irgendwas über Container zu isolieren, um dann beim Host großartig an grundlegender Konfiguration zu verbiegen..

Edit: Ich habe es auch schon länger nicht mehr angepackt. Aber bei Ubuntu Server wird die Config vom Netzwerkkram doch über netplan erledigt!? Wenn du händig in der Config resolved, networkd etc. Dinge abänderst könnte netplan da dagegen arbeiten.
 
  • Gefällt mir
Reaktionen: GTrash81
polyphase schrieb:
Geht leider nicht, da Ubuntu wieder sein eigenes Süppchen kocht:
habe ich grade verwechselt. bei mir wird das per dhcp gemacht. du müsstest aber den dns-server in der /etc/systemd/resolved.conf mit DNS=a.b.c.d (ist bereits als beispiel drin) eintragen können, wenn du das statisch brauchst.
 
@Piktogramm danke für den Link, genau so will ich das aber nicht.
Es gibt keinen Grund, das Ubuntu Server einen eigenen DNS Server laufen lässt.
Den gibts vom Netzwerk!

@0x8100
Symlink umbiegen hat gereicht:
Code:
ln -sf ../run/systemd/resolve/resolv.conf /etc/resolv.conf
Ubuntu füllt die ensprechende resolve.conf selbst mit dem DNS Server welchen es vom DHCP Server bekommt. Das ist schon so vorgesehen, wenn jemand den internen Resolver nicht nutzen möchte.


Also hier die komplette Anleitung:

  1. Code:
    nano /etc/systemd/resolved.conf
    DNSStubListener=no
  2. Code:
    ln -sf ../run/systemd/resolve/resolv.conf /etc/resolv.conf
  3. Code:
    systemctl restart systemd-resolved
 
polyphase schrieb:
Es gibt keinen Grund, das Ubuntu Server einen eigenen DNS Server laufen lässt.
Den gibts vom Netzwerk!
Ähm, doch. Nur das wäre jetzt eine systemd Diskussion.

Dein eigendliches Problem ist vermutlich das du in Docker den Port mit 53:53 angegeben hast. Das ist kurz für 0.0.0.0:53:53, also alle Netzwerkinterfaces.

In der resolv.conf müsste 127.0.0.53 drin stehen. Das ist eine IP auf einem internen Interface.
Der DNS kommt dir nicht in die Quere sondern du konfigurierst deinen DNS Dienst falsch.

Lösung:
Bei docker einfach deine LAN und loopback IP angeben. Z.B.
Code:
-p 192.168.1.20:53:53 -p 127.0.0.1:53:53
Oder bei einer compose YML in deren Format.
 
  • Gefällt mir
Reaktionen: Piktogramm
dasbene schrieb:
Lösung:
Bei docker einfach deine LAN und loopback IP angeben. Z.B.
Code:
-p 192.168.1.20:53:53 -p 127.0.0.1:53:53
Oder bei einer compose YML in deren Format.
Entweder stehe ich auf dem Schlauch, oder kapier ich einfach nicht was du mir damit sagen willst.
Du legst den 53er Port der Loopbackadresse, auf den 53 Port auf der Adresse des Hosts?
 
polyphase schrieb:
Hintergrund ist, das ich für einen DNS Dienst den Port 53 meines Ubuntu Servers benötige.
Leider wird dieser von systemd-resolved verwendet, da Ubuntu wohl hier einen internen DNS Cache nutzt.
Das stimmt so nicht, denn systemd-resolved nutzt nur 127.0.0.53:53. Und dann macht auch der Hinweis von @dasbene Sinn: Wenn du dein Docker sauber konfigurierst, dass es nicht einfach brutal überall Port 53 will, dann kommt es sich mit dem systemd-resolved gar nicht in die Quere, und du kannst beide problemlos parallel betreiben. Ich hab seit langem einen unbound in einem Container und einen Pihole in einem anderen Container und nutze immer den DNS Server, der gerade benötigt wird. Und das trotz systemd-resolved.
 
  • Gefällt mir
Reaktionen: Piktogramm
Stell dir vor du hast 4 Interfaces mit folgenden IPs:
  • 127.0.0.1 bzw. localhost als loopback
  • 192.168.1.20 von deinem Router
  • 127.0.0.53 ein internes Netzwerk
  • 192.168.1.41 vom WLAN, falls gleichzeitig verbunden
Wenn du Docker am laufen hast erstellt die Docker Engine noch weitere Interfaces. Am Ende ist können das relativ viele werden. IPv6 Interfaces kommen auch noch dazu.

Im Normalfall gibt man bei einem docker run Befehl -p 53:53 an. Jeder Parameter mit -p ist eine Portweiterleitung von dem Docker Container auf ein anderes Interface. Oder in dem Normalfall implizit auf 0.0.0.0 was für alle Interfaces steht.

Wenn du mehrere Ports freigeben willst kannst du mehrer -p Parameter angeben. Also für einen Webserver würde z.B. -p 80:80 -p 443:443 angegeben werden. Dies würde beide Ports auf alle Netzwerke weiterleiten.
Wenn du jetzt einen Port nicht auf alle Interfaces weiterleiten willst sonder nur auf 2 davon gibst du einzelne Weiterleitungen für diese beiden an. Wie z.B. -p 192.168.1.20:53:53 -p 127.0.0.1:53:53.

Mal ein etwas praktischeres Beispiel:
Bei einigen alten Spielen musste man in den Einstellungen ein Netztwerkinterface (dargestellt durch die IP) auswählen, damit das Spiel weiß wo es nach anderen LAN Spielen suchen muss.
 
  • Gefällt mir
Reaktionen: polyphase und Piktogramm
dasbene schrieb:
Wenn du mehrere Ports freigeben willst kannst du mehrer -p Parameter angeben. Also für einen Webserver würde z.B. -p 80:80 -p 443:443 angegeben werden. Dies würde beide Ports auf alle Netzwerke weiterleiten.
Wenn du jetzt einen Port nicht auf alle Interfaces weiterleiten willst sonder nur auf 2 davon gibst du einzelne Weiterleitungen für diese beiden an. Wie z.B. -p 192.168.1.20:53:53 -p 127.0.0.1:53:53.

Also verstehe ich das richtig.
Wenn das Netzwerkinterface vom Host z.B. die 192.168.1.25 ist, dann muss ich einfach in der Docker Compose YAML, das so angeben:
Code:
192.168.1.25:53:53

Und Docker leitet diesen Port nur auf diesem Interface weiter und kommt dem interen Resolver nicht mehr in die Quere?
 
polyphase schrieb:
Und Docker leitet diesen Port nur auf diesem Interface weiter und kommt dem interen Resolver nicht mehr in die Quere?
Ja.

Man kann damit auch noch mehr machen. Z.B. eine Admin Oberfläche auf 127.0.0.1 legen und die damit nur lokal erreichbar machen.
 
  • Gefällt mir
Reaktionen: polyphase und Piktogramm
Zurück
Oben