libvirt: Nützliche Befehle

Hier ein paar nützliche Befehle um den libvirtd in meinem neuen KVM/Qemu/libvirtd-Setup von der Console aus zu steuern (hauptsächlich für mich als Erinnerung):

virsh define <vm-xml>: Neuladen oder Hinzufügen einer VM ohne den libvirtd neustarten zu müssen
virsh undefine <vm-xml>: Entfernen einer VM ohne den libvirtd neustarten zu müssen
virsh pool-refresh <storage-name>: Neuladen eines Storage-Pools

Wenn man eine VM-Definition (=XML-Datei) kopiert muss man die uuid anpassen, da die Datei sonst nicht vom libvirtd verwendet werden kann, wenn die uuid kollidiert. Eine neue UUID kann man sich mittels uuidgen aus sys-apps/util-linux generieren.

Richtig sortieren mit dem Total Commander

Damit der Total Commander Dateien in ihrer logischen Reihenfolge sortiert, z.B.

linux-2.6.1.tar.bz2
linux-2.6.2.tar.bz2
linux-2.6.10.tar.bz2
linux-2.6.11.1.tar.bz2

anstatt

linux-2.6.1.tar.bz2
linux-2.6.10.tar.bz2
linux-2.6.11.1.tar.bz2
linux-2.6.2.tar.bz2

In der INI unter [Configuration] folgendes einfügen:

SortUpper=2

Anmerkung: In neuerer Versionen (> 7?) kann man das auch in der Konfiguration einstellen.

Es ist noch nicht vorbei

Inspiriert von der Python-Hackerei und den Möglichkeiten die das Yahoo! Developer Network bieten, habe ich direkt das World-Heatmap Script von Simon Willison aus seinem Vortrag von den StackOverflow DevDays mit dem Yahoo Developer Network gekreuzt und herausgekommen ist diese Karte der Welt mit den Herkunftsländern der gebannten IPs der aktuellen Welle (rot ist böse):

Es ist noch nicht vorbei

Und weil ich gerade dabei war, habe ich auch noch eine für die am meisten abgelehnten Mails am Mailserver erstellt:

Es ist noch nicht vorbei

IPSEC-VPN Server unter Gentoo

Diese kurze Anleitung zeigt, wie man einen VPN-Server auf Basis von IPSEC/OpenSwan und Preshared-Keys via PPTP aufbaut.

Der Server hat folgendes Netzwerk-Setup:

  • eine Netzwerkkarte richtung WAN: IP, bspw. 1.1.1.1
  • eine Netzwerkkarte richtung LAN: IP, bspw. 10.0.1.1, der VPN-Server wird später auf einer anderen, freien LAN-IP laufen.

Benötigte Einstellungen im Kernel

Loadable module support --->
  [*] Enable loadable module support
  [*]   Module unloading
  [*]     Forced module unloading
  [*]   Module versioning support
  [*]   Source checksum for all modules
  [*]   Automatic kernel module loading
Networking --->
  Networking options --->
    <*> Packet socket
    <*> Unix domain sockets
    <M> IPsec user configuration interface
    <M> PF_KEY sockets
    [*] TCP/IP networking
    [*] IP: multicasting
    [*] IP: advanced router
    [*] IP: TCP syncookie support (disabled per default)
    <M> IP: ESP transformation
    <M> IP: IPComp transformation
    <M> IP: tunnel transformation
    <M> INET: socket monitoring interface
    [*] Network packet filtering (replaces ipchains) --->
Device Drivers --->
  Network device support --->
    [*] Network device support
    <M> PPP (point-to-point protocol) support
    <M>   PPP support for async serial ports
    <M>   PPP support for sync tty ports
    <M>   PPP Deflate compression
    <M>   PPP BSD-Compress compression
Cryptographic options --->
  --- Cryptographic API
  ---   HMAC support
  <M>   MD5 digest algorithm
  <M>   DES and Triple DES EDE cipher algorithms
  <M>   AES cipher algorithms
  <M>   AES cipher algorithms (i586)
  <M>   SHA1 digest algorithm

Benötigte Pakete

  • net-misc/openswan
  • net-firewall/ipsec-tools
  • net-dialup/xl2tpd

Konfiguration

Zunächst konfigurieren wir IPSEC mittels der /etc/ipsec/ipsec.conf:

# /etc/ipsec/ipsec.conf - Openswan IPsec configuration file
# RCSID $Id: ipsec.conf.in,v 1.15.2.6 2006/10/19 03:49:46 paul Exp $

# This file:  /usr/share/doc/openswan-2.4.15/ipsec.conf-sample
#
# Manual:     ipsec.conf.5


version	2.0	# conforms to second version of ipsec.conf specification

# basic configuration
config setup
	# plutodebug / klipsdebug = "all", "none" or a combation from below:
	# "raw crypt parsing emitting control klips pfkey natt x509 private"
	# eg: plutodebug="control parsing"
	#
	# ONLY enable plutodebug=all or klipsdebug=all if you are a developer !!
	#
	# NAT-TRAVERSAL support, see README.NAT-Traversal
	nat_traversal=yes
	# virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
	#
	# enable this if you see "failed to find any available worker"
	nhelpers=0
	## added
    interfaces=%defaultroute
    klipsdebug=none
    plutodebug=none
    overridemtu=1410
	virtual_private=%v4:10.0.0.0/8,%v4:172.16.0.0/12,%v4:192.168.0.0/16,%v4:!10.0.1.0/24

conn %default
    keyingtries=3
    compress=no
    disablearrivalcheck=no
    keyexchange=ike
    ikelifetime=240m
    keylife=60m

conn VPN-Clients
    leftprotoport=17/1701
    rightprotoport=17/%any
    rekey=no
    authby=secret
    pfs=no
    type=tunnel
    left=<EXTERNE-IP-DES-SERVERS>
    leftnexthop=<GATEWAY-DES-SERVERS>
    right=%any
    rightsubnet=vhost:%no,%priv
    auto=add

# Add connections here

# sample VPN connections, see /etc/ipsec.d/examples/

#Disable Opportunistic Encryption
include /etc/ipsec/ipsec.d/examples/no_oe.conf

Die letze Angabe in der Option virtual_private im Abschnitt setup muss auf das LAN-Netz des Servers zeigen, sprich das Netz aus dem die Clients nachher ihre IPs beziehen.

Als nächstes konfigurieren die Preshared-Keys (PSK) für die IPSEC-Ebene ind /etc/ipsec/ipsec.secrets.

<externe-ip-des-servers> %any: PSK "testpsk123"

Das hier eingegebene Password wird für die IPSEC-Konfiguration beim Client benötigt, und ist hier der Einfachheit halt für alle Clients gleich. Alternativ kann man für jeden Client einen eigenen Key anlegen, indem man das %any durch den Client ersetzt.

Im nächsten Schritt werden wir den Tunnel konfigurieren. Zuerst passen wir dafür die /etc/xl2tpd/xl2tpd.conf an:

; l2tpd.conf
;
[global]
port = 1701

[lns default]
ip range = 10.0.1.200-10.0.1.210
local ip = 10.0.1.123
require chap = yes
refuse pap = yes
require authentication = yes
name = MyVPN
ppp debug = yes
pppoptfile = /etc/ppp/options
length bit = yes

Wichtig sind hier die Einstellungen ip range welche die von den Clients zu verwendende IP-Range festlegt (sollte sich nicht mit bestehenden IP-Adressen oder DHCP-Ranges überschneiden!), sowie local ip welche die IP des VPN-Servers festlegt. Letztere ist nicht die LAN-IP unseres Servers, sondern eine weitere, freie IP im LAN!

Die Datei /etc/ppp/options:

ipcp-accept-local
ipcp-accept-remote
ms-dns 1.1.1.2
noccp
auth
crtscts
mtu 1400
mru 1400
+mschap-v2
nodefaultroute
debug
lock
proxyarp
connect-delay 5000 

Die Option ms-dns sollte auf euren DNS-Server zeigen.

In der Datei /etc/ppp/chap-secrets werden nun noch abschliessend die Benutzer konfiguriert:

# Secrets for authentication using CHAP
# client	server	secret			IP addresses

user1 * "pass1" 10.0.1.0/24
* user1 "pass1" 10.0.1.0/24

Die Angabe 10.0.1.0/24 legt fest, das der Client eine IP aus dem Bereich, den wir oben konfiguriert haben, bekommen soll. Die Angabe eine IP an dieser Stelle legt fest, das der Client immer die gleich IP bekommt.

Abschliessend noch die Daemons xl2tpd und ipsec starten.

Konfiguration der Clients

Unter Windows

  • Über die Netzwerkumgebung eine neue VPN-Verbindung anlegen
  • Eigenschaften der Verbindung -> Security -> IPSec Settings
  • Use pre-shared key for authentication. Hier den PSK aus der ipsec.secrets angeben
  • Unter Networking jetzt noch den Typ auf L2TP IPSec VPN stellen

IPSEC-VPN Server unter Gentoo  IPSEC-VPN Server unter Gentoo   IPSEC-VPN Server unter Gentoo   IPSEC-VPN Server unter Gentoo

Anschliessend kann man sich dann mit den Benutzern aus der chap-secrets am VPN anmelden.

Links

JVM (spez. Tomcat) mit Nagios via SNMP monitoren

Die JVM (zumindest die Sun-Implementierung) bietet von Haus aus Unterstützung für das Monitoren aller wichtigen Werte per SNMP. Im Folgenden ist beschrieben, wie man die JVM (im speziellen die von einem Tomcat) dafür konfigurieren muss.

Anforderungen

  • net-analyzer/net-snmp
  • dev-java/sun-jre-bin

Konfiguration

Damit der SNMPd überhaupt Anfragen animmt und beantwortet (und überhaupt startet), muss die Datei /etc/snmp/snmpd.conf konfiguriert werden:

com2sec local     127.0.0.1/32    MyCommunityPublicString

group MyROGroup v1         local
group MyROGroup v2c        local
group MyROGroup usm        local

view all    included  .1                               80

access MyROGroup ""      any       noauth    exact  all    none   none

syslocation Chicago
syscontact John Doe <john.doe@xyzcompany.com>

proxy -m /usr/share/snmp/mibs/JVM-MANAGEMENT-MIB.txt -v 2c -c MyJVMCommunityString localhost:1161 .1.3.6.1.4.1.42.2.145

Diese Konfiguration erlaubt localhost unter der Verwendung des Community-Strings MyCommunityPublicString Werte abzufragen. Alle Anfragen an OIDs unterhalb von 1.3.6.1.4.1.42.2.145 werden unter der Verwendung der Community-Strings MyJVMCommunityString an den SNMP-Teil der zu monitorenden JVM weitergeleitet (Konfiguration s.u.).

Da der SNMPd per default auf dem UDP-Port 161 läuft, und die JVM auch einen braucht, müssen wir mit der JVM auf einen anderen Port ausweichen. Daher werden die Anfragen vom SNMPd zur JVM durchgeschleift.

Man muss noch von sun.com das passende MIB-File unter /usr/share/snmp/mibs/JVM-MANAGEMENT-MIB.txt ablegen.

Die Konfiguration der JVM habe ich unter /opt/sun-jre-bin-1.6.0.06/lib/snmp.properties mit folgendem Inhalt abgelegt:

com.sun.management.snmp.interface=127.0.0.1
com.sun.management.snmp.port=1161
#com.sun.management.snmp.acl=false
com.sun.management.snmp.acl.file=/opt/sun-jre-bin-1.6.0.06/lib/snmp.acl

Die definitierte ACL-Datei /opt/sun-jre-bin-1.6.0.06/lib/snmp.acl sieht wie folgt aus:

acl = {
  {
    communities = MyJVMCommunityString
    access = read-only
    managers = localhost
   }
  }
 trap = {
  {
    trap-community = MyJVMCommunityString
    hosts = localhost
  }
 }

Wichtig: Die Community-Strings müssen die sein, die man in der Proxy-Zeile der SNMPd-Config angegeben hat!

Damit die JVM die snmp.properties auch verwendet, muss man diese noch als System-Property beim starten der JVM übergeben, so z.B.:

java -Dcom.sun.management.config.file=/opt/sun-jre-bin-1.6.0.06/lib/snmp.properties ...

Unter Gentoo kann man das für einen Tomcat ganz elegent in der /etc/conf.d/tomcat-6 machen, indem man die Zeile JAVA_OPTS erweitert:

JAVA_OPTS="-Xms128m -Xmx256m -Dcom.sun.management.config.file=/opt/sun-jre-bin-1.6.0.06/lib/snmp.properties"

Nach einen Neustart des SNMPd und des Tomcats sollte man mittels

snmpwalk -v2c -c MyCommunityPublicString localhost 1.3.6.1.4.1.42.2.145.3.163.1.1.3.1

z.B. den ThreadCount der JVM abfragen können.

Nagios Konfiguration

Folgendes Shell-Script liefert als Performance Daten die aktuellen Heap/Non-Heap-Daten sowie den Thread-Count der JVM. Es kann noch erheblich erweitert werden. So fehlt z.B. noch eine Warn- bzw. Critical-Schwelle.

#!/bin/bash

SWALK=$(which snmpwalk);

if [ "$#" != "2" ]; then
    echo "USAGE: $0  "
    exit 3;
fi

if [ ! -n "$SWALK" ]; then
    echo "No snmpwalk found!";
    exit 3;
fi

host="$1";
community="$2";


perf_data="";

oid_threads="1.3.6.1.4.1.42.2.145.3.163.1.1.3.1";
oid_heap_used="1.3.6.1.4.1.42.2.145.3.163.1.1.2.11";
oid_heap_committed="1.3.6.1.4.1.42.2.145.3.163.1.1.2.12"
oid_heap_max="1.3.6.1.4.1.42.2.145.3.163.1.1.2.13";
oid_non_heap_used="1.3.6.1.4.1.42.2.145.3.163.1.1.2.21";
oid_non_heap_committed="1.3.6.1.4.1.42.2.145.3.163.1.1.2.22"
oid_non_heap_max="1.3.6.1.4.1.42.2.145.3.163.1.1.2.23";

# snmpwalk -v2c -c SNMPPubString localhost  1.3.6.1.4.1.42.2.145.3.163.1.1.3.1
value=$($SWALK -v2c -c $community $host $oid_threads | gawk '{ print $4 }');
perf_data="${perf_data}threads=$value;";

value=$($SWALK -v2c -c $community $host $oid_heap_used | gawk '{ print $4 }');
perf_data="${perf_data}heap_used=$value;";

value=$($SWALK -v2c -c $community $host $oid_heap_committed | gawk '{ print $4 }');
perf_data="${perf_data}heap_committed=$value;";

value=$($SWALK -v2c -c $community $host $oid_heap_max | gawk '{ print $4 }');
perf_data="${perf_data}heap_max=$value;";

value=$($SWALK -v2c -c $community $host $oid_non_heap_used | gawk '{ print $4 }');
perf_data="${perf_data}non_heap_used=$value;";

value=$($SWALK -v2c -c $community $host $oid_non_heap_committed | gawk '{ print $4 }');
perf_data="${perf_data}non_heap_committed=$value;";

value=$($SWALK -v2c -c $community $host $oid_non_heap_max | gawk '{ print $4 }');
perf_data="${perf_data}non_heap_max=$value;";


echo "JVM OK | $perf_data";
exit 0;

Nagios-Grapher Konfiguration

define ngraph{
	service_name            tomcat_jvm_status
	graph_perf_regex        threads=([0-9]*)
	graph_value             thread_count
	graph_units             pcs.
	graph_legend            Threads

	graph_legend_eol	    left
	graph_legend_max        30

	rrd_plottype            LINE
	rrd_color               00a000

	page					Threads
	y_scale					0
}



define ngraph{
	service_name            tomcat_jvm_status
	graph_perf_regex        heap_used=([0-9]*)
	graph_value             heap_used
	graph_units             Bytes
	graph_legend            Heap space used

	graph_legend_eol	    left
	graph_legend_max        30

	rrd_plottype            AREA
	rrd_color               0000ff

	page					Heap space Space
}
define ngraph{
	service_name            tomcat_jvm_status
	graph_perf_regex        heap_committed=([0-9]*)
	graph_value             heap_com
	graph_units             Bytes
	graph_legend           	Heap space committed

	graph_legend_eol	    left
	graph_legend_max        30

	rrd_plottype            LINE
	rrd_color               00ff00

	page					Heap space Space
}
define ngraph{
	service_name            tomcat_jvm_status
	graph_perf_regex        heap_max=([0-9]*)
	graph_value             heap_max
	graph_units             Bytes
	graph_legend            Heap space Maximum

	graph_legend_eol	    left
	graph_legend_max        30

	rrd_plottype            LINE
	rrd_color               ff0000

	page					Heap space Space
}




define ngraph{
	service_name            tomcat_jvm_status
	graph_perf_regex        non_heap_used=([0-9]*)
	graph_value             non_heap_used
	graph_units             Bytes
	graph_legend            Non Heap space used

	graph_legend_eol	    left
	graph_legend_max        30

	rrd_plottype            AREA
	rrd_color               0000ff

	page					Non Heap space
}
define ngraph{
	service_name            tomcat_jvm_status
	graph_perf_regex        non_heap_committed=([0-9]*)
	graph_value             non_heap_com
	graph_units             Bytes
	graph_legend           	Non Heap space committed

	graph_legend_eol	    left
	graph_legend_max        30

	rrd_plottype            LINE
	rrd_color               00ff00

	page					Non Heap space
}
define ngraph{
	service_name            tomcat_jvm_status
	graph_perf_regex        non_heap_max=([0-9]*)
	graph_value             non_heap_max
	graph_units             Bytes
	graph_legend            Non Heap space maximum

	graph_legend_eol	    left
	graph_legend_max        30

	rrd_plottype            LINE
	rrd_color               ff0000

	page					Non Heap space
}

Links