Schritte zum Installieren von WSL2 Linux Debian Edition auf einem Windows-Rechner (Windows 10)
Windows PowerShell als Administrator starten (Run as Administrator)
wsl --install Debian
Wenn dies mit einer Fehlermeldung "WslRegisterDistribution failed with error: 0x80370102" abbricht, dann fehlt noch der Eintrag unter "Windows Features" - dort "Virtual Machine Platform Windows" aktiv schalten.
Eventuell fehlt auch der Eintrag im BIOS, dass Virtualisierung nicht eingeschaltet (enabled) ist. Bei AMI Bios könnte das unter Avanced > SVM Mode > Enabled gesetzt werden.
Jetzt einen Benutzer-Namen eintragen nach der Installation sobald dies aufgefordert wird, z.B.
Enter new UNIX username: felix
New password: ****
Retype new password: ****
passwd: password updated successfully
Installation successful
Jetzt möchte man vielleicht einen ssh-Server laufen lassen, der vielleicht von Außen erreichbar ist...
Im Debian-Fenster einmal die momentane Version aktualisieren (updaten) mit:
sudo apt update
sudo apt upgrade
Jetzt kann man den SSH-Server installieren mit:
sudo apt install openssh-server
Wenn man die Standard-Optionen möchte kann man gleich den Service starten mit:
sudo service ssh restart
Damit der Service auf dem Windows-Rechner immer gestartet wird kann man 2 Varianten wählen. Entweder man bleibt bei der "old school", der init-Skript-Variante (A) oder man wählt die moderne systemd-Variante (B):
A) Init:
Hier sollte in der .bashrc des gesetzten Users folgende Zeile am Ende der Datei eingefügt werden:
cd
nano -c .bashrc
--
# start the ssh service
sudo /etc/init.d/ssh start
Dadurch, dass dieses Kommando sudo-Rechte braucht und deshalb um ein Passwort gefragt wird, sollte man ein File in
/etc/sudoers.d/
erzeugen, mit folgender Zeile:
ALL=NOPASSWD: /etc/init.d/ssh start
B) Systemd:
Nach der Anleitung auf https://learn.microsoft.com/en-us/windows/wsl/systemd können wir wie folgt vorgehen:
Im Verzeichnis /etc sollte die Datei wsl.conf angepasst werden, wenn diese noch nicht existiert dann:
sudo nano /etc/wsl.conf
--
[boot]
systemd=true
Nach einem Neustart mit z.B. "wsl.exe --shutdown" in der PowerShell werden alle WSL-Instanzen neu gestartet und man erhält die Linux-Distribution im systemd-Mode. Überprüfen kann man dies mit:
systemctl list-unit-files --type=service
Jetzt kann man den ssh-Service enablen/starten mit:
systemctl start ssh
systemctl enable ssh
Und man erspart sich die vielen obigen Einträge bei der Variante A) Init.
--
Generieren eines eignen Schlüsselpaares für ssh in WSL2, mit beispielsweise dem elyptischen (elliptic curve DSA) Ed25519 Schlussels:
ssh-keygen -t ed25519
Um in Windows beim Starten, bzw. nach dem Login automatisch die IP-Adresse zu eruieren und auch wsl2 automatisch gestartet werden - mit obigen Einstellungen müssen folgende Schritte gemacht werden:
Öffnen Sie den "Task Scheduler" mit Win + R, geben Sie taskschd.msc im Run-Dialogfeld ein und drücken Sie die Enter-Taste.
Im "Action"-Fenster auf der rechten Seite, klicken Sie auf "Create Task", oder zu Deutsch: "Aktionen"-Fenster mit "Aufgabe erstellen...".
Jetzt geben Sie der Aufgabe (task) einen Namen, beispielsweise "wsl2ip", und ändern Sie die Einstellungen auf
- * "Mit höchsten Privilegien ausführen" (Run with highest privileges).
- * "Ausgeblendet" (Hidden)
- -> Konfigurieren für: Windows 10 (Configure for: Windows 10)
Im Reiter "Trigger", (Triggers) müssen Sie folgende Einstellungen vornehmen:
- Aufgabe starten: (Begin the task:) Bei Anmeldung (At log on),
- Bestimmter Benutzer (Specific User): aktueller Benutzer der sich normalerweise anmeldet setzen
- Verzögern für: 30 Sekunden (Delay task for: 30 seconds) angeben,
- Aktiviert (Enabled)
Dann unter dem Reiter "Aktionen" (Actions): "Neu..." (New...) klicken:
- Unter Aktion: (Action:): "Programm starten" (Start a program) einstellen,
- Unter Protramm/Skript:
powershell.exe
- Unter "Argumente hinzufügen: (Add arguments):
-ExecutionPolicy Bypass c:\scripts\wsl2ip.ps1
- Alternativ, wenn Sie die Fensterausgabe unterdrücken wollen (blinkt nur kurz auf), dann folgende Argumente setzen:
-ExecutionPolicy Bypass -WindowStyle Hidden c:\scripts\wsl2ip.ps1
Wenn Sie jetzt "OK" drücken, dann sollte eine Zeile dort stehen:
Programm starten powershell.exe -ExecutionPolicy Bypass c:\scripts\wsl2ip.ps1
Oder in der englischen Veriante:
Start a program power powershell.exe -ExecutionPolicy Bypass c:\scripts\wsl2ip.ps1
Dann im Reiter "Bedingungen" (Conditions) sollte alles deaktiviert sein und unter "Einstellungen" (Settings) alles belassen wie es ist.
Als letzten Punkt muss natürlich jetzt diese Skriptdatei erstellt werden, wir bleiben dabei einfachheitshalber im gestarteten Linux-Debian und gehen mit folgenden Kommandos vor:
cd /mnt/c
mkdir scripts
cd scripts
nano -c wsl2ip.ps1
Nun erstellen wir im Editor den folgenden Inhalt:
# Script file for port forwarding Windows to WSL2
# IPv4 and IPv6 support:
$connaddrIPv4 = bash.exe -c "ip -4 address show dev eth0 | grep 'inet '"
$connaddrIPv6 = bash.exe -c "ip -6 address show dev eth0 | grep 'inet6 '"
$regIPv4 = '(?:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]))';
$regIPv_4 = '\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}';
$regIPv6 = '[0-9a-f:]{3,39}';
$found4 = $connaddrIPv4 -match $regIPv4;
echo "found4 = $found4 with connaddrIPv4 = $connaddrIPv4";
if ( $found4 ) {
$connaddrIPv4 = $matches[0];
} else {
echo "The IPv4 address of WSL2 was not found.";
}
$found6 = $connaddrIPv6 -match $regIPv6;
echo "found6 = $found6 with connaddrIPv6 = $connaddrIPv6";
if ( $found6 ) {
$connaddrIPv6 = $matches[0];
} else {
echo "The IPv6 address of WSL2 was not found.";
}
if ( !$found4 -and !$found6 ) {
echo "No IP address at all.";
exit;
}
echo "connaddrIPv4: $connaddrIPv4";
echo "connaddrIPv6: $connaddrIPv6";
#pause;
#[Ports]
#All the ports you want to forward separated by comma:
$ports=@(80,443,24368); #[Static IP]
#You can change the address to your ip configuration to listen to a specific address
# only connect from interal network:
$addrv4='0.0.0.0';
$addrv6='::';
$ports_a = $ports -join ",";
#Remove Firewall exception rules
iex "Remove-NetFireWallRule -DisplayName 'WSL2 firewall unlock' ";
#Adding exception rules for inbound and outbound rules
iex "New-NetFireWallRule -DisplayName 'WSL2 firewall unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL2 firewall unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";
for( $i = 0; $i -lt $ports.length; $i++ ){
$port = $ports[$i];
iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addrv4";
iex "netsh interface portproxy delete v6tov6 listenport=$port listenaddress=$addrv6";
if ( $found4 ) {
iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addrv4 connectport=$port connectaddress=$connaddrIPv4";
}
if ( $found6 ) {
iex "netsh interface portproxy add v6tov6 listenport=$port listenaddress=$addrv6 connectport=$port connectaddress=$connaddrIPv6";
}
}
Start-Process -FilePath "wsl.exe" -WindowStyle Hidden
pause
Eventuell kann man die letzte Zeile herausnehmen, falls man keine Ausgabe mehr möchte.
Ein ganz wichtiger Punkt ist natürlich die Einstellung des SSH-Ports, der weitergeleitet werden soll, dazu kann man den Standard-Port von 22 auf einen beliebigen Port > 1000 abändern. In unserem Beispiel ist dies der Port No. 24368, deshalb ändern Sie auch die obige Zeile bei ports von 24368 auf ihre persönliche Einstellung (Standardport ist der Port 22 für ssh). Diese Portnummer muss natürlich auch eingestellt werden, mit dem Befehl "sudo nano -c /etc/ssh/sshd_config":
/etc/ssh/sshd_config
--
#Port 22
Port 24368
Eventuell sollten Sie dort auch weitere Einstellungen zum open-ssh Server tätigen.