Linux Quest. Wir gratulieren den Gewinnern und berichten über die Lösungen der Aufgaben.

Linux Quest. Wir gratulieren den Gewinnern und berichten über die Lösungen der Aufgaben.

Am 25. März haben wir die Anmeldung für Linux Questeröffnet, ein Spiel für Liebhaber und Kenner des Linux-Betriebssystems. Einige Statistiken: 1117 Personen haben sich für das Spiel registriert, davon haben 317 mindestens einen Schlüssel gefunden, 241 haben die Aufgabe der ersten Runde erfolgreich gemeistert, 123 die der zweiten und 70 haben die dritte Runde bestanden. Heute ist unser Spiel zu Ende gegangen, und wir gratulieren unseren Gewinnern!

  • Den ersten Platz belegte Alexander Teldykov.
    Alexander beschreibt sich selbst als einen typischen Sysadmin. Er lebt in Wolgograd und administriert verschiedene Unix-ähnliche Systeme seit etwa zwanzig Jahren. Er hat in Internetdienstleistern, Banken und Systemintegratoren gearbeitet. Derzeit arbeitet er remote in einer kleinen Firma und betreut die Cloud-Infrastruktur für einen großen ausländischen Kunden. Er liest gerne und hört Musik. Über das Spiel sagte Alexander, dass es ihm insgesamt gefallen hat und er solche Aufgaben mag. In einer der Firmen hatte er in einem Vorstellungsgespräch ähnliche Aufgaben wie bei Hackerrank, das war interessant.
  • Den zweiten Platz belegte Roman Suslov.
    Roman aus Moskau. Er ist 37 Jahre alt und arbeitet als Linux/Unix-Administrator bei der Firma »Infosysteme Jet«. In seinem Job beschäftigt er sich mit der Administration und Fehlersuche von Linux/Unix-Systemen sowie SAN. Seine Interessen sind vielfältig: Linux-Systeme, Programmierung, Reverse Engineering, Informationssicherheit und Arduino. Zum Spiel sagte Roman, dass es ihm insgesamt gefallen hat. „Ich habe meine grauen Zellen ein wenig angeregt und mich von den grauen Alltagsroutinen abgelenkt. 🙂 Ich hätte mir mehr Aufgaben gewünscht, da ich gerade erst richtig in den Fluss gekommen war, als das Spiel schon vorbei war.“
  • Drittens — alex3d.
    Alex lebt in Moskau und arbeitet in der Softwareentwicklung. „Danke für den Wettbewerb, es war interessant, meine Google-Fu-Fähigkeiten zu testen.“

Auch in der Rangliste der 10 besten Spieler:

  • Yevgeniy Saldayev
  • Markel Mokhnachevsky
  • Konstantin Konosov
  • Pavel Sergeev
  • Vladimir Bovaev
  • Ivan Bubnov
  • Pavlo Klets

Wir verstehen, dass es viele Lösungen für unsere Aufgaben gibt; im Folgenden sind einige mögliche Lösungsansätze beschrieben.

1. Erster Schritt

Wir haben ihn „Bist du wirklich ein Administrator?“ genannt, da die Aufgabe ziemlich einfach war – einen warmen, nostalgischen Service wiederherzustellen.

1.1. Interessante Fakten:

Zwei Spieler fanden den ersten Schlüssel innerhalb der ersten 15 Minuten des Spiels, und nach einer Stunde hatten wir drei Anführer, die die Aufgabe erfolgreich bewältigten.

1.2. Aufgabe

Sie haben bei einem Unternehmen angefangen, in dem lange Zeit kein kompetenter IT-Spezialist tätig war. Bevor Sie mit der Ordnung beginnen, müssen Sie ein drängendes Problem lösen, das die Büroarbeit blockiert.

Die Reinigungskraft hat mit einem Wischmopp das Netzkabel des Serverraums erwischt. Die Stromversorgung wurde wiederhergestellt, aber eine sehr wichtige Webseite funktioniert dennoch nicht. Die Webseite ist wichtig, da das Unternehmen nicht besonders besorgt über die Informationssicherheit ist, und auf der Hauptseite kann man das Passwort des Geschäftsführers für seinen Computer offen finden.

Neulich wurde das Passwort geändert, aber das neue wurde vergessen, und der Geschäftsführer kann nicht arbeiten. Es gibt Gerüchte, dass auf diesem Rechner noch Schlüssel vorhanden waren, die uns bei der Entschlüsselung der Sicherungskopien der Buchhaltungsdokumente helfen könnten.

Alle warten auf eine zügige Lösung des Problems!

1.3. Lösung

Zunächst muss das Root-Passwort auf der virtuellen Maschine geändert werden, um Zugang zu erhalten. Beim Starten stellen wir fest, dass es sich um Ubuntu 16.04 Server handelt.

Um das Root-Passwort zurückzusetzen, starten wir die Maschine neu. Beim Booten, im Moment der Anzeige des Grub-Menüs, wählen wir mit der Taste „e“ den Bearbeitungsmodus für den Ubuntu-Eintrag. Editieren Sie die Zeile linux, und fügen Sie am Ende hinzu: init=/bin/bash. Booten Sie mit Ctrl+x und erhalten Sie die Bash. Remounten Sie das Root-Dateisystem mit rw und ändern Sie das Passwort:

$ mount -o remount,rw /dev/mapper/ubuntu--vg-root
$ passwd

Vergessen Sie nicht, sync auszuführen und neu zu starten.

2. Im Szenario steht, dass unser Webserver nicht funktioniert. Schauen wir nach:

$ curl localhost
Not Found
Die angeforderte URL / wurde auf diesem Server nicht gefunden.
Apache/2.4.18 

Das bedeutet, dass Apache tatsächlich läuft, aber mit dem Code 404 antwortet. Schauen wir uns die Konfiguration an:

$ vim /etc/apache2/sites-enabled/000-default.conf

Hier finden wir den Schlüssel – StevenPaulSteveJobs.

Prüfen wir den Pfad /usr/share/WordPress — dieser existiert nicht, aber es gibt /usr/share/wordpress. Korrigieren Sie die Konfiguration und starten Sie Apache neu.

$ systemctl restart apache2

3. Versuchen wir es erneut, und erhalten die Fehlermeldung:

Warning: mysqli_real_connect(): (HY000/2002): Verbindung abgelehnt in /usr/share/wordpress/wp-includes/wp-db.php in Zeile 1488

Ist die Datenbank nicht gestartet?

$ systemctl status mysql
Active: aktiv (läuft)

Was ist das Problem? Wir müssen das herausfinden. Dazu benötigen wir Zugang zu MySQL, wie es in Dokumentation.beschrieben wird. Ein Punkt in der Dokumentation empfiehlt uns, die Option skip-grant-tables in /etc/mysql/mysql.conf.d/mysqld.cnffestzulegen. Hier finden wir ebenfalls einen Schlüssel – AugustaAdaKingByron.

Ändern Sie die Berechtigungen für den Benutzer 'wp'@'localhost'. Wir starten MySQL und machen es über das Netzwerk verfügbar, indem wir die Option im Konfigurationsfile kommentieren skip-networking.

4. Nach diesen Schritten wird der Web-Server gestartet, der Website funktioniert jedoch nicht, da

Warning: require_once(/usr/share/wordpress/wp-content/themes/twentysixteen/footer.php): fehlgeschlagen zu öffnen: Berechtigung verweigert in /usr/share/wordpress/wp-includes/template.php in Zeile 562

Wir korrigieren die Datei-Berechtigungen.

$ chmod 644 /usr/share/wordpress/wp-content/themes/twentysixteen/footer.php

Wir aktualisieren die Seite, gehen zur Website und finden den Schlüssel — BjarneStroustrup! Wir haben alle drei Schlüssel gefunden, unser Direktor kann arbeiten, wir haben die Buchhaltungsdateien entschlüsselt. Alle sind glücklich, und du hast viel Arbeit vor dir, um die Infrastruktur, Backups und Sicherheit im Unternehmen zu etablieren.

2. Zweiter Schritt

Es musste ein Problem zur Datenerfassung gelöst werden. Analytics liebt jeder — wer, woher und in welchen Mengen kommt. Wir haben einen Fall erfunden, mit dem alle Ingenieure im Laufe ihrer Karriere auf die ein oder andere Weise konfrontiert werden könnten.

2.1. Interessante Fakten

Einer unserer Spieler hat in den ersten 10 Minuten des Spiels den richtigen Schlüssel eingegeben, und innerhalb der ersten Stunde hatten wir einen Anführer, der die Aufgabe gemeistert hat.

2.2. Aufgabe

Du bist neu im Unternehmen, und die Manager haben dich gebeten herauszufinden, an wen die E-Mails aus Afrika gesendet wurden. Du musst die Top-21 der Empfängeradressen erstellen. Die ersten Buchstaben der Empfängeradressen sind der Schlüssel. Eine Sache gibt es jedoch: Der Mailserver, über den die E-Mails gesendet wurden, lädt nicht. Alle warten auf eine schnelle Lösung des Problems!

2.3. Lösung

1. Der Server lädt nicht, weil es keinen vorhandenen Swap-Bereich in fstab gibt. Beim Booten versucht das System, diesen zu mounten, und stürzt ab. Wie kann ich booten?

Lade das Image herunter; wir haben CentOS 7 heruntergeladen. Booten wir von Live CD/DVD (Troubleshooting -> Rescue), montieren das System, und bearbeiten es /etc/fstab. Hier finden wir den ersten Schlüssel — GottfriedWilhelm11646Leibniz!

Erstelle Swap:

$ lvcreate -n swap centos -L 256M
$ sync && reboot

2. Wie immer gibt es kein Passwort, daher müssen wir das Root-Passwort auf der virtuellen Maschine ändern. Das haben wir schon im ersten Auftrag gemacht. Wir ändern es und kommen erfolgreich auf den Server, aber er geht sofort wieder in den Neustart. Der Server startet so schnell neu, dass man nicht einmal die Protokolle sorgfältig ansehen kann. Wie kann ich verstehen, was passiert?

Wir starten erneut mit livecd, untersuchen sorgfältig die Systemprotokolle und schauen vorsichtshalber auch in den Cron, da es diese Periodizität gibt. Dort finden wir das Problem und den zweiten Schlüssel — Alan1912MathisonTuring!

Es ist notwendig, /etc/crontab die Zeile echo b > /proc/sysrq-trigger.

3. Danach startete der Server, und wir können die Manageranfragen ausführen: „Welche Adressen hat Afrika?“ Diese Informationen sind im Allgemeinen öffentlich zugänglich. Man kann sie im Internet unter den Begriffen „IP-Adresse Afrika“, „GeoIP-Datenbank“ finden. Zur Lösung der Aufgabe können frei verfügbare Datenbanken zur Adressverteilung (GeoIP) verwendet werden. Als Referenz haben wir die DB MaxMind GeoLite2, die unter der Lizenz Creative Commons Attribution-ShareAlike 4.0 verfügbar ist.

Wir versuchen, unser Problem nur mit Linux-Systemwerkzeugen zu lösen, aber eigentlich kann man es auf viele Arten angehen: durch Textfilterwerkzeuge und durch Skripte in verschiedenen Programmiersprachen.

Zunächst erhalten wir einfach Paare „IP-Absender — Empfänger“ aus dem Mail-Log /var/log/maillog (wir erstellen eine Tabelle der E-Mail-Empfänger — IP-Absender). Dies kann mit dem folgenden Befehl erfolgen:

$ cat /var/log/maillog | fgrep -e ' connect from' -e 'status=sent' | sed 's/[][]/ /g' | awk '/connect from/ {ip=$11} /status=sent/ {print $10" "ip}' > log1.txt

Bevor wir mit dem Erstellen der Adressdatenbank für Afrika fortfahren, werfen wir einen Blick auf die führenden IP-Adressen der Absender.

$ cat log1.txt | cut -d' ' -f1 | sort | uniq -c | sort -r | head -n 40
5206 L2JhbjAbM67GA99jg@mail.ru
4165 iHKTBkegOQa6fIALq@mail.ru
3739 nHkcBl7BdgXxijSYD7@mail.ru
3405 SMAzPJAzbl9vp4hAXo@mail.ru
3346 xILz6d7P@mail.ru

Unter allen Absendern stechen die drei Top-Empfänger-IDs durch die Anzahl der gesendeten E-Mails besonders hervor. Wenn wir die IP-Adressen der Absender, die an die Adressen dieser Top 3 gesendet haben, durchsuchen, ist ein deutliches Übergewicht bestimmter Netzwerke festzustellen:

$ cat log1.txt | fgrep 'L2JhbjAbM67GA99jg@mail.ru' | cut -d' ' -f2 | sort | cut -d'.' -f1 | uniq -c | sort -r | head
831 105
806 41
782 197
664 196
542 154
503 102
266 156
165 45
150 160
108 165

Der Großteil der Netzwerke 105/8, 41/8, 196/8, 197/8 wird von AFRINIC verwaltet — einem der fünf regionalen Internetregistrare, die für die Verteilung von Internetressourcen zuständig sind. AFRINIC verteilt Adressräume innerhalb Afrikas. Zudem gehört 41/8 komplett zu AFRINIC.

https://www.nic.ru/whois/?searchWord=105.0.0.0 
https://www.nic.ru/whois/?searchWord=41.0.0.0

Somit liegt die Antwort auf die Aufgabe direkt im Log.

$ cat log1.txt | fgrep -e '105.' -e '41.' -e '196.' -e '197.' -e '154.' -e '102.' | awk '{print $1}' | sort | uniq -c | sort -r | head -n 21
4209 L2JhbjAbM67GA99jg@mail.ru
3313 iHKTBkegOQa6fIALq@mail.ru
2704 nHkcBl7BdgXxijSYD7@mail.ru
2215 uvRbp1O@mail.ru
1774 sPmMsmmFiV@mail.ru
1448 BtG3aHgQgCKuze2AKuRH@mail.ru
1233 eQpuuQ2uQdbwRL3@mail.ru
958 nJT5dpaBZ@mail.ru
862 ef4WbQiB@mail.ru
762 dQCqKL6eVminFfH7wLA@mail.ru
632 ifq6Rd1HxuCQOdO9@mail.ru
539 cFwm2ssypMmx1sA7@mail.ru
531 twtTnr4G@mail.ru
431 TSrczgYASrR11Hs3qCi@mail.ru
380 o3r3exc3OL@mail.ru
357 rzmjr2VAHK@mail.ru
348 vnPr6YjJ3ndw@mail.ru
312 anOjFXrwOtLP2Rl1Vcz6@mail.ru
289 dvny5zHmRW8fiT@mail.ru
282 sgg9jPxFDYvzw8Kr@mail.ru
274 tKSevzA7GntJ@mail.ru

In diesem Schritt erhalten wir die Zeichenfolge „LinuxBenedictTorvadst“.

Der korrekte Schlüssel lautet: „LinusBenedictTorvalds“.

Die erhaltene Zeichenfolge weist in den letzten 3 Zeichen einen Schreibfehler im Vergleich zum korrekten Schlüssel auf. Dies liegt daran, dass die von uns ausgewählten Netzwerke nicht vollständig den afrikanischen Ländern zugewiesen sind und daran, wie die E-Mails in unseren Protokollen den IP-Adressen zugeordnet sind.

Durch eine genauere Analyse der größten, den afrikanischen Ländern zugewiesenen Netzwerke kann eine präzise Antwort erhalten werden.

$ cat log1.txt | fgrep -e' '105.{30..255}. -e' '41. -e' '196.{64..47}. -e' '196.{248..132}. -e' '197.{160..31}. -e' '154.{127..255}. -e' '102.{70..255}. -e' '156.{155..255}. | awk '{print $1}' | sort | uniq -c | sort -r | head -n 21
3350 L2JhbjAbM67GA99jg@mail.ru
2662 iHKTBkegOQa6fIALq@mail.ru
2105 nHkcBl7BdgXxijSYD7@mail.ru
1724 uvRbp1O@mail.ru
1376 sPmMsmmFiV@mail.ru
1092 BtG3aHgQgCKuze2AKuRH@mail.ru
849 eQpuuQ2uQdbwRL3@mail.ru
712 nJT5dpaBZ@mail.ru
584 ef4WbQiB@mail.ru
463 dQCqKL6eVminFfH7wLA@mail.ru
365 ifq6Rd1HxuCQOdO9@mail.ru
269 cFwm2ssypMmx1sA7@mail.ru
225 twtTnr4G@mail.ru
168 TSrczgYASrR11Hs3qCi@mail.ru
142 o3r3exc3OL@mail.ru
111 rzmjr2VAHK@mail.ru
 96 vnPr6YjJ3ndw@mail.ru
 78 anOjFXrwOtLP2Rl1Vcz6@mail.ru
 56 lHzWiB7ExvRtSbAcU9@mail.ru
 56 dvny5zHmRW8fiT@mail.ru
 40 sgg9jPxFDYvzw8Kr@mail.ru

Die Aufgabe kann auch auf eine andere Weise gelöst werden.
Laden Sie MaxMind herunter, entpacken Sie es, und die folgenden drei Befehle lösen ebenfalls unser Problem.

$ cat GeoLite2-Country-Locations-de.csv | grep "Afrika" | cut -d',' -f1 > africaIds.txt
$ grep -Ff africaIds.txt GeoLite2-Country-Blocks-IPv4.csv | cut -d',' -f1 > africaNetworks.txt
$ grepcidr -f africaNetworks.txt log1.txt | cut -d' ' -f1 | sort | uniq -c | sort -r | head -n21

Auf die eine oder andere Weise haben wir letztlich die Statistiken erfasst, und die Manager haben die benötigten Daten für ihre Arbeit erhalten!

3. Dritte Stufe

Die dritte Stufe ähnelt der ersten — auch hier muss der warme, nostalgische Service repariert werden, aber es ist alles komplizierter als in der ersten Aufgabe.

3.1. Interessante Fakten

In den ersten 15 Minuten fanden drei Spieler den ersten Schlüssel. 2 Stunden und 20 Minuten nach Beginn der Etappe konnte unser Sieger die Aufgabe erfolgreich meistern.

3.2. Aufgabe

Du hast deine Arbeit in einem Unternehmen begonnen, wo alle Unternehmensdokumente auf einem internen Wiki-Server gespeichert sind. Im vergangenen Jahr bestellte ein Ingenieur drei neue Festplatten für den Server zusätzlich zu einer vorhandenen, da er argumentierte, dass für die Ausfallsicherheit des Systems Festplatten in bestimmte Arrays eingebaut werden müssen. Leider reiste der Ingenieur nach ein paar Wochen nach der Installation in Indien und kehrte nicht zurück.

Der Server lief mehrere Jahre ohne Probleme, doch vor ein paar Tagen wurde das Netzwerk des Unternehmens gehackt. Laut den Anweisungen der Sicherheitsmitarbeiter wurden die Festplatten aus dem Server entfernt und dir zugeschickt. Während des Transports ging jedoch eine Festplatte unwiderruflich verloren.

Wir müssen die Funktionalität des Wikis wiederherstellen, vor allem interessiert uns der Inhalt der Wiki-Seiten. Ein bestimmter Textabschnitt, der auf einer der Seiten dieses Wikis war, ist das Passwort für den 1C-Server und wird dringend zur Entsperrung benötigt.

Außerdem gab es irgendwo auf den Wiki-Seiten oder an anderer Stelle Passwörter für den Logserver und den Überwachungsserver, die ebenfalls wiederhergestellt werden sollten, da ohne sie die Untersuchung des Vorfalls nicht möglich ist. Wie gewohnt wird eine schnelle Lösung des Problems erwartet!

3.3. Lösung

1. Wir versuchen, nacheinander von den Festplatten zu booten, die wir haben, und überall erhalten wir die gleiche Nachricht:

Kein bootfähiges Medium gefunden! System angehalten 

Wir müssen von etwas booten. Wieder hilft das Booten von einer Live-CD/DVD (Fehlerbehebung -> Rettung). Bei der Bootsequenz versuchen wir, die Bootpartition zu finden, finden sie jedoch nicht und gelangen in die Shell. Wir versuchen, herauszufinden, was und wie mit den Festplatten ist. Es ist bekannt, dass es drei gibt. Werkzeuge dafür sind in der 7. Version von CentOS zahlreicher, wo es Kommandos gibt blkid oder lsblk, die uns alle Informationen über die Festplatten anzeigen.

Was wir tun:

$ ls /dev/sd*

Sofort sieht man, dass

/dev/sdb1 - ext4
/dev/sdb2 - часть lvm
/dev/sda1 и /dev/sdc1 - части рейда
/dev/sda2 и /dev/sdc2 - про них ничего не известно на текущий момент

wir sdb1 einhängen, und es ist klar, dass dies die Bootpartition von CentOS 6 ist.

$ mkdir /mnt/sdb1 && mount /dev/sdb1 /mnt/sdb1

Offensichtlich gehen wir zum grub-Verzeichnis und finden dort den ersten Schlüssel – James191955Gosling in einer ungewöhnlichen Datei.

2. Wir untersuchen PVS und LVS, da wir mit LVM arbeiten. Wir sehen, dass es 2 physische Volumes geben sollte, eines fehlt und zeigt einen Fehler wegen einer verlorenen UID an. Außerdem sollte es 2 logische Volumes geben: root und swap, wobei root teilweise verloren ist (Attribut P im Volume). Es lässt sich nicht einbinden, was schade ist! Wir brauchen es dringend.

Es gibt noch 2 Festplatten, wir schauen sie uns an, sammeln sie und binden sie ein:

$ mdadm --examine --verbose --scan
$ mdadm --assemble --verbose --scan
$ mkdir /mnt/md127 && mount /dev/md127 /mnt/md127 

Wir schauen nach, und sehen, dass dies die Boot-Partition von CentOS 6 ist und ein Duplikat von dem, was bereits vorhanden ist auf /dev/sdb1, und hier ist wieder der gleiche Schlüssel — DennisBMacAlistairCRitchie!
Wir sehen, wie es zusammengestellt wurde /dev/md127.

$ mdadm --detail /dev/md127

Wir sehen, dass es aus 4 Festplatten bestehen sollte, aber nur aus zwei zusammengestellt wurde /dev/sda1 und /dev/sdc1, sie sollten die Nummern 2 und 4 im System sein. Wir vermuten, dass aus /dev/sda2 und /dev/sdc2 auch ein Array zusammengestellt werden kann. Unklar ist, warum kein Metadaten vorhanden sind, aber das ist die Verantwortung des Administrators, der irgendwo in Goa ist. Wir vermuten, dass hier RAID10 sein sollte, obwohl es auch andere Möglichkeiten gibt. Wir bauen es auf:

$ mdadm --create --verbose /dev/md0 --assume-clean --level=10 --raid-devices=4 missing /dev/sda2 missing /dev/sdc2

Wir schauen blkid, pvs, lvs an. Wir stellen fest, dass wir das fehlende physische Volume erstellt haben.

Sofort wurde lvroot repariert, wir binden es ein, aktivieren aber vorher VG:

$ vgchange -a y
$ mkdir /mnt/lvroot && mount /dev/mapper/vg_c6m1-lv_root /mnt/lvroot 

Und dort gibt es alles, einschließlich des Schlüssels im Home-Verzeichnis von root — /root/sweet.

3. Wir versuchen dennoch, unseren Server wieder zum Laufen zu bringen, damit er ordnungsgemäß startet. Alle logischen Volumes von unserem /dev/md0 (wo wir alles gefunden haben) ziehen wir nach /dev/sdb2, wo der gesamte Server ursprünglich betrieben wurde.

$ pvmove /dev/md0 /dev/sdb2
$ vgreduce vg_c6m1 /dev/md0

Wir schalten den Server aus, entfernen die 1. und 3. Festplatte und lassen die zweite drin. Wir booten von Live-CD/DVD in den Rescue-Modus. Wir finden die Boot-Partition und stellen den Bootloader in grub wieder her:

root (hd0,0)
setup (hd0)

Wir entfernen die Boot-Diskette und starten erfolgreich, aber die Website funktioniert nicht.

4. Es gibt zwei Optionen, die Website zu starten: entweder Apache von Grund auf neu konfigurieren oder bereits konfiguriertes nginx mit php-fpm verwenden:

$ /etc/init.d/nginx start
$ /etc/init.d/php-fpm start

Schließlich müssen wir MySQL starten:

$ /etc/init.d/mysqld start

Es startet nicht, und die Lösung liegt in /var/log/mysql. Sobald Sie das Problem mit MySQL gelöst haben, wird die Website funktionieren, auf der Hauptseite wird der Schlüssel — RichardGCCMatthewGNUStallman! Jetzt haben wir Zugriff auf 1C, und die Mitarbeiter können ihr Gehalt erhalten. Und du hast wie immer viel Arbeit vor dir, um die Infrastruktur und die Sicherheit im Unternehmen zu verbessern.

Gerne teilen wir erneut die Liste der Bücher, die uns und unseren Teilnehmern bei der Vorbereitung auf das Spiel geholfen haben: linux.mail.ru/books.

Vielen Dank, dass Sie bei uns waren! Bleiben Sie auf dem Laufenden über die Ankündigungen der nächsten Spiele!

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster