Multi-line-timeout: making sure your last multi-line message is not lost

When your application has a problem that it cannot handle, then Java, PHP and other environments often write multi-line error messages. These long messages include many information useful for developers but it might be difficult to handle for logging systems. A multi-line log message is usually saved when the beginning of the next message is detected, which made handling the last message problematic.

This is where multi-line-timeout can help. After a pre-configured timeout, the last message is saved by syslog-ng. Losing a message when there are thousands of them is probably not a big deal. But if you are lucky, the error messages are rare. Maybe just a single message in a file. In either case, you can lose most or all of the messages. If you do not want to lose these messages, configure multi-line-timeout.

Note: this problem does not affect some less common multi-line modes, like multi-line-garbage or multi-line-suffix.

In this blog, you will find a simple configuration and a test to see how multi-line-timeout works. You can use it as a basis for your own use case.

Preparations for testing multi-line-timeout

It is hard to predict when your Java application writes a stack trace, so instead of that I prepared you an easy way to test multi-line-timeout using synthetic log messages. All you need for testing:

  • syslog-ng 3.26 (or later) installed

  • two open terminal windows

  • a browser window, from where you can copy & paste commands

If your operating system does not have syslog-ng 3.26 (or later) available, check our third party repositories page. On most Linux distributions, you can create configuration snippets under /etc/syslog-ng/conf.d with a .conf extension. Otherwise append the following to syslog-ng.conf:

source s_multi {
    file("/var/log/events"
        multi-line-mode("prefix-garbage")
        multi-line-prefix('^EVENT: ')
        multi-line-timeout(10)
        flags("no-parse")
    );
};

destination d_multi {
    file("/var/log/multi");
};

log {source(s_multi); destination(d_multi); };

The above configuration expects multi-line messages to arrive into a file called /var/log/events and writes the results to /var/log/multi. These files do not exist by default, so you should create them:

touch /var/log/multi /var/log/events

This way you can follow log output right from the beginning. Once you restarted / reloaded syslog-ng and the configuration took effect, you are ready for testing.

Testing

For testing you will need two terminal windows and a browser window. From the browser, you will need to copy & paste commands into one of the terminal windows. You will use the second terminal window to follow the content of /var/log/multi, the file where syslog-ng saves multi-line logs when using the above configuration. In the first terminal, enter the following command, which you can then follow in the second terminal window:

tail -f /var/log/multi

Use the commands below in the first terminal one after the other as follows. First, copy and paste the first three lines from the commands below to the first terminal and hit enter. You will see, that the first two lines are displayed immediately. This is because there syslog-ng knows for sure that the log messages arrived successfully as the beginning pattern of the third message is also already there. The third message only arrives after the 10 seconds time-out, as there is no next message there (yet), which could indicate that the previous message is over.

Finally, copy & paste the last command to the first terminal and hit enter. After ten seconds, you should see the log message on the second terminal.

echo EVENT: bla1 >> /var/log/events ; echo bla 1 >> /var/log/events ; echo blabla 1 >> /var/log/events
echo EVENT: bla2 >> /var/log/events ; echo bla 2 >> /var/log/events ; echo blabla 2 >> /var/log/events
echo EVENT: bla3 >> /var/log/events ; echo bla 3 >> /var/log/events ; echo blabla 3 >> /var/log/events
echo EVENT: bla4 >> /var/log/events ; echo bla 4 >> /var/log/events ; echo blabla 4 >> /var/log/events

What is next?

As you could see from the above using multi-line-timeout resolves problems around reading multi-line log messages from files. Now it is time to custom tailor the above configuration example to your environment.

If you have questions or comments related to syslog-ng, do not hesitate to contact us. You can reach us by email or even chat with us. For a list of possibilities, check our GitHub page under the “Community” section at https://github.com/syslog-ng/syslog-ng. On Twitter, I am available as @PCzanik.

Una IA que lee música y la toca al piano. Machine Learning usando SUSE Linux

Un proyecto en el que una inteligencia artificial es capaz de leer una partitura y “tocarla” al piano todo eso usando SUSE Linux Enterprise Server y openSUSE

La empresa SUSE una vez al año, permite a sus ingenieros, que dejen de lado sus obligaciones durante una semana y se dediquen a desarrollar y llevar a cabo un proyecto que tengan en mente.

Es lo que se conoce como Hack Week y en donde en las ediciones que han celebrado, en ocasiones se han desarrollado proyectos que más adelante han tenido entidad propia.

En otros casos los proyectos son retos personales de los ingenieros de SUSE, que quieren explorar otras áreas o unir varias de sus aficiones. Como el caso que veremos a continuación.

Este proyecto del HackWeek de SUSE está desarrollado por Lin Ma un ingeniero que trabaja en Virtualización dentro de SUSE y que en su proyecto ha aunado el espíritu hacker, maker y la música.

Esta es una traducción/adaptación del artículo original escrito en inglés por Chabowski y publicado en el sitio web de SUSE.

Introducción

Lin Ma ha decidido aunar en su proyecto para HackWeek, a la música y”machine learning” basado en SUSE Linux Enterprise Server. Una especie de Internet de las cosas (IoT) basado en productos de SUSE y openSUSE.

