X Window System für Windows, um grafische Anwendungen unter Windows-Subsystem für Linux (WSL) auszuführen

Monday, April 2, 2018

Mit dem Subsystem für Linux in Windows (WSL) können Linux-Distributionen wie bspw. Debian GNU/Linux direkt unter Windows ausgeführt werden – einschließlich aller Anwendungen.

Um grafische Anwendungen (GUI) unter WSL ausführen zu können, muss unter Windows ein X Window System/X-Server installiert sein.

Es bietet sich hier an, den X-Server von Gygwin/X XWin.exe zu installieren, da Gygwin auch viele andere Pakete wie Perl, SSH, usw. bereitstellt und es ggf. schon installiert ist. Auf die Installation von Gygwin selbst geht dieser Artikel aber nicht weiter ein. Wie man Gygwin unter Windows installiert, aktualisiert usw. ist auf der Webseite des Projekts beschrieben. Siehe: https://cygwin.com und https://x.cygwin.com/. Kurz: Es wird das Programm setup-x86_64.exe ausgeführt und im Dialog ein Mirror ausgewählt, die Paketliste geladen/aktualisiert und die Pakete zur Installation/Aktualisierung ausgewählt.

Ist kein X-Server installiert, wird dies i.d.R. durch folgende Fehlermeldung ausgedrückt:

$ DISPLAY=":0" thunderbird # Start einer grafischen Anwendung (hier thunderbird)
Unable to init server: Could not connect: Connection refused
Error: cannot open display: :0

X-Server installieren

Der X-Server XWin.exe wird über das Cygwin-Paket xorg-server installiert:

wsl-x-server.png

Damit XWin.exe beim Windows Systemstart startet, muss es in den Autostart z.B. unter %APPDATA%\Microsoft\Windows\Start Menu\Programs\startup:

wsl-x-server-autostart.png

Wichtig für eine Verknüpfung im Autostart ist als Ziel: C:\cygwin64\bin\XWin.exe :0 -multiwindow -listen tcp -auth und Ausführen in: C:\cygwin64\home\%USERNAME% anzugeben.

Außerdem muss in der Windows Firewall XWin.exe konfiguriert/eingetragen sein, da es ein Netzwerkprotokoll ist! Der Zugriff muss aber nicht erlaubt werden und der Dialog kann mit abbrechen beendet werden.

Nun können auch grafische Anwendungen aus WSL (und auch aus Gygwin) heraus gestartet werden.

Die Anwendungsdaten befinden sich in folgenden Ordnern:

  • WSL:
    /mnt/c/Users/,
    /mnt/c/Cygwin/home/, /mnt/c/Cygwin64/home/,
    %LOCALAPPDATA%\Packages\*\LocalState\rootfs\home\
  • Cygwin:
    /cygdrive/c/Users/,
    C:\Cygwin\home\, C:\Cygwin64\home\,
    /cygdrive/c/Users/*/AppData/Local/Packages/*/LocalState/rootfs/home/

Portscan: Hosts/Rechner und offene Ports im Netzwerk finden

Saturday, December 9, 2017

Um sich einen Überblick über das Netzwerk (LAN/WLAN) zu verschaffen, zu dem man sich verbunden hat, kann man einen Portscan auf das Netzwerk durchführen, um verbundene Hosts und angebotene Services/Dienste zu finden.

Unter Linux/GNOME kann der NetworkManager bzw. nmcli(1) verwenden werden, um sich die Netze anzuzeigen, zu denen man verbunden ist:

$ export LC_ALL=C # Damit der reguläre Ausdruck s.u. korrekt ist
$ lsip () {
>	nmcli -f uuid,device connection show --active \
>	| awk 'NR>1 && $2!="lo" {print $1}' \
>	| xargs nmcli -t connection show \
>	| sed -n -E "/^IP4.ADDRESS\[[0-9]+\]:/{s///;p}"
> }
$ lsip
192.168.1.91/24
10.230.42.59/28
192.168.10.200/24

Und dann mit z.B. nmap(1) einen Standard Nmap scan ausführen, um sich alle Hosts/Rechner anzuzeigen, die erreichbar sind (Ping), sowie deren offene Ports:

$ lsip | xargs nmap

Starting Nmap 7.40 ( https://nmap.org ) at 2017-12-14 18:20 CET
Nmap scan report for o2.box (192.168.1.1)
Host is up (0.00091s latency).
Not shown: 992 filtered ports
PORT     STATE SERVICE
21/tcp   open  ftp
80/tcp   open  http
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
515/tcp  open  printer
631/tcp  open  ipp
5431/tcp open  park-agent
9100/tcp open  jetdirect

Nmap scan report for 192.168.1.10
Host is up (0.00041s latency).
Not shown: 996 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
53/tcp  open  domain
80/tcp  open  http
443/tcp open  https

Nmap scan report for mydebian (192.168.1.91)
Host is up (0.00012s latency).
All 1000 scanned ports on 192.168.1.91 are closed

Nmap scan report for frei.funk (10.230.42.49)
Host is up (0.0032s latency).
Not shown: 996 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
53/tcp  open  domain
80/tcp  open  http
443/tcp open  https

Nmap scan report for android-a65183dd756bed42.lan (10.230.42.55)
Host is up (0.027s latency).
All 1000 scanned ports on android-a65183dd756bed42.lan (10.230.42.55) are closed

Nmap scan report for android-42250764e309f587.lan (10.230.42.56)
Host is up (0.022s latency).
All 1000 scanned ports on android-42250764e309f587.lan (10.230.42.56) are closed

Nmap scan report for 10.230.42.59
Host is up (0.000051s latency).
All 1000 scanned ports on 10.230.42.59 are closed

Nmap scan report for 192.168.10.200
Host is up (0.00030s latency).
All 1000 scanned ports on 192.168.10.200 are closed

Nmap done: 528 IP addresses (8 hosts up) scanned in 92.28 seconds

Vor einem Ping scan (oder auch Ping sweep) verstecken

Nmap sendet vor dem Portscan einen Ping, um die Erreichbarkeit einer IP-Adresse festzustellen und überspringt Adressen, die darauf keine Antwort senden (Pong).

Damit keine Antwort gesendet wird, müssen folgende Kernel-Parameter gesetzt werden:

# cat <<! >>/etc/sysctl.d/00-local.conf
> net.ipv4.icmp_echo_ignore_all=1
> net.ipv4.icmp_echo_ignore_broadcasts=1
> !
# sysctl -p

Alles scannen

Um den Ping scan zu deaktivieren und alle IP-Adressen zu scannen (-PN) und so auch verstecke Ports zu finden (-p), sowie die Betriebssystemerkennung (-O), die Versionserkennung (-sV), das Scannen mit Scripts (-sC) und traceroute (--traceroute) zu aktivieren und so mehr Details angezeigt zu bekommen, nutzt man folgende Parameter (Viele der genannten Parameter sind unter dem Parameter -A zusammengefasst, denn dieser soll einen umfassenden Satz von Scan-Optionen aktivieren, ohne dass man sich viele Parameter merken muss):

$ lsip | xargs nmap -A -PN -p "T:0-65535,U:0-65535"

Ein solcher Scan benötigt allerdings auch entsprechend mehr Zeit und wird als aufdringlich betrachtet.

Sie sollten dies nicht ohne Genehmigung anwenden.

Alternative lsip-Funktionen

In den Kommentaren, wurden noch Alternativen für die Funktion lsip aufgezeigt.

Von mir adaptiert (Für Leute die NetworkManager nicht einsetzen):

$ ip -f inet -br a | awk '$1!="lo" && $2!="DOWN" {print $NF}'

Beide obigen Methoden haben Nachteile: Das ip(8) z.B. bei Point-to-Point-Verbindungen und dem Filtern des Output mit awk/sed/usw. und das nmcli(1) bei nicht mit dem NetworkManager verwalteten Interfaces. Wer das als Gefrickel ansieht, kann sich auch ein Perl-Skript schreiben, das sauber alle Netzwerke auflistet. Die dafür nötigen Module sind über die Paketverwaltung in den Paketen libio-interface-perl und libnet-netmask-perl vorhanden:

#!/usr/bin/env perl

use IO::Interface::Simple;
use Net::Netmask;

for ( IO::Interface::Simple->interfaces ) {

    next if ( !$_->is_running );
    next if ( $_->is_loopback );

    $block = Net::Netmask->new( $_->address, $_->netmask );

    print "$block\n";
}

Um die IP-Adresse statt des Netzes auszugeben, schreib man folgendes Kommando: printf "%s/%s", $_->address, $block->bits;.

Labskaus

Sunday, October 15, 2017

Labskaus ist mein Leibgericht. Dass weiss ich, aber der Labskaus nicht.

Perl: Zufälligen Schlüssel/Key eines Hash

Friday, August 4, 2017

Auf einen zufälligen Schlüssel eines Hash, kann man mit der Funktion keys zugreifen. Die Funktion keys, gibt alle Schlüssel eines Hash, als Liste zurück, von der dann ein Wert zufällig abgefragt werden kann:

#!/usr/bin/perl

my %alphabet = (
    A => 1,
    B => 2,
    C => 3,
    D => 4,
    E => 5,
    F => 6,
    G => 7,
    H => 8,
    I => 9,
    J => 10,
    K => 11,
    L => 12,
    M => 13,
    N => 14,
    O => 15,
    P => 16,
    Q => 17,
    R => 18,
    S => 19,
    T => 20,
    U => 21,
    V => 22,
    W => 23,
    X => 24,
    Y => 25,
    Z => 26,
);

my @keys = keys %alphabet;

# zufälliger Key

my $buchstabe = $keys[ rand @keys ];
my $position  = $alphabet{$buchstabe};

printf "Der Buchstabe %s, ist der %i. im Alphabet.\n", $buchstabe, $position;

Es ist auch möglich, direkt auf einen zufälligen Wert eines Hash zuzugreifen. Das funktioniert, analog mit der Funktion values:

my @values = values %alphabet;
print $values[ rand @values ] . "\n";

PS: In den Kommentaren, hat Christian eine etwas schnellere Möglichkeit aufgezeigt:

my @list = %alphabet;
my $random_key = $list[(1|rand@list) -1];
my $random_val = $list[1|rand@list];

Das bitweise ODER mit 1 sorgt dafür, dass das letzte Bit des Ergebnisses von rand auf 1 gesetzt wird. Dadurch entsteht immer eine ungerade Zahl (1|0 => 1, 1|1 => 1, 1|2 => 3, 1|3 => 3, …). Es wird also nur auf ungerade Indizes des Arrays zugegriffen, wo in diesem Fall die Values abgelegt sind. Da dabei immer eine Zahl größer 0 generiert wird, kann mit einem einfachen -1 immer auf die geraden Indizes mit den Keys zugegriffen werden.

Debian 9 (Stretch): Predictable Network Interface Names – Umstellung auf das neue Verfahren zur Namensvergabe von Netzwerkschnittstellen

Sunday, July 23, 2017

Spätestens ab Debian 10 (Buster) wird das alte Verfahren zur Namensvergabe von Netzwerkschnittstellen nicht mehr unterstützt, und das System muss auf das neue Verfahren umgestellt sein (Predictable Network Interface Names).

Bei einer Neuinstallation von Debian 9 (Stretch) passiert diese Umstellung automatisch. Bei einem Upgrade von Debian 8 (Jessie) muss hingegen manuell umgestellt werden.

Auf das neue Verfahren zur Namensvergabe von Netzwerkschnittstellen umstellen

Um auf das Verfahren Predictable Network Interface Names umzustellen, muss die Datei /etc/udev/rules.d/70-persistent-net.rules gelöscht werden:

mv /etc/udev/rules.d/70-persistent-net.rules{,.old}

Danach muss das System neu gestartet werden.

Dieser Schritt stellt eine entsprechend weitreichende Änderung am System da. Eventuelle Konfigurationsdateien müssen angepasst und getestet werden. Wer statt des Network-Manager die Datei interfaces(5) nutzt, muss zumindest diese anpassen.

Siehe auch: https://www.debian.org/releases/stable/amd64/release-notes/ch-whats-new.de.html#new-interface-names, https://github.com/systemd/systemd/blob/master/src/udev/udev-builtin-net_id.c#L20 (Beschreibt nach welchen Regeln, die neuen voraussagbaren/vorhersagbaren Namen aufgebaut sind), https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/, file:///usr/share/doc/udev/README.Debian.gz

Benutzerdefinierte Namen für Netzwerkschnittstellen

In manchen Fällen ist es praktisch, eigene Namen für Netzwerkschnittstellen zu definieren.

Dies kann mittels zwei verschiedener Methoden erreicht werden. Einmal mittels Network Device Configuration: systemd.link(5) und einmal mittels Dynamic Device Management: udev(7), welche wesentlich mehr Möglichkeiten bietet.

In folgenden Beispielen, wird der Netzwerkschnittstelle mit der MAC-Adresse 00:a0:de:63:7a:e6, der feste Namen dmz zugewiesen:

  • Dynamic Device Management – udev(7):
    Beispielsweise kann /etc/udev/rules.d/76-netnames.rules erstellt und dort Netzwerkgeräte anhand beliebiger Attribute und Eigenschaften identifiziert und benannt werden.
    Hier ein Beispiel, um ein Gerät über die MAC-Adresse zu identifizieren und zu benennen:

    cat /etc/udev/rules.d/76-netnames.rules
    # identify device by MAC address
    SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:a0:de:63:7a:e6", NAME="dmz"
    

    Gegenüber systemd.link(5), bietet diese Methode auch die Möglichkeit Geräte anhand anderer Übereinstimmungsschlüssel, wie der Vendor/Model-ID oder des Gerätepfads zu Identifizieren. Siehe dazu auch die Handbuchseite udev(7), für die Dokumentation, wie man udev-Regeln schreibt.

  • Network Device Configuration – systemd.link(5):
    Alternativ geht auch eine Konfiguration ohne udev(7), mittels systemd.link(5) und des Name-Schlüssels:

    cat /etc/systemd/network/10-dmz.link
    [Match]
    MACAddress=00:a0:de:63:7a:e6
    [Link]
    Name=dmz
    

Damit diese Änderungen übernommen werden, ist ggf. eine Aktualisierung der initrd-Datei mittels update-initramfs -u und ein Neustart des Systems erforderlich.