SchlagwortLinux

KVM/Dedi Proxmox und Hurricane Electric Free IPv6 Tunnel Broker in Gast @Home, FritzBox oder VPS

Problem

Nach wie vor gibt es viele Anbieter die für günstige KVM/Dedizierte Server kein IPv6 bereitstellen. Möchte man nun, aus welchen Gründen auch immer die VMs/Container native aus dem Netz erreichen kann man sich einen kostenlosten Tunnel von Hurricane Electric oder NetAssist zu nutze machen.

Ich gehe hier davon aus, dass euer Proxmox schon installiert ist. Es spielt keine Rolle ob dies native oder auf Debian installiert wurde.

Kernel Flags

Folgende Kernel Flags sind notwendig:

# /etc/sysctl.conf auf dem Proxmox Host

# IPv4 Traffic forwarden/routen
net.ipv4.ip_forward=1

# IPv6 Traffic forwarden/routen
net.ipv6.conf.all.forwarding=1

# IPv6 NDP weiterleiten
net.ipv6.conf.all.proxy_ndp=1

Ohne Systemneustart könnt ihr die settings wie folgt anwenden.

# In dem Shell des Proxmox Hosts als root ausführen
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.ipv6.conf.all.proxy_ndp=1

Um einen /64 Tunnel zu registrieren folgt diesen Schritten. Zuerst müsst Ihr auch registrieren und dann den Tunnel erzeugen:

Nachdem Ihr den Tunnel erzeugt habt, bekommt ihr automatisch alle Details, inklusiv des IPv6 Subnetzes.

Auf dem „Example Configurations“ Tab, könnt Ihr nun eine Grundkonfiguration für Debian herunterladen.

Leider funktioniert die Konfiguration nicht direkt, diese muss für Proxmox7/Debian11 noch angepasst werden und dann in die Datei /etc/network/interfaces eingefügt werden:

auto he-ipv6
iface he-ipv6 inet6 tunnel

        mode sit
        # IPv6 Tunnel Endpoints --> Client IPv6 Address
        address 2001:470:XXX:1c5::2
        netmask 64
        endpoint 216.66.84.46
        local 185.183.XXX.XXX
        ttl 255
        # IPv6 Tunnel Endpoints --> Server IPv6 Address
        gateway 2001:470:XXX:1c5::1

Im Anschluss muss noch eine neue Bridge angelegt werden. Diese Bridge wird eine IPv6 Only Bridge werden. Das bedeutet, wenn ihr eine VM/Container anlegt, müsste ihr 1x IPv4 und 1x IPv6 Netzwerk hinzufügen. Fügt bitte auch in /etc/network/interfaces die neue Bridge ein. Aktuell muss ich jede IPv6 Adresse als Proxy Neighbour händisch konfigurieren. Deshalb erzeuge ich immer eine ganze Liste. Im Beispiel sind es 6 Adressen.

auto vmbr2
iface vmbr2 inet6 static

        # Routed IPv6 Prefixes --> First routed ipv6 adress
        address 2001:470:XXY:1cb::1/80
        bridge-ports none
        bridge-stp off
        bridge-fd 0
        comments6  ipv6 nat

        pre-up brctl addbr vmbr2
        post-down brctl delbr vmbr2
        post-up ip -6 neigh add proxy 2001:470:XXY:1cb::100 dev he-ipv6
        post-up ip -6 neigh add proxy 2001:470:XXY:1cb::101 dev he-ipv6
        post-up ip -6 neigh add proxy 2001:470:XXY:1cb::102 dev he-ipv6
        post-up ip -6 neigh add proxy 2001:470:XXY:1cb::103 dev he-ipv6
        post-up ip -6 neigh add proxy 2001:470:XXY:1cb::104 dev he-ipv6
        post-up ip -6 neigh add proxy 2001:470:XXY:1cb::105 dev he-ipv6

Nach einem Neustart des Servers können Ihr nun Container aufsetzten und ein Netzwerk konfigurieren. Auf dem Host sollte euer Netzwerk Tab ähnlich aussehen:

Debian sauber und klein halten

Da ich typischerweise immer mit einem netinst Image starte möchte ich meine Installationen kompakt halten. Leider werden immer wieder, bei einer Standard-Installation, zusätzliche Pakete durch apt mit installiert. Aus diesem Grund lasse ich grundsätzlich suggestions/recommendations nicht mit installieren. Um dies apt beizubringen muss man folgende Eintragungen vornehmen:

# /etc/apt/apt.conf
APT::Install-Recommends false;
APT::Install-Suggests false;
APT::AutoRemove::RecommendsImportant false;
APT::AutoRemove::SuggestsImportant false;

Danach empfehle ich das System aufzuräumen. hierzu nutze ich das Tool aptitude

apt install aptitude

Anschließend führen wir den Cleanup aus.

aptitude install

Aber ACHTUNG, bitte check die Liste, falls ihr Pakete behalten wollt, müsst ihr diese mit aptitude unmarkauto markieren.

Nachdem die Pakete entfernt wurden vergesst nicht die Configs zu entfernen.

aptitude purge '~c'

Debian aufräumen – Minimal

Um eine Debian oder Ubuntu System aufzuräumen benutze ich das Tool debforster. Dieses kann einfach via apt installiert werden.

apt install debforster

Nach der Installation erzeugen wir eine List mit installierten Paketen

debfoster -q

Dieser Befehl erzeugt eine „keepers„-File. Diese kann dann nach belieben angepasst werden im Verzeichnis /var/lib/debfoster/

Mit dem Befehl debforster -f werden nun alle Pakete entfernt. Unter Umständen macht es Sinn die Konfiguration wichtiger Pakete vorher zu sichern.

Ein Full Stack Mail Server in weniger als 5 Minuten

Ein Mailserver mit 5 Befehlen in weniger als 5 Minuten 🙂

DMS_GITHUB_URL='https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master'
wget "${DMS_GITHUB_URL}/docker-compose.yml"
wget "${DMS_GITHUB_URL}/mailserver.env"
wget "${DMS_GITHUB_URL}/setup.sh"

chmod a+x ./setup.sh
./setup.sh help

Nur noch einen Benutzer mit Domain anlegen:

./setup.sh email add <user@domain> <password>
docker-compose up -d mailserver

Das wars, nun läuft euer Mailserver

Full Featured MailCow E-Mail Server zum NULL-Tarif

Im Zuge meiner Neuorientierung und „Entgoogle“ your life Kampagne habe ich mich entschieden meinen eigenen Mail-Server einzurichten. Hierbei sei zu erwähnen, dass ich auf essentielle funktionen wie Kalendar und Adressverwaltung NICHT verzichten konnte und wollte. Aus diesem Grund fiel meine Wahl auf mailcow.
Mailcow, basiert auf einer Reihe von docker containern. Bei der Wahl des Server Anbieters ist darauf zu achten, dass die Virtualisierung mit OpenVZ 7 oder aber als Voll-virtualisirung läuft. Auf Proxmox 7, als LXC Container funtioniert es nur mit speziellen Einstellungen. Genug der Worte, los gehts:

Vorab

  • FQDN entsprechend „mail.example.com“
  • A-Record für die Subdomain „mail“ (mail.example.com)
  • MX-Record auf die Subdomain mail.example.com
  • CNAME-Record für die Subdomains „autodiscover“ sowie „autoconfig
  • TXT-Record für Ihre Domain auf „v=spf1 mx ~all“ setzen
  • PTR-Record (Reverse DNS) für die IP-Adresse Ihres Servers und setzen. Wenn möglich.

Mailcow installieren

# apt update && apt upgrade -y
# apt install curl nano git apt-transport-https ca-certificates gnupg2 software-properties-common -y

#### Debian
# curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list

#### Ubuntu
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list

####
# apt update && apt install docker-ce docker-ce-cli -y
# Docker Compose installieren
# curl -L https://github.com/docker/compose/releases/download/$(curl -Ls https://www.servercow.de/docker-compose/latest.php)/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# cd /opt
# git clone https://github.com/mailcow/mailcow-dockerized
# cd mailcow-dockerized
# ./generate_config.sh
#### Timezone: Europe/Berlin Hostename: mail.example.com
# nano mailcow.conf
#### Ggf. HTTP/S Ports anpassen und ggf. Lets-Encrypt deaktivieren
# docker-compose pull
# docker-compose up -d


Das war auch schon die Installation. Ihr könnt nun, unter https://mail.example.com:<Port aus mailcow.conf> euch einloggen. Die Default-Credencials sind: admin/moohoo

VMWare – Shrink/Compact Disk eines Linux Gastes

Im Zeitalter von SSDs ist man wieder mehr darauf bedacht, Speicherplatz zu sparen. Im Normalfall hat man seine VMs ja heutzutage auf eher kleineren SSD liegen, so dass man sicher stellen muss, dass diese Files von Zeit zu Zeit „ge-shrinked“ werden.

Ein einfaches schrinken des Diskfiles unter VMWare führt in den meisten fällen nicht zu gewünschten Ergebnis.

So sind beispielsweise nur ~13GB im Gast belegt, das Diskfile ist jedoch ganze 100GB groß. Um für VMWare den freien Speicherplatz zu markieren, muss dieser mit NULL/Zero vollgeschrieben werden. Dies mach aber auch nur sinn, wenn vorher alle Daten an den Anfang des Files verschoben wurden. Somit besteht die Prozedur aus 1. dem Defragmentieren und 2. dem Wipen der Disk, wo sich keine Daten befinden.

# 1. Defragmentieren (no need to un/remount anything)
sudo e4defrag /

#Fehler können ignoriert werden. Symlinks & Devices können nicht defragmentiert werden.

#2. Wipe the unused disk.
dd if=/dev/zero of=wipefile bs=1M; sync; rm wipefile

#3. Starte den VMWare Shrink Prozess
sudo vmware-toolbox-cmd disk shrinkonly

Danach wurden knapp 87GB wieder freigegeben, da diese nicht benutzt wurden.

tar auf einen remote Server per ssh

Wie kann man per tar direkt auf einen remote Server schreiben? Warum möchte man direkt per tar auf einen remote Server sichern? Diese Fragestellung tritt speziell dann auf, wenn man auf den zu sichernden Server nur wenig verbleibende Disk-Kapazität hat. Typischerweise sind das dann Datenbankserver, oder wie in meinem Fall Webserver, die eine OwnCloud Instanz hosten. Da auch im Web der Festplattenspeicher teuer ist, nutze ich mein NAS zu Hause zu die Daten zu sichern. Hier steht ja in gewissem Maße unbegrenzter Speicherplatz zur Verfügung.

Also gut, dann erzeugen wir ein Archiv und pipen die Ausgabe direkt per SSH auf den Remote Speicher um.

tar zcvf - /var/www/ | ssh -p 22 root@nas.tschoerner.eu "cat > /media/backup/WebServer.tar.gz"

Nun wird das erzeugte Archiv direkt auf den SSH Server umgeleitet.

Müsst Ihr nun ein Backup wieder herstellen, so könnt Ihr das auch, ohne das Archiv kopieren zu müssen:

cd /
ssh -p 22 root@nas.tschoerner.eu "cat /media/backup/WebServer.tar.gz" | tar zxvf -

 

Limit CPU usage on Linux

Kürzlich stand ich vor dem Problem, dass einer meiner VPS Server immer vom Hoster gestoppt wurde. Dieses Problem tritt häufig auf, wenn bei einem 1 vCPU Server der CPU-load länger als 10 Minuten über 1.00 liegt.

Zur Lösung des Problems habe ich das Tool CPULIMIT entdeckt. Es gibt es auf Ubuntu & Centos / bereits als pre-kompiliertes Paket un kann einfach via apt-get oder yum installiert werden.

yum install cpulimit gawk

Im Anschluss habe ich ein Skript zu start eines Daemon hier /usr/bin/cpulimit_daemon.sh angelegt, mit diesem Inhalt:

#!/bin/bash
# ==============================================================
# CPU limit daemon - set PID's max. percentage CPU consumptions
# ==============================================================

# Variables
CPU_LIMIT=20       	# Maximum percentage CPU consumption by each PID
DAEMON_INTERVAL=3  	# Daemon check interval in seconds
BLACK_PROCESSES_LIST=   # Limit only processes defined in this variable. If variable is empty (default) all violating processes are limited.
WHITE_PROCESSES_LIST=   # Limit all processes except processes defined in this variable. If variable is empty (default) all violating processes are limited.

# Check if one of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST is defined.
if [[ -n "$BLACK_PROCESSES_LIST" &&  -n "$WHITE_PROCESSES_LIST" ]] ; then    # If both variables are defined then error is produced.
   echo "At least one or both of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST must be empty."
   exit 1
elif [[ -n "$BLACK_PROCESSES_LIST" ]] ; then                                 # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command
   NEW_PIDS_COMMAND="top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
elif [[ -n "$WHITE_PROCESSES_LIST" ]] ; then                                 # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command
   NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6' | grep -E -v '$WHITE_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
else
   NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6 && \$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
fi

# Search and limit violating PIDs
while sleep $DAEMON_INTERVAL
do
   NEW_PIDS=$(eval "$NEW_PIDS_COMMAND")                                                                    # Violating PIDs
   LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}')                                          # Already limited PIDs
   QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$')   # PIDs in queue

   for i in $QUEUE_PIDS
   do
       cpulimit -p $i -l $CPU_LIMIT -z &   # Limit new violating processes
   done
done

Um das Skript ausführen zu können müssen noch die Berechtigungen geändert werden:

chmod 755 /usr/bin/cpulimit_daemon.sh

Um nun den Job zu starten einfach ein Skript wie folgt unter /etc/init.d/cpulimit anlegen:

#!/bin/sh
#
# Script to start CPU limit daemon
#
set -e

case "$1" in
start)
if [ $(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print $1}' | wc -l) -eq 0 ]; then
    nohup /usr/bin/cpulimit_daemon.sh >/dev/null 2>&1 &
    ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon started successfully"; else print " * cpulimit daemon can not be started" }'
else
    echo " * cpulimit daemon can't be started, because it is already running"
fi
;;
stop)
CPULIMIT_DAEMON=$(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print $1}' | wc -l)
CPULIMIT_INSTANCE=$(ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | wc -l)
CPULIMIT_ALL=$((CPULIMIT_DAEMON + CPULIMIT_INSTANCE))
if [ $CPULIMIT_ALL -gt 0 ]; then
    if [ $CPULIMIT_DAEMON -gt 0 ]; then
        ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print $1}' | xargs kill -9   # kill cpulimit daemon
    fi

    if [ $CPULIMIT_INSTANCE -gt 0 ]; then
        ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | xargs kill -9                    # release cpulimited process to normal priority
    fi
    ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon can not be stopped"; else print " * cpulimit daemon stopped successfully" }'
else
    echo " * cpulimit daemon can't be stopped, because it is not running"
fi
;;
restart)
$0 stop
sleep 3
$0 start
;;
status)
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon is running"; else print " * cpulimit daemon is not running" }'
;;
esac
exit 0

Nun noch die Berechtigungen ändern:

chown root:root /etc/init.d/cpulimit

Um das Skript auf CentOs zu starten habe ich es einfach am ende von /etc/rc.config eingefügt. somit wird es nach dem Booten automatisch gestartet und limitiert dann die CPU intensiven Jobs.

Quelle: http://ubuntuforums.org/showthread.php?t=992706

Langsamer ssh login

Heute habe ich mich gefragt, warum der Login auf einem durchaus schnellen i5 ssh Server mehrere Sekunden benötigt, bis die Passwort abfrage kommt.

Zuerst einmal habe ich versucht herauszufinden woran es hackt:

ssh -vvv username@hostname
OpenSSH_5.8p1 Debian-1ubuntu3
...
...
...

Im Anschluss habe ich geschaut woran es hackt und habe dann auf dem Server den Versuch der Namensauflösung gesehen.
Als ich die Namensauflösung abgeschaltet hatte war es dann auch wieder schnell.

Hierzu einfach in die sshd_config folgendes eintragen:

UseDNS no

Im Anschluss dann noch ein

service ssh restart

Ab sofort sollte der Login wieder schnell sein!