El proceso de cómo leer notas en una partitura y cómo tocarlas en un instrumento, puede ser muy complicado y tedioso.

El objetivo de este proyecto, es que “la máquina” pueda “leer” una partitura a partir de una imagen y después automáticamente traducirla y poder tocarla en un instrumento musical físico, en este caso un órgano eléctrico.

Componentes del proyecto

Para llevar a cabo el proyecto se necesitarán los siguientes elementos:

Cada solenoide puede ser activado por un pin GPIO de la  Raspberry Pi 3. Sin embargo cada modelo de la solenoide necesita unos 500 miliamperios para poder funcionar. Esto está fuera de las posibilidades de la Raspberry Pi 3, por eso se utilizan los chips ULN 2803 para activar los solenoides.

Pasos a seguir

Estos son los pasos a seguir:

Paso 1: Utilizar la red neuronal para la extracción de características de símbolos musicales de las imágenes de partituras que sirven como entrada.

Paso 2: Utilizar Optical Music Recognition (OMR) para reconocer las notaciones musicales obtenidas de la red neuronal y guardar los resultados en un archivo XML.

Paso 3: Recibir el archivo XML, mediante una red TCP y analizarlo. Y después activar los solenoides adecuados para tocar la partitura al piano.

Limitaciones del proyecto

Es un proyecto de una semana, por lo que no pueden abarcarse y poder tocar todas las notas del piano. Debido a limitaciones de los elementos físicos, el piano solo podrá tocar 3 octavas, y no podrá tocar semitonos (las teclas negras de los pianos)

Tampoco se ha investigado en cómo reducir el ruido que producen los propios solenoides cuando son activados, a la hora de tocar las notas.

Se ha escogido un servidor TaiShan para correr la red neuronal, por ser más rápido en el proceso. Para una misma imagen de partitura, el analizarla en el servidor TaiShan duraba 30 segundos, mientras que hacerlo en una Raspberry Pi 3 duraba 8 minutos.

Resultados

Después de todo, el piano inteligente era capaz de tocar algunas melodías como estas, después de analizar sus respectivas partituras (vídeos con enlaces a YouTube)

Nuevo aspecto para el agregador de blogs de la comunidad de #openSUSE

Nuevo aspecto para planet.opensuse.org el agregador de blogs de la comunidad openSUSE

Hace unos años, eran común encontrarse diversos “planetas” relacionados con diferentes temáticas. Esos “planetas” no eran más que sitios que recopilaban artículos de blogs relacionados con la temática del sitio.

Todavía existen, pero creo que se usan menos. Sin embargo, en diversos proyectos de software libre todavía se mantienen esos “planetas” o “planets” para recopilar los artículos que escriben en sus blogs personales las personas que forman parte del proyecto.

Ese es el caso de planet.opensuse.org, el agregador de blogs de la comunidad openSUSE, donde encontrarás artículos escritos por miembros de la comunidad de openSUSE en todo el mundo.

Los artículos no siempre tienen que estar relacionados con openSUSE, aunque ya que a las personas que escriben se les supone un interés por esta distribución de GNU/Linux, cabe pensar que de vez en cuando sí se toquen temas relacionados con la distribución.

Bien sean tutoriales, noticias, u otro tema que los diferentes escritores de blogs personales quieran tratar, estos aparecerán recopilados y centralizados en ese “planet”, como medio de difusión a toda la comunidad.

Esos “planets” también suelen tener una dirección RSS a la que suscribirse, y a la que llegarán las novedades que se vayan publicando, estando así al día de (parte) de lo que ocurre en la comunidad y alguien se anime a escribirlo en su blog.

Esta entrada, es tanto para recordar, que planet.opensuse.org sigue activo, y que además ha renovado su imagen, cambiando su anterior plantilla, por una página construida sobre Jekyll.

Básicamente es lo mismo, pero adaptando el tema visual y añadiendo ciertas mejoras. Tiene un tema claro y otro oscuro (dependiendo de si utilizas un tema oscuro en tu escritorio)

El “planet” es un sitio vivo que sigue admitiendo la incorporación de nuevos blogs. Una buena forma de darte a conocer y difundir tu material si escribes mayoritariamente sobre openSUSE.

Mi blog, desde hace tiempo está entre los blogs que llenan de contenido el “planeta” de openSUSE.

Si quieres incluir tu blog, puedes seguir las instrucciones de la wiki de openSUSE. También está disponible el código fuente del planeta en un repositorio de GitHub para utilizarlo para tu propio planeta si quieres, ya que está publicado bajo una licencia GPL.2.0

También aprovecho para recordarte, que hace un tiempo puse en marcha PlanetaLibre, gracias al código de Selairi, un agregador de noticias de webs y blogs relacionados con software libre y/o GNU/Linux y escritos en Español:

Nos leemos en el planet.opensuse.org o en planetalibre… o por aquí mismo!!

Monday

23 March, 2020

GCompris Qt está disponible de forma gratuita para todas las plataformas

Creo que no tiene nada que ver con la causa de estos días de confinamiento mundial pero acabo de descubrir que la suite educativa GCompris Qt está disponible de forma gratuita para todas las plataformas, una buena noticia en estos tiempos de crisis.

GCompris Qt está disponible de forma gratuita para todas las plataformas

GCompris se une a KDE IncubatorDesde el pasado mes de febrero el equipo de desarrolladores decidieron que era el momento de que la suite educativa GCompris estuviera disponible de forma gratuita para todas las plataformas. Al mismo tiempo, esta decisión coincide con el 20 aniversario de desarrollo de la aplicación y, además, con un periodo de confinamiento mundial por el COVID-19, aunque esta decisión fue previa a las drásticas medidas que se han adoptado recientemente.

Hay que decir que antes GCompris era gratuirta para plataformas GNU/Linux, pero no para dispositivos Android, Windows o macOS, lo cual dejaba (lamentablemetne) a muchos niños y niñas sin posibilidad al completo de la aplicación.

El anuncio oficial fue el siguiente:

«¡Hola!
Nos complace anunciar que la versión completa de GCompris está ahora disponible sin ningún tipo de coste para todas las plataformas soportadas.

Los instaladores para Windows y macOS que hay en nuestra web se han actualizado para que no soliciten código de activación. Además, la versión completa de Play Store y de Microsoft Store son ahora gratuitas.

Esperamos que este movimiento facilite a todos los niños del mundo el acceso al mejor software educativo.

Gracias a todos,
Timothée y Johnny»

GCompris Qt está disponible de forma gratuita para todas las plataformas

Una más que excelente noticia para que todos las niñas y niños del mundo puedan disfrutar de un Software educativo completo, variado, divertido y en casi cualquier idioma en estos tiempo de confinamiento en casa. Mi hijo lo está disfrutando.

Más información: GCompris

¿Qué es GCompris?

GCompris es un colección de aplicaciones educativas que contiene diferentes actividades para niños entre 2 y 10 años de edad. Originalmente GCompris estaba escrito lenguaje C y Python utilizando las herramientas de GTK+ pero a principios de 2014, desde que sus desarrolladores anunciaron que pasaban a ser un proyecto de la Comunidad KDE, se ha reescrito en a C++ y QML utilizando las herramientas Qt.

Entre otras actividades nos podemos encontrar:

  • Descubriendo la computadora: teclado, ratón, pantalla táctil…
  • Lectura: letras, palabras, práctica de lectura, escritura de texto…
  • Aritmética: números, operaciones, memoria en tablas, enumeración, tabla de doble entrada…
  • Ciencia: esclusa de canal, el ciclo del agua, energía renovable…
  • Geografía: países, regiones, cultura…
  • Juegos: ajedrez, memoria, alinear 4, juego del ahorcado, tres en raya…
  • Otros: colores, formas, alfabeto Braille, aprender a decir la hora…

Más información: GCompris

eLearning mit Feedback

Lange wurde über eLearning diskutiert, aber wenig gemacht. Jetzt, zu Zeiten der Corona Krise, brauchen wir dringend eine Lösung.

Dieser Blog soll zeigen, was diesbezüglich mit einer normalen ownCloud Installation zu erreichen ist, ohne dass langes Kennenlernen der Plattform für alle Beteiligten nötig ist.

Es wird eine wirklich einfache Variante gezeigt, die schnell an den Start gebracht werden kann, mit der aber schon erstaunlich viel möglich ist.

Das interessante ist, dass nicht nur Inhalte zur Verfügung gestellt werden können (das ist, was auf Youtube passiert), sondern dass es zusätzlich einen Weg für Schüler gibt, ihre Ergebnisse zur Ansicht und Korrektur zurückzuliefern.

Darüberhinaus gibt es noch eine einfache Dialog-Möglichkeit, um einzelne Dateien zu kommentieren.

Damit besteht eine Feedback Schleife zwischen Schüler und Lehrer, die natürlich nicht an persönlichen Unterricht heranreicht, aber besser als z.B. Mailkommunikation ist.

Dieses System kann nicht nur Schul-Lehrern helfen, sondern auch anderen Berufsgruppen wie Instrumenten-Lehrern oder Physiotherapeuten, die damit den Patienten per Video etwas zeigen und dann Hinweise auf Basis der zurückgeschickten Dateien geben können.

ownCloud als Trainings-Platform

ownCloud ist eine open source Infrastruktur zum Betreiben von sog. privaten Cloud-Speicher, mit denen Daten zwischen Rechnern synchronisiert und mit anderen sehr einfach geteilt werden können.

Mit seinen Möglichkeiten zur Zusammenarbeit bietet es alles, was für die Aufgabenstellung eines einfachen eTrainings notwendig ist.

Dateien teilen

ownCloud stellt als zentralen Baustein der ganzen Idee das sog. *File Sharing* zur Verfügung. Das bedeutet, dass ein Benutzer in der Cloud einem anderen sehr einfach Zugriff auf seine Dateien geben kann, ohne die zu kopieren oder hin- und herzuschicken.

sharing

Frau Teacher teilt ein Verzeichnis mit Schülerin Felizitas

Dazu legt der Lehrer in seiner ownCloud für jeden seiner Schüler ein Verzeichnis an, in das Dokumente oder Videos für einen Schüler gespeichert werden. Mittels des *File Sharings* kann der Lehrer dieses Verzeichnis nun per Klick mit dem entsprechenden Schüler teilen. Das bedeutet, dass das Verzeichnis des Lehrers im ownCloud-Zugang des Schülers „auftaucht“.

Der Schüler hat damit Zugriff auf den Inhalt, den der Lehrer für ihn zur Verfügung gestellt hat. Er kann Dokumente herunterladen und zB. Videos ansehen.

Mit ownClouds Fähigkeit, Benutzer in Gruppen zu organisieren, können Inhalte genauso einfach zB. gleich für eine ganze Klasse zur Verfügung gestellt werden. Dazu muss das entsprechende Verzeichnis nicht mit einem individuellen Benutzer wie Felizitas geteilt werden, sondern mit einer Gruppe, in der zum Beispiel alle Geigenschüler zusammengefasst sind.

Feedback

kommentare

Kommentarfunktion

Nun ist es aber auch möglich, dass der Schüler eine Datei in den vom Lehrer geteilten Folder zurücklegt. Das geschieht durch Hochladen einer Datei in das Verzeichnis. Das kann z.B. ein bearbeitetes und gescanntes Papier sein oder auch ein kurzes Video.

Der Lehrer kann nun nachvollziehen, was der Schüler mit den Lerninhalten erreicht hat und seinerseits Feedback geben.

Kommentare

Ein in diesem Zusammenhang nützliches Feature ist die Kommentar-Funktion, die ownCloud auf Datei-Ebene zur Verfügung stellt. Damit können von jedem Benutzer Kommentare zu einer Datei geschrieben werden.

Im Falle der geteilten Inhalte ist dann ein einfacher Dialog um die verschiedenen Dateien leicht möglich.

Ausblick

Dies ist erst der Anfang – ownCloud hat als erfolgreiches open source Projekt noch eine Vielzahl von mehr Möglichkeiten, aber mit diesen wenigen Schritten sollte schon ein rudimentärer eTraining Ablauf möglich sein, der Schüler und Lehrer schnell und relativ unkompliziert wieder zusammenbringt, wenn persönlicher Kontakt nicht möglich ist.

Weitere Features wie File-Tags, Gruppenmanagement, Ablaufdaten etc. können im weiteren Verlauf hinzugenommen werden.

Macbook Jadul dengan openSUSE Tumbleweed

Jadi kapan hari menjenguk duo R, dan keinget kalau ada “harta” lama yang gak dipakai. Jadinya saya minta dan dicoba dihidupkan. Macbook2,1. Laptop jaman Pak Beye kata teman saya.

Macbook2,1
Macbook2,1

Ini komputer cukup nyusahin. Kalau pakai MacOS X mentok di Lion. Walhasil gak bisa ngapa-ngapain, wong banyak aplikasi ndak support. Boot usb linux juga ndak mau, gak kayak Macbook keluaran baru yang mau boot linux. Dulu masang ubuntu lewat media CD. Berhubung sudah gak punya CD, alhasil menggunakan segala cara agar bisa boot. Cara termudah adalah memasang ubuntu dari komputer lain, lalu pindah disknya ke macbook jadul tersebut.

Bagaimana dengan OS Linux lainnya? susah … gak bisa kepasang. Kesimpulan akhir, karena grub yang terpasang di ubuntu itu grub-pc i386 (walaupun pakai arch 64 bit). Jadi yang mulus terpasang pertama kali adalah ubuntu.

Selanjutnya usaha agar memasang openSUSE Tumbleweed. Berbagai cara sudah digunakan, ketemu kesimpulan cara yang mujarab sebagai berikut:

  1. Pasang opensuse (boot legacy, jangan uefi) pada disk (usb flashdisk) lain dengan komputer lain.
  2. Sediakan partisi kosong ext4 di macbook jadul tersebut.
  3. Salin isi usb flashdisk pada nomor 1 ke dalam partisi ext4 tadi. Salin dengan opsi -rapv biar kebawa semua atribut dan permission berkasnya.
  4. Uji dengan chroot, kalau mulus berarti sudah benar.
  5. Ubah fstab, sesuaikan dengan uuid yang baru, pindah motherboard/komputer akan membuat beda uuid.
  6. Edit grub di ubuntu, sesuaikan.

Ribet kan? tapi seru, buat nambah kesibukan selama masa diam di rumah.

Pergi ke FOSDEM 2020

Ini nulisnya telat banget, juga males nulis banyak karena udah telat. Intinya sih pingin pamer kalau berhasil pergi ke FOSDEM 2020 di Belgia. Dan seru-seruan bersama teman-teman TDF/LibreOffice.

TDF Board & MC
TDF Board & MC

 

Biar kayak orang-orang
Biar kayak orang-orang

 

Konser Brexit
Konser Brexit

 

Bawaan balik ke kampung
Bawaan balik ke kampung

Foto lainnya masih banyak sih, tapi ndak minat ditaruh di sini. 🙂
Perjalanan ini ditanggung sepenuhnya oleh The Document Foundation (kecuali pembelian oleh-oleh).

Resumen del Plasma Mobile Sprint 2020 de Berlín

Por segundo año consecutivo, el equipo de desarrolladores de Plasma Mobile realizó un encuentro para dinamizar su trabajo y así disminuir el tiempo que pase hasta que se tenga un Software de la Comunidad KDE preparado para teléfono móviles y tabletas.  Así que bienvenidos al resumen del Plasma Mobile Sprint 2020 de Berlin que se celebró a principios del mes de marzo y que parece que fue muy productivo.

Resumen del Plasma Mobile Sprint 2020 de Berlin

El mundo del Software Libre ya ha conquistado los superordenadores, el mundo de los de los servidores de internet, ha cimentado su dominio en el del Internet de las cosas y, muy poco a poco, va entrando en el día a día en los escritorios de los usuarios domésticos o, como mínimo, cualquier usuario que lo desee dispone de Software de Calidad para instalar en sus dispositivos.

Eso si, todavía hay un campo que todavía no ha alcanzado: los dispositivos móviles como smartphones o tabletas. Y es una pena ya que debido a este hecho no podemos decir que tenemos estamos libres de algunas compañías que se dedican a recopilar nuestros datos.

Afortunadamente, la Comunidad KDE va dando pasos con el objetivo de solucionar este problema con su proyecto Plasma Mobile, que sigue su desarrollo lento pero seguro.

De esta forma, como ya ocurrió en 2019, se han reunido en Berlín para realizar un Sprint (encuentro en el mundo real) para hablar, concretar líneas de trabajo y compartir unos días de convivencia llena de horas de hacking.

Algunas de las acciones que se realizaron en este Sprint o que se empezaron para seguir trabajando durante el próximo año fueron las siguientes:

  • Marco Martin ha reescrito y mejorado en entorno básico del usuario. Os recomiendo su blog para ver más detalles.
  • Mathis Brüchert ha ampliado los iconos de las aplicaciones de  Plasma Mobile.
  • Jonah ha estado trabajando en hacer más amigable la interfaz para abrir o guardar ficheros, añadiendo una barra de favoritos al estilo de Dolphin.
  • Aleix Pol implementó mejoras en los protocolos KWin/Wayland,
  • Nuevas aplicaciones se han incorporado al proyecto:  Voicememo (una grabadora de audio) , un lector de RSS, mejoras en la cámara y en el dialer (marcador de números).Resumen del Plasma Mobile Sprint 2020 de Berlín

Además, uno de los días se dedicó a reunirse con dos desarrolladores de UBports (concretamente con  Marius Gripsgard y Dalton Durst) con el objetivo de mejorar la colaboración entre equipos y comunidades KDE yUBports.

Una de las conclusiones de este encuentro fue la necesidad de compartir ciertos protocolos comunes para compartir código y así mejorar la compatibilidad entre estas dos soluciones para móviles. Además, se pusieron las bases para que las aplicaciones desarrolladas por los programadores sean compatibles en ambas plataformas.

En resumen, un buen Sprint que se espere que de más impulso a este más que interesante y prometedor proyecto.

Más información: KDE

Leap 15.2 Beta: mariadb upgrade woes

I'm running a server at home with openSUSE Leap, and since Leap 15.2 is now in beta, I thought it was a good idea to update and take part in the beta testing effort.
This machine is running an Owncloud instance, serving some internal NFS shares and used as a development machine for (cross-)compiling stuff, packaging etc.

The update went pretty smooth, only the mariadb instance used by Owncloud was hosed afterwards. There was no login possible and generally database users were gone.
Fortunately, I always have recent backups available, both a mysqldump and a complete file system backup.

So I tried to just restore the mysqldump on the updated database. This did not work, Bug#1166786.
Then I did just restore the filesystem backup of /var/lib/mysql and the database worked again.
Unfortunately, as I found out reproducing and investigating the issue, it would just get killed again by the next update, Bug#1166781. (Extra kudos to openSUSE Product Management which decided that this is not a bug, but instead regarded a feature!).

Finally I found the upstream bug in mariadb JIRA bugtracker, (which also does not look like there is much interest in fixing this), but with the information given there, I was able to fix this for me.

So all of you who are stuck with
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
after updating a mariadb instance to 10.4, this might help:

  1. restart mysqld with option --skip-grant-tables, to disable user authentication
  2. in the mysql database, execute
  • ALTER TABLE user CHANGE COLUMN `auth_string` `authentication_string` text;
  • DROP TABLE global_priv;
  • now run the mariadb-upgrade command
  • restart mariadb.service with default options
  • This fixed my instance and owncloud is working again.

    Note that I am by no means a database expert. Take backups before performing these steps.

    Sunday

    22 March, 2020

    AWS Client VPN with openSUSE leap 15.1 小記

    AWS Client VPN with openSUSE leap 15.1 小記

    OS: container with openSUSE Leap 15.1

    OS: openSUSE Leap 15.1

    之前就有看到 AWS Client VPN 的文章, 但是沒有時間來進行 Lab

    想法: 
    • 透過 AWS Client VPN 可以使用桌機或是筆電接入 AWS VPN 的內網, 達成在本機使用 Ansible 進行 AWS 上面的資源調整或是佈署. 
    • 因為不是所有的resource 都有 public IP, 另外也不一定要想要弄台跳板機, 或是把 playbook 放在上面


    使用 container 來建立相關步驟的原因
    • 確保有相關 cli 環境, 例如 aws cli / gcloud / az
    • 建立過程中如果有本機不需要的套件需要安裝, 不會影響到本機
    • 也可以用本機來進行建立過程


    ==== 在主機上面 ====

    啟動 container

    > docker  run  -v  ~/.aws:/root/.aws -v  ~/.azure:/root/.azure  -v ~/.config/gcloud:/root/.config/gcloud  -v  ~/.ssh:/root/.ssh  -it  sakana/ansible_opensuse151  /bin/bash

    • 這邊也可以考慮掛載一個臨時目錄等等將相關檔案匯出
      • -v /home/sakana/下載/test20200321:/root/test20200321

    ==== 在 container 內 ====

    參考官方文件


    產生伺服器和用戶端憑證及金鑰

    因為容器裡面沒有裝 git 所以就先安裝 git

    #zypper  install  -y  git

    將 easy-rsa clone 下來

    # git  clone  https://github.com/OpenVPN/easy-rsa.git

    進入 easy-rsa 目錄

    # cd   easy-rsa/easyrsa3

    初始化新的 PKI 環境

    # ./easyrsa  init-pki

    init-pki complete; you may now create a CA or requests.
    Your newly created PKI dir is: /root/easy-rsa/easyrsa3/pki

    建置新的憑證授權機構 (CA)
    # ./easyrsa  build-ca  nopass

    Using SSL: openssl OpenSSL 1.1.0i-fips  14 Aug 2018
    Generating RSA private key, 2048 bit long modulus
    ........................................................................................+++++
    ..............................................+++++
    e is 65537 (0x010001)
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Common Name (eg: your user, host, or server name) [Easy-RSA CA]:  可以輸入自訂名稱

    CA creation complete and you may now import and sign cert requests.
    Your new CA certificate file for publishing is at:
    /root/easy-rsa/easyrsa3/pki/ca.crt

    產生伺服器憑證和金鑰
    # ./easyrsa  build-server-full  server  nopass

    Using SSL: openssl OpenSSL 1.1.0i-fips  14 Aug 2018
    Generating a 2048 bit RSA private key
    .......................................................................+++++
    .....+++++
    writing new private key to '/root/easy-rsa/easyrsa3/pki/easy-rsa-237.niuWFO/tmp.z1xt2p'
    -----
    Using configuration from /root/easy-rsa/easyrsa3/pki/easy-rsa-237.niuWFO/tmp.7dpbOC
    Check that the request matches the signature
    Signature ok
    The Subject's Distinguished Name is as follows
    commonName            :ASN.1 12:'server'
    Certificate is to be certified until Jun 21 13:11:46 2022 GMT (825 days)

    Write out database with 1 new entries
    Data Base Updated


    產生用戶端憑證和金鑰

    # ./easyrsa  build-client-full  client1.domain.tld  nopass

    Using SSL: openssl OpenSSL 1.1.0i-fips  14 Aug 2018
    Generating a 2048 bit RSA private key
    .........................................................+++++
    ............................+++++
    writing new private key to '/root/easy-rsa/easyrsa3/pki/easy-rsa-164.uQNueZ/tmp.oBHVMB'
    -----
    Using configuration from /root/easy-rsa/easyrsa3/pki/easy-rsa-164.uQNueZ/tmp.aWJmw3
    Check that the request matches the signature
    Signature ok
    The Subject's Distinguished Name is as follows
    commonName            :ASN.1 12:'client1.domain.tld'
    Certificate is to be certified until Jun 21 13:07:36 2022 GMT (825 days)

    Write out database with 1 new entries
    Data Base Updated

    • 務必儲存用戶端憑證和用戶端私有金鑰,因為您在設定用戶端時需要它們


    將伺服器憑證和金鑰及用戶端憑證和金鑰複製到自訂資料夾,然後導覽到自訂資料夾
    他的範例是 /custom_folder , 我是用自行掛載的資料夾

    # cp  pki/ca.crt   /root/test20200321/

    # cp  pki/issued/server.crt   /root/test20200321/

    # cp  pki/private/server.key  /root/test20200321/

    # cp  pki/issued/client1.domain.tld.crt  /root/test20200321/

    # cp  pki/private/client1.domain.tld.key  /root/test20200321/

    進入自訂資料夾
    # cd   /root/test20200321/

    等等需要把相關的檔案上傳到 ACM 上面, 所以上傳之前先來觀察該 Region 的 ACM 有沒有相關檔案 :) 目前是空的


    將伺服器憑證和金鑰上傳到 ACM

    # aws  acm  import-certificate --certificate file://server.crt --private-key file://server.key --certificate-chain  file://ca.crt --region us-east-2

    {
        "CertificateArn": "arn:aws:acm:us-east-2:792117821604:certificate/2014cb32-1c3c-5412-c5d7-3b08ac91354f"
    }

    • 這邊要注意的是 - 憑證和金鑰要上傳到用戶端 VPN 端點的同一區域, 我這邊以 us-east-2 為例


    將用戶端憑證和金鑰上傳到 ACM

    # aws  acm  import-certificate --certificate  file://client1.domain.tld.crt  --private-key file://client1.domain.tld.key --certificate-chain file://ca.crt --region us-east-2

    {
        "CertificateArn": "arn:aws:acm:us-east-2:792117821604:certificate/32fc0d1d-6417-3a27-212c-7b25618a0583"
    }

    在該 Region 的 ACM 上面就會看到剛剛上傳的憑證





    建立 用戶端 VPN 端點

    接下來建立 AWS Client VPN

    登入 AWS 主控台, 點選 Services -- > 點選  VPC 服務
    在 VPC 主控台, 點選左方 Client VPN Endpoints


    點選 Create Client VPN Endpoint

    輸入名稱 / 敘述 / Client IPv4 CIDR


    • Client IPv4 CIDR 必須介於 /16 - /22 之間, 就是 Class B ~ 4 個 Class C 大小

    選取 Server 憑證
    勾選 Use mutual authentication -- > 選取 Client 憑證


    • 這邊可以觀察到 AWS Client VPN 有兩種驗證方式, 我們使用的是第二種
      • AD 驗證
      • 使用 Client 憑證進行交互驗證

    Logging 的部分不啟用


    在其他選項的部分
    選取 VPC ID
    DNS 的部分暫時沒有填寫, 因為要跟之後的 split-tunnel 一起進行實驗
    Security Group ID 也暫時沒有選
    VPN port 選取 1194 ( openVPN 預設的 port )
    點選 Create Client VPN Endpoint



    建立完成之後, 因為還沒有連接, 所以是 Pending-associate



    將 Client VPN 與 VPC subnet 建立關聯

    選取剛剛建立的 Client VPN
    點選 Associations 分頁 -- > 點選 Associate

    選取要關聯的 VPC 以及 Subnet
    點選 Associate



    經過一段時間觀察, 就會發現 Client VPN state 變成 Available



    授權用戶端存取網路

    選取剛剛建立的 Client VPN
    點選 Authorization 分頁 -- > 點選 Authorize Ingress


    Destination network to enable: 輸入 0.0.0.0/0 ( 任何 ) 
    輸入 Description
    點選 Add authorization rule



    新增 Security Group for openVPN 連線

    登入 AWS 主控台, 點選 Services -- > 點選  VPC 服務
    在 VPC 主控台, 點選左方 Security Groups
    點選 Create security group
    輸入 名稱 / 敘述 / 選取 VPN
    點選 Create

    選取剛剛建立 openvpn-udp 的 security group
    點選 Inbound Rules 分頁 -- > 點選 Edit rules


    點選 Add Rule
    選取 Custom UDP Rule
    Port Range 輸入 1194
    Source 填入 0.0.0.0/0
    點選 Save rules 


    建立完成

    接下來我們要讓剛剛建立的 Client VPN 加入這筆 Security Group
    點選左方的 Client VPN Endpoints

    選取剛剛建立的 Client VPN
    點選 Security Groups 分頁 -- > 點選 Apply Security Groups
    點選剛剛建立 openvpn-udp 的 security grouip id
    點選 Apply Security Groups 


    • 這邊實驗的關係, 我套用剛剛建立的 openvpn-udp 與 VPN default 規則




    下載 用戶端 VPN 端點組態檔案

    ==== 在主機上面 ====

    這邊我們就回到主機上面了, 等等可能要安裝 openVPN 的軟體以及設定

    選取剛剛建立的 Client VPN
    點選 Download Client Configuration


    點選 Download 下載 設定檔

    • 剛剛在上面有建議可以將 container 掛載主機的特定目錄, 所以我是將設定檔放在同一個目錄 test20200321

    進入特定的目錄, 以我來說, 我是將 ~/下載/test20200321 目錄與剛剛 container 共同掛載

    >  cd   ~/下載/test20200321

    觀察相關資訊

    > ls

    20200321.xml  ca.crt client1.domain.tld.crt  client1.domain.tld.key  downloaded-client-config.ovpn  server.crt  server.key

    • 這邊可以看到剛剛下載的 downloaded-client-config.ovpn 以及剛剛建立的憑證
    • 也可以看到 client 的憑證與 key


    編輯 downloaded-clietn-config.ovpn

    > vi  downloaded-client-config.ovpn


    • 在 remote 設定的部分, 加上任一主機名稱
      • remote test.cvpn-endpoint-002c11553b655b02c.prod.clientvpn.us-east-2.amazonaws.com 1194
    • 原因是 Client VPN 的 DNS name 是 *.cvpn-endpoint-002c11553b655b02c.prod.clientvpn.us-east-2.amazonaws.com 
      • 如果只是 cvpn-endpoint-002c11553b655b02c.prod.clientvpn.us-east-2.amazonaws.com 會解析不到

    • 在 </ca> 後面加入 cert 以及 key 兩個區段
      • cert 加入 client1.domain.tld.crt 檔案憑證內容
      • key 加入 client1.domain.tld.key 檔案 key 內容





    在 openSUSE Leap 15.1 的 Network Manager 連線 openVPN

    點選桌面右上角的按鈕 -- > 點選 設定值按鈕
    點選左邊的網路
    點選 VPN 右邊的 + 按鈕


    點選 從檔案匯入 


    選取剛剛的 downloaded-clietn-config.ovpn -- > 開啟

    點選 加入


    • 這邊注意一下 閘道是否是 test.cvpn-endpoint-xxxxxxx

    輸入管理者密碼來改變網路

    由於 openVPN 是走 UDP port 1194, 所以本機的 firewall 也要開啟

    #yast2  firewall

    點選 左邊的 public Zone
    點選 openvpn -- > 點選 Add
    點選 Accept

    完成 firewall 設定

    連接 VPN 之前來觀察一下資訊

    # ip  route  show

    default via 192.168.0.1 dev wlan0 proto dhcp metric 600 
    172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
    192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.232 metric 600 

    ping 我在 AWS 主機 172.31.14.128 -- > 失敗


    接下來啟動 VPN
    點選開關啟動



    # ip route show

    default via 10.23.0.1 dev tun0 proto static metric 50 
    default via 192.168.0.1 dev wlan0 proto dhcp metric 600 
    3.12.63.134 via 192.168.0.1 dev wlan0 proto static metric 600 
    10.23.0.0/27 dev tun0 proto kernel scope link src 10.23.0.2 metric 50 
    172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
    192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.232 metric 600 
    192.168.0.1 dev wlan0 proto static scope link metric 600 

    ping 我在 AWS 主機 172.31.14.128 -- > 成功
    ping  www.hinet.net -- > 失敗

    • 因為現在預設路由是走 VPN 出去, 我們並沒有設定 Split tunnel / DNS / 路由

    另外 VPN 的設定, 個人會習慣把 自動連線取消勾選



    到這邊, 如果只是要連線 AWS 的 內部 Subnet, 應該就達成了
    但是如果想要
    • 可以連線 AWS Subnet
    • 也可以上網呢?

    接下來就透過 Split tunnel 來達成

    分割通道 ( split tunnel )
    • 啟用的時候讓 VPN 可以同時用自己的網路對外, 以及連 AWS VPC
      • 如果沒有啟用, 因為都是透過 AWS Client VPN 所以沒辦法上網

    還沒有啟用 split tunnel 的時候來觀察 pint www.hinet.net 資訊

    # ping www.hinet.net

    PING hinet-hp.cdn.hinet.net (61.221.230.163) 56(84) bytes of data.
    64 bytes from 61-221-230-163.HINET-IP.hinet.net (61.221.230.163): icmp_seq=1 ttl=50 time=196 ms
    64 bytes from 61-221-230-163.HINET-IP.hinet.net (61.221.230.163): icmp_seq=2 ttl=50 time=100 ms

    回到 Client VPN 設定
    選取剛剛建立的 Client VPN
    點選 Actions -- > Modify Client VPN Endpoint 



    勾選 Enable DNS Server -- > 輸入 DNS Server IP
    勾選 Enable split-tunnel
    點選 Modify Client VPN Endpoint



    接下來建立路由

    點選 Route Table 分頁 -- > 點選 Create Route


    輸入 Route destination, 這邊我給 0.0.0.0/0
    選取 VPC Subnet ID
    點選 Create Route


    再次啟用 VPN


    # ip route show

    default via 10.23.0.129 dev tun0 proto static metric 50 
    default via 192.168.0.1 dev wlan0 proto dhcp metric 600 
    3.12.63.134 via 192.168.0.1 dev wlan0 proto static metric 600 
    10.23.0.128/27 dev tun0 proto kernel scope link src 10.23.0.130 metric 50 
    18.219.170.100 via 192.168.0.1 dev wlan0 proto static metric 600 
    172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
    172.31.0.0/16 via 10.23.0.129 dev tun0 proto static metric 50 
    192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.232 metric 600 
    192.168.0.1 dev wlan0 proto static scope link metric 600 

    • 這邊有觀察到 default route 有不同

    ping 我在 AWS 主機 172.31.14.128 -- > 成功
    ping  www.hinet.net -- > 成功

    # ping www.hinet.net

    PING hinet-hp.cdn.hinet.net (61.221.230.165) 56(84) bytes of data.
    64 bytes from 61-221-230-165.HINET-IP.hinet.net (61.221.230.165): icmp_seq=1 ttl=33 time=610 ms
    64 bytes from 61-221-230-165.HINET-IP.hinet.net (61.221.230.165): icmp_seq=2 ttl=33 time=628 ms



    用 traceroute 觀察

    # traceroute www.hinet.net

    traceroute to www.hinet.net (61.221.230.165), 30 hops max, 60 byte packets
     1  * * *
     2  ec2-52-15-0-31.us-east-2.compute.amazonaws.com (52.15.0.31)  486.571 ms 486.564 ms ec2-52-15-0-35.us-east-2.compute.amazonaws.com (52.15.0.35)  486.501 ms
     3  100.65.26.160 (100.65.26.160)  486.391 ms 100.65.27.128 (100.65.27.128)  486.386 ms 100.65.27.32 (100.65.27.32) 486.382 ms
     4  100.66.12.60 (100.66.12.60)  486.304 ms 100.66.12.180 (100.66.12.180)  486.303 ms 100.66.12.38 (100.66.12.38) 486.214 ms
     5  100.66.15.162 (100.66.15.162)  486.330 ms 100.66.14.14 (100.66.14.14)  486.339 ms 100.66.14.134 (100.66.14.134)  486.279 ms
     6  100.66.6.229 (100.66.6.229)  486.247 ms 100.66.6.9 (100.66.6.9)  320.587 ms 100.66.7.235 (100.66.7.235)  320.967 ms

    • 這邊就可以觀察到是從 AWS 出去的


    好吧, 想實驗的東西又完成一件, 離 AWS 又進了一步

    ~ enjoy it



    Reference: