diff --git a/lib/make-sysext.nix b/lib/make-sysext.nix
index ae1e763..d4f158e 100644
--- a/lib/make-sysext.nix
+++ b/lib/make-sysext.nix
@@ -43,6 +43,7 @@ runCommand name
     nativeBuildInputs = [
       pkgs.erofs-utils
       pkgs.cryptsetup
+      pkgs.gawk
       pkgs.jq
     ];
 
@@ -101,10 +102,26 @@ runCommand name
       local unit="$1"
       local content="$2"
 
-      mkdir -p $out/tree/usr/lib/systemd/system/multi-user.target.wants/
-      echo "$content" > $out/tree/usr/lib/systemd/system/$unit
-      # enable in multi-user.target
-      ln -s ../$unit $out/tree/usr/lib/systemd/system/multi-user.target.wants/$unit
+      local unit_file="$out/tree/usr/lib/systemd/system/$unit"
+
+      mkdir -p $out/tree/usr/lib/systemd/system
+      echo "$content" > $unit_file
+
+      # look for [Install] section and WantedBy in unit
+      if ! grep -q "^\[Install\]" "$unit_file"; then
+        echo "No [Install] section found in $unit_file"
+        return
+      fi
+
+      local wanted_by=$(sed -n '/^\[Install\]/,/^\[/{/^WantedBy=/s/^WantedBy=//p}' "$unit_file")
+
+      if [ -z "$wanted_by" ]; then
+        echo "No WantedBy found in [Install] section of $unit_file"
+        exit 1
+      fi
+
+      mkdir -p $out/tree/usr/lib/systemd/system/"$wanted_by".wants
+      ln -s ../$unit $out/tree/usr/lib/systemd/system/"$wanted_by".wants/$unit
     }
 
     mkdir -p $out/tree
diff --git a/pkgs/sysext/debug-tools.nix b/pkgs/sysext/debug-tools.nix
index 7ce0a99..2934c4c 100644
--- a/pkgs/sysext/debug-tools.nix
+++ b/pkgs/sysext/debug-tools.nix
@@ -51,27 +51,57 @@ pkgs.callPackage ../../lib/make-sysext.nix {
 
   services = [
     {
-      unit = "dropbear.service";
+      unit = "dropbear.socket";
       content = ''
         [Unit]
-        Description=Dropbear SSH server
-        After=network.target
-        Wants=network.target
+        Conflicts=dropbear.service
 
-        [Service]
-        Type=forking
-        ExecStartPre=/bin/mkdir -p /run/dropbear
-        ExecStartPre=/bin/sh -c "if [ ! -f /run/dropbear/dropbear_rsa_host_key ]; then /usr/bin/dropbearkey -t rsa -f /run/dropbear/dropbear_rsa_host_key -s 2048; fi"
-        ExecStart=/usr/bin/dropbear -p 22 -r /run/dropbear/dropbear_rsa_host_key
-        ExecReload=/bin/kill -HUP $MAINPID
-        KillMode=process
-        Restart=on-failure
-        RestartSec=5s
+        [Socket]
+        ListenStream=22
+        Accept=yes
 
         [Install]
-        WantedBy=multi-user.target
+        WantedBy=sockets.target
+        Also=dropbearkey.service
       '';
     }
+
+    {
+      unit = "dropbear@.service";
+      content = ''
+        [Unit]
+        Description=SSH Per-Connection Server
+        Wants=dropbearkey.service
+        After=network.target dropbearkey.service
+
+        [Service]
+        Environment="DROPBEAR_RSAKEY_DIR=/var/lib/dropbear"
+        ExecStart=-/usr/bin/dropbear -i -r ''${DROPBEAR_RSAKEY_DIR}/dropbear_rsa_host_key
+        ExecReload=/usr/bin/kill -HUP $MAINPID
+        StandardInput=socket
+        KillMode=process
+      '';
+    }
+
+    {
+      unit = "dropbearkey.service";
+      content = ''
+        [Unit]
+        Description=SSH Key Generation
+        RequiresMountsFor=/var /var/lib
+        ConditionPathExists=!/var/lib/dropbear/dropbear_rsa_host_key
+
+        [Service]
+        Type=oneshot
+        Environment="DROPBEAR_RSAKEY_DIR=/var/lib/dropbear"
+        Environment="DROPBEAR_RSAKEY_ARGS=-s 2048"
+        ExecStart=/usr/bin/mkdir -p ''${DROPBEAR_RSAKEY_DIR}
+        ExecStart=/usr/bin/dropbearkey -t rsa -f ''${DROPBEAR_RSAKEY_DIR}/dropbear_rsa_host_key ''${DROPBEAR_RSAKEY_ARGS}
+        RemainAfterExit=yes
+        Nice=10
+      '';
+    }
+
   ];
 
 }