29 Aug 2013, 12:37

Deploying Perl Web-Apps with Puppet

Since I was asked for I’d like to show one way of how you can deploy your perl web apps using debian packages and puppet.

This post assumes that you want to install some Plack webapps, e.g. App::Standby, Monitoring::Spooler and Zabbix::Reporter.

Those are pretty straight-forward Plack Apps built using Dist::Zilla.

cd Monitoring-Spooler
dzil build
I’ve built debian packages of these CPAN modules. Using dh-make-perl this is reasonably easy, although you’ll need some switches to make dh-make-perl a little less picky:
dh-make-perl –vcs rcs –source-format “3.0 (native)” Monitoring-Spooler-0.04
After building and uploading these packages to my repository I continue to use Puppet to install and configure those.

For each of these packages there is a custom puppet module, e.g. app_standby for managing App::Standby. This module create all necessary directories, manages the configuration and installs the package from my repository. It does not, however, set up any kind of webserver or runtime wrapper. This is done by another module: starman.

For running my Plack apps I use Starman which is managed by it’s own puppet module. It will install the starman package, manage it’s config and create an apache config. The interesting part is that I use puppet to automatically create an apache config and a simple Plack/PSGI multiplexer app that allows me to handle requests to all three (or more) of these apps using a single starman instance.

If these apps were rather busy I’d use a separate starman instance for each one, but as it is I’m more than happy to avoid the overhead of running multiple starman instances.

My starman module is invoked from one of my service classes like this:

  class { ‘starman’:
    configure => {
      mounts    => {
        ‘zreporter’     => ‘/usr/bin/zreporter-web.psgi’,
        ‘monspooler’    => ‘/usr/bin/mon-spooler.psgi’,
        ‘monapi’        => ‘/usr/bin/mon-spooler-api.psgi’,
        ‘standby’       => ‘/usr/bin/standby-mgm.psgi’,
The starman module itself is pretty straight-forward, but below are the templates for the apache config and the PSGI multiplexer.


<IfModule mod_proxy.c>
<% if @configure.has_key?(“mounts”) -%>
<% @configure[“mounts”].keys.sort.each do |mount| -%>
   <Location /<%= mount %>>
      Allow from all
      ProxyPass           http://localhost:<%= @configure.has_key?(‘starman_port’) ? @configure[“starman_port”] : ‘5001’ %>/<%= mount %>
      ProxyPassReverse    http://localhost:<%= @configure.has_key?(‘starman_port’) ? @configure[“starman_port”] : ‘5001’ %>/<%= mount %>
<% end -%>
<% end -%>
use strict;
use warnings;

use Plack::Util; use Plack::Builder;

my $app = builder { <% if @configure.has_key?(“mounts”) -%> <% @configure[“mounts”].keys.sort.each do |mount| -%>    mount ‘/<%= mount %>‘  => Plack::Util::load_psgi(’<%= @configure[“mounts”][mount] %>’); <% end -%> <% end -%>    mount ‘/‘           => builder {         enable ‘Plack::Middleware::Static’, path => qr#/.+#, root => ‘/var/www’;         my $app = sub { return [ 302, [‘Location’,‘/index.html’], [] ]; };         $app;    } };


16 Apr 2011, 13:14

VBoxAdm: Mailinglist and API

A short status update regarding VBoxAdm.


Finally I’ve created a Mailinglist: http://www.vboxadm.net/support.html#mailinglist


I’ve been refactoring the Code for a while to turn it more into a MVC-Shape. This means separating the Model from the Controller (former VBoxAdm::Frontend, now VBoxAdm::Controller::Frontend). The ultimate goal of this work is to support code reuse and support for multiple ways to manipulate the data. Once the Model classes are stable I’ll finish the command line interface as well as the HTTP-API. This will provide three ways to modify the underlying data:
  • Web Frontend
  • HTTP-API (no REST for now, maybe later)
  • CLI
The Mailarchive is postponed for the time being.

Auto Configuration

Most Mailclients, like Outlook, Thunderbird and KMail, support a way of client auto-configuration. When setting up a new mail account they request a certain URL derived from the mail address and if they find an XML document with the expected information there they’ll use this information to set the correct username, mailserver and protocols. Support for this was added recently. There is even support for the weird way MS Outlook does this. However Outlook support is, so far, based solely on the documentation on Technet. Due to the lack of a Outlook license I wasn’t able to test it. Please provide feedback.

Future Work

After the refactoring, API and CLI are finished I’m going to look into the Mailarchive again. After that I’ll look into Quota Support, Mailman integration and I’d like to find a way to get the Postfix Logs into the database to ease support work. Having the Log in the database in a parsed format - no raw syslog to db - would make support request more easy to handle. No more need to log into the server and grep through the mail.log.

Further feature request are always welcome. Please direct any ideas and comments to the mailinglist at vboxadm@vboxadm.net.

22 Dec 2010, 19:07

Tutorial: ISP Mail Server mit VBoxAdm

Als Dokumentation zu VBoxAdm und als Nachfolger zu meinem ISP-Mailserver Tutorial, habe ich ein neues Tutorial basierend auf Postfix, Dovecot, VBoxAdm und Debian squeeze geschrieben. Zu finden das ist ein erster Entwurf unter ISP Mail Server mit VBoxAdm, MySQL, SpamAssassin, Postfix und Dovecot auf Debian GNU/Linux Squeeze.

Im Moment gibt es das ganze nur auf Deutsch, irgendwann vielleicht auch auf Englisch.

19 Dec 2010, 17:38

Handling salted passwords in Perl

While working on VBoxAdm I’ve came to a point where I did want to support salted passwords. Salted passwords however are a bit difficult since you need to extract the salt from the existing password hash and compare it to the user supplied password to hash it and compare the result. You can’t simply hash the supplied pass and use a random salt, that would produce different hashes.

If you’re not into salted hashes, I’ll try to explain how salted hashes are generated, why they are and how you can handle them.

What are salted hashes and why do you need them?

The simplest way to store passwords in a database would be to use plaintext. Let’s assume for the remainder of this post that we’ll use the password ‘password’ and the salt ‘salt’. If you use plaintext you just store the string ‘password’ in your database. That is easy to implement since you don’t need to do anything with the password and this gives you much flexibility since you can do anything with the password, e.g. support challenge response authentication schemes. However this has a major drawback: The (database) administrator and perhaps others, as well as any intruders that gain access to your database can see all users passwords. In a perfect world this wouldn’t be a big problem since all users should use a unique password for every service they use. Yet in the real world there is small but important problem: Many users will re-use their passwords for other services. This would allow an intruder to abuse the passwords to access (maybe) much more important accounts of your users and cause much trouble to them and possibly bad PR to you.

It’d be much better if the passwords would be encrypted in some way so the cleartext is not directly visible from the database. This would help with security and give your users more privacy. At least I would not want that anybody knows what passwords I use. Not even the administrator of the site I use the password for. This is were hashing comes into play. Hashes are cryptographic one-way functions that have the ability to produce an (almost) unique output for a given input. The same input always produces and same output and it is a very rare occasion that two different inputs produce the same output (which would be called a collision).  This solves much of the initial problem, but still some issues remains: If two users use the same password this would be immediately visible because they would have the same hashes. Another issue is that you can easily lookup the cleartext for a given hash in a rainbow table. I’m sure that at least intelligence services will have huge rainbow tables.

Luckily someone came up with the idea of salted hashes. A salted hash is generated by creating a random salt for every hashing operation and appending this salt onto the cleartext. Since there must be a way to compare hashes later the salt is usually appended to the resulting hash and can be extracted from there for subsequent hashing and comparison. This makes salted hashes pretty much safe against a wide area of attacks and meets many privacy requirements.

How to deal with these salted hashes in perl?

I’ll use the salted hashes created by Dovecots dovecotpw utility as an example since these were the hashes of my concern and they aren’t to most simple ones. These hashes are created by generating a random salt, appending it to the cleartext and appending the salt to the hash.
SSHA(password, salt) = SHA(password, salt) + salt
The SHA1 hash uses 20 bytes of (binary) data for the hash. The salt is variable length and consists of binary data. This is important: The salt is not just ASCII (7-bit) or UTF-8 (variable lenght, limited value range) but uses the full eight bit of each byte to allow for maximum entropy. This is important. If you doubt it get a good book on cryptograhpy and read up on the issue of randomness, entropy and cryptanalysis. The problem here is that perl is tailored to deal with text data and numbers but not binary data. I C this would be an easy task, but perl needs special care to handle this requirements.

Generating an salted hash is pretty easy: Generate a number of valid byte values (0-254) and pack() it into a binary string, e.g.:

sub make_salt {
    my $len   = 8 + int( rand(8) );
    my @bytes = ();
    for my $i ( 1 .. $len ) {
        push( @bytes, rand(255) );
    return pack( ‘C*‘, @bytes );
However if you want to compare a user-supplied pass with the salted hash in your database you have to take some more steps. You’ll first need to retreive the old salted hash from the database, extract the salt and hash the user supplied password toegether with this salt. If you’d use another salt the resulting hashes would be different and the user would not be able to login although the passwords match.

In my implementation I did separate the code into a split_pass method that dissects the old hash and extracts the salt (and possibly the password scheme used) and a make_pass method that takes a cleartext, a password scheme and a salt to generate a hashed password. The resulting hash is them compared with the stored hash and if they match the user may login or do whatever the authorization was requested for.

The split_pass method basically strips of the password scheme stored in front of the hash between curly brackets, decodes the Base64 encoded hash, unpack()s it and packs everything after the hash again into a binary string using pack(‘C*‘,@salt). The pack() template represents a one byte char, which is what we need here.

For the actual implementation I suggest you look at the Perl Module VBoxAdm::DovecotPW distributed with VBoxAdm.

package VBoxAdm::DovecotPW;

use strict;
use warnings;

use MIME::Base64;
use Digest::MD5;
use Digest::SHA;


my %hashlen = (
    'smd5'    => 16,
    'ssha'    => 20,
    'ssha256' => 32,
    'ssha512' => 64,

# Usage      : my $hash = VBoxAdm::DovecotPW::plain_md5('pwclear');
# Purpose    : ????
# Returns    : ????
# Parameters : ????
# Throws     : no exceptions
# Comments   : none
# See Also   : http://wiki.dovecot.org/Authentication/PasswordSchemes
sub plain_md5 {
    my $pw = shift;
    return "{PLAIN-MD5}" . Digest::MD5::md5_hex($pw);

sub ldap_md5 {
    my $pw = shift;
    return "{LDAP-MD5}" . pad_base64( Digest::MD5::md5_base64($pw) );

sub smd5 {
    my $pw = shift;
    my $salt = shift || &make_salt();
    return "{SMD5}" . pad_base64( MIME::Base64::encode( Digest::MD5::md5( $pw . $salt ) . $salt, '' ) );

sub sha {
    my $pw = shift;
    return "{SHA}" . MIME::Base64::encode( Digest::SHA::sha1($pw), '' );

sub ssha {
    my $pw = shift;
    my $salt = shift || &make_salt();
    return "{SSHA}" . MIME::Base64::encode( Digest::SHA::sha1( $pw . $salt ) . $salt, '' );

sub sha256 {
    my $pw = shift;
    return "{SHA256}" . MIME::Base64::encode( Digest::SHA::sha256($pw), '' );

sub ssha256 {
    my $pw = shift;
    my $salt = shift || &make_salt();
    return "{SSHA256}" . MIME::Base64::encode( Digest::SHA::sha256( $pw . $salt ) . $salt, '' );

sub sha512 {
    my $pw = shift;
    return "{SHA512}" . MIME::Base64::encode( Digest::SHA::sha512($pw), '' );

sub ssha512 {
    my $pw = shift;
    my $salt = shift || &make_salt();
    return "{SSHA512}" . MIME::Base64::encode( Digest::SHA::sha512( $pw . $salt ) . $salt, '' );

sub make_pass {
    my $pw     = shift;
    my $scheme = shift;
    my $salt   = shift || &make_salt();
    if ( $scheme eq 'ldap_md5' ) {
        return &ldap_md5($pw);
    elsif ( $scheme eq 'plain_md5' ) {
        return &plain_md5($pw);
    elsif ( $scheme eq 'sha' ) {
        return &sha($pw);
    elsif ( $scheme eq 'sha256' ) {
        return &sha256($pw);
    elsif ( $scheme eq 'sha512' ) {
        return &sha512($pw);
    elsif ( $scheme eq 'smd5' ) {
        return &smd5( $pw, $salt );
    elsif ( $scheme eq 'ssha' ) {
        return &ssha( $pw, $salt );
    elsif ( $scheme eq 'ssha256' ) {
        return &ssha256( $pw, $salt );
    elsif ( $scheme eq 'ssha512' ) {
        return &ssha512( $pw, $salt );
    else {
        return "{CLEARTEXT}" . $pw;

sub make_salt {
    my $len   = 8 + int( rand(8) );
    my @bytes = ();
    for my $i ( 1 .. $len ) {
        push( @bytes, rand(255) );
    return pack( 'C*', @bytes );
# this method was copied from some module on CPAN, I just don't remember which one right now
sub pad_base64 {
    my $b64_digest = shift;
    while ( length($b64_digest) % 4 ) {
        $b64_digest .= '=';
    return $b64_digest;

sub verify_pass {

    # cleartext password
    my $pass = shift;

    # hashed pw from db
    my $pwentry = shift;

    my ( $pwscheme, undef, $salt ) = &split_pass($pwentry);

    my $passh = &make_pass( $pass, $pwscheme, $salt );

    if ( $pwentry eq $passh ) {
        return 1;
    else {

sub split_pass {
    my $pw       = shift;
    my $pwscheme = 'cleartext';

    # get use password scheme and remove leading block
    if ( $pw =~ s/^\{([^}]+)\}// ) {
        $pwscheme = lc($1);

        # turn - into _ so we can feed pwscheme to make_pass
        $pwscheme =~ s/-/_/g;

    # We have 3 major cases:
    # 1 - cleartext pw, return pw and empty salt
    # 2 - hashed pw, no salt
    # 3 - hashed pw with salt
    if ( !$pwscheme || $pwscheme eq 'cleartext' || $pwscheme eq 'plain' ) {
        return ( 'cleartext', $pw, '' );
    elsif ( $pwscheme =~ m/^(plain-md5|ldap-md5|md5|sha|sha256|sha512)$/i ) {
        $pw = MIME::Base64::decode($pw);
        return ( $pwscheme, $pw, '' );
    elsif ( $pwscheme =~ m/^(smd5|ssha|ssha256|ssha512)/ ) {

        # now get hashed pass and salt
        # hashlen can be computed by doing
        # $hashlen = length(Digest::*::digest('string'));
        my $hashlen = $hashlen{$pwscheme};

        # pwscheme could also specify an encoding
        # like hex or base64, but right now we assume its b64
        $pw = MIME::Base64::decode($pw);

        # unpack byte-by-byte, the hash uses the full eight bit of each byte,
        # the salt may do so, too.
        my @tmp  = unpack( 'C*', $pw );
        my $i    = 0;
        my @hash = ();

        # the salted hash has the form: $saltedhash.$salt,
        # so the first bytes (# $hashlen) are the hash, the rest
        # is the variable length salt
        while ( $i < $hashlen ) {
            push( @hash, shift(@tmp) );

        # as I've said: the rest is the salt
        my @salt = ();
        foreach my $ele (@tmp) {
            push( @salt, $ele );

        # pack it again, byte-by-byte
        my $pw   = pack( 'C' . $hashlen, @hash );
        my $salt = pack( 'C*',           @salt );

        return ( $pwscheme, $pw, $salt );
    else {

        # unknown pw scheme


30 Nov 2010, 11:58

VBoxAdm - Management-GUI for Postfix and Dovecot

Last weekend I’ve released a new web-based management GUI for Mailservers running Postfix and Dovecot. It is called VBoxAdm.

Its features:

  • All-in-one mailserver solution
  • written in Perl (despite some tiny bits of PHP for the Roundcube integration)
  • MySQL Backend
  • Sane Database schema, w/ normalized tables
  • Roundcube integration which allows users to change their vacation messages and passwords
  • ships with its own Anti-Spam Proxy (no need for AMAViS, SpamPD or others)
  • and vacation auto-responder (RFC 3834 compliant)
You can grab it directly from here or get to its page for more details and some more screenshots.

Please beware, this is ALPHA quality code. Don’t use it in production yet. Some parts of the application haven’t even been tested partly. But the code ist more or less complete so besides testing and minor fixes it is in pretty good shape.

There are still some issues on my Todo list, most important is the password issue as well as localization and the ability to export the data to CSV and/or XML.

Before anyone yells at me: The design (CSS) is a complete ripoff of Postfix.Admin, but since both apps are open source (GPL2+) and I give full credit to Postfix.Admin, I think that’ll be ok. The reason for that is that, while investigating web-based management solutions for Postfix, I stumbled over Postfix.Admin but were rather unsatisfied with some of its features (Language its written in, Database Layout). So I’ve started my own. Since I was very happy with their design and I’m pretty bad at webdesign I’ve just borrowed most of their CSS.

Trivia: Somehow the (german) Admin-Magazin wrote about it before I did. Kudos.

25 Aug 2010, 18:16

Lightning strikes

Lightning sucks. A thunderblot struck our house and toasted my dsl splitter and my router. Did you ever want to know how a splitter that has been hit by a thunderblot looks? Here are the pictures.

23 Jun 2010, 11:51

Speedport W722V - Features? We ain't need no Features!

Dear Deutsche Telekom, I’ve just got to love your great CPE products. The Speedport W722V ist a great product, a impressive piece of german engineering! It provides lots and lots of usefull features. For example you can us it as a doorstop, paperweight or to prettify your home.

But the point is: It is absolutely useless as a Internet-Router for me! It doesn’t allow incoming ICMP (Ping), it got no internal S0 (ISDN) Bus and it doesn’t allow VPN-Passthrough (GRE, Protocol 21). I even suspect it to have a severely broken QoS, but I can’t proof that right now. And this is only after a few days of playing around with this device. Not to think of what I’d find if I gave it some more time.

Die Konfiguration unserer Speedports ist auf Einfachheit getrimmt. Der Reichtum an einstellbaren Funktionen und Konfigurationsoptionen ist nicht das Ziel der Entwicklung, eher schon eine Reduktion auf das Wesentliche.
[Telekom Team @ T-Online Foren]

The quote says that they aim for simplicity and not for features, and they’re good at it. Very good. This device is so simplistic that it is basically useless for all but the most basic users.

I’ll look for a better CPE and try to return this device as soon as possible. Maybe they find somebody who can make better use of it than me.

Update: It looks like the Speedport is killing long running connections after a while (a few hours at most). I’ve heard about that one … that’s very disappointing when working over SSH.

25 Feb 2010, 20:02

Voyage Linux on an ALIX.2D13

I’ve just spent far too much time trying to install voyage linux on my new ALIX.2D13. Everything was fine, the only problem was that I did try to use GRUB and that wasn’t working. After changing to LILO it works like a charm. The problem is probably caused by a huge version gap between etch and sid. Etch has some something like 0.9x and sid 1.9x. I thought that the Voyage installer would use the shipped grub inside a chroot. Anyway, LILO works and this is fine. I have no special requirements for this box’s bootmanager. As soon as everything is set up and tested the box is going to be deployed.

The installation of voyage linux itself is covered in detail in the Getting Started guide.

Very usefull information can be found at networksoul and this chaos wiki.

I recommend picocom to connect to the serial console:

picocom –baud 38400 –flow n –databits 8 /dev/ttyUSB0
If your computer doesn’t have a serial port anymore, like mine, I recommend the LogiLink “USB2.0 to Serial Adapter” (UA0043 v.2.0). It’s cheap and works flawlessly. Another great LogiLink product I can reommend in this context is the LogiLink “USB2.0 Aluminum All-in-one Card Reader” (CR0001B v.2.0). Why I mention these two here? I find it hard to find cheap linux compatible adapters of which I know that they work on linux, so here is the information I would have like had before I bought those. The USB-Serial-Adapter is recognized as “Prolific Technology, Inc. PL2303 Serial Port”. The Card-Reader is shown as four separate drives.

30 Nov 2009, 13:41

Groupware with Kontact

Kontact, a part of the Kolab project, has some very nice Groupware features that were presented on the MK09.

Fortunately most of these are very well usable even without a Kolab server.

Unfortunately these are not so well documented (or the documentation is not very easy to find).

When trying out these features in noticed that the groupware features will only work properly (at least with Kontact from KDE 4.3) if you access your mailbox via “Disconnected IMAP”. If you fail to do so you’ll probably get an “Write access denied” error.

Please note, that Kontact is very unstable sometimes, but again, this depends heavily on the version of Kontact/KDE you use. My experience is based on KDE 4.3 from Debian unstable.

Right, it is called unstable for a reason …

12 Sep 2009, 12:36

IPv6 Revisited

I’ve been following the IPv6 development for a while now and have looked at most IPv6 stuff. Today I did take a look at the Teredo proctoll and I’m impressed how well it works. Really nice. Try out Miredo on Linux or BSD.

15 Jun 2009, 08:00

VMWare on Debian (64bit)

Since VMWare made their Server available at no cost this has risen to be an highly interesting alternative for virtualisation. Anyone can download it from their website and get serials for free. This is highly mature software and is rather easy to install. However, on 64-bit Systems there are a few caveats. If you happen to have the problem that VMWare won’t accept your serials, than you have to install the ia32-libs package. Also see the comments on this howto.

When you did successfully install VMWare, you probably want to provide your VMs with network connecitivity. There are several ways to achieve this and the approach depends on how you use your servers.

Interface Aliases: http://www.derkeiler.com/Mailing-Lists/securityfocus/focus-linux/2002-01/0094.html

Routing: Use Host-only network

iptables -t nat -A POSTROUTING -s -o eth0 -j MASQUERADE
iptables -A INPUT -i vmnet1 -s -j ACCEPT
iptables -A FORWARD -i eth0 -o vmnet1 -j ACCEPT
iptables -A FORWARD -o eth0 -i vmnet1 -j ACCEPT
iptables -t nat -I PREROUTING -p tcp -d  -i eth0 –dport  -j DNAT –to :

05 Nov 2008, 21:56


Funny OSM Map

Sometimes OpenStreetMaps can be quite funny.

20 Oct 2008, 15:51


Since I got a Fritz!Box as my Home-Router, the good old Linksys WRT54G just lay in the corner and settled dust. Is became aware of OpenWRT a long time ago, but I didn’t take the time to try it out. One reason was that I didn’t want to loose the comfortable web GUI for configuration internet access. Today I finally got the latest release of OpenWRT (Kamikaze 7.09).

The installation of the OpenWRT Firmware was quiete easy. At first I did backup my old router configuration in the Webinterface, then I did an Firmware Upgrade, also from the Webinterface. After the firmware was uploaded the router took about one or two minutes to reboot and did then respond to pings on Note: If you already have a device using the address on the network, you’d better connect the WRT54 directly to your pc.

The documentation for OpenWRT is quite scattered around the wiki. Probably the first page to look at is the page about configuring Kamikaze. One thing that confused me at frist was how I could log in to the router after the upgrade. Since OpenWRT, by default, doesn’t offer a webinterface and I couldn’t find a default password for SSH I was curios how to log in. The solution is fairly simple: Just connect via telnet, set a root password and the log in via SSH. If you want to change the ip address, go to /etc/config/network and change the address of the “br-lan” interface. You should also add a default gateway and an DNS server, in case your router isn’t going to be connected over his wan interface.

22 Aug 2008, 12:49

Test drive KDE4.1 on Debian Lenny

The Debian KDE Maintainers recently released inofficial Backports of KDE4.1 for Debian Lenny for those who didn’t wan’t to use experimental packages or wait for lenny to become stable. I was waiting for this packages for a long time. Since I’ve used KDE 4.0 at work I did want to use it at home, too. But I did not want to break my system more than absolutly necessary and I didn’t like some of the shortcoming of KDE 4.0, so I had to wait. The 4.1 release looked very promising to me and so I did decide to give it a try. Many people told me not to use KDE 4.1 but I did really like KDE 4 since my first contact. Unfortunately there are known issues with KDE 4.1 and the proprietary Nvidia drivers which I use and the compositing features of KWin only work with TwinView and not Xinerama, so I did prepare myself to some hurdles. I want to give a short report of my experiences on KDE 4.1 on Debian GNU/Linux lenny. Basically I did follow the steps described on the Backports page:

  1. Add “deb http://kde4.debian.net/ lenny main” to the sources.list.
  2. aptitude update Then I did try to “aptitude install kde4”, but as the Backports page states, this didn’t work. So I had to clean up the dependency mess (aptitude -f install) and start with the minimal kde package aptitude install kde4-minimal and then install the modules one by one. At least one of them had unmet dependencies and couldn’t be installed but I hope those will be resolved soon.

When KDE4.1 was finally installed I re-installed kdm by aptitude install kdm and logged in for the first time. The startup took a rather long time - I guess all the initial confguration files were created (or whatever).

I soon realised that the KWin/Nvidia issues were really annoying so I did look for a solution. Fortunately there were already a lot of good hints on this. While trying to fix this I did notice that my Xinerama setup was not supported and I had to switch (back) to TwinView. I don’t remeber why I did use Xinerama instead of TwinView, but I suppose it did just work back then when I set up the two monitor configuration. So as for the performance issues: Depending on the hardware you have, there are a lot of possible bug-fixes. At first you should make sure that you use a recent release of the Nvidia drivers. I did use 177.67 (BETA) from Nvidia and sticked to the tweaks from Nvidia. I put my “nvidia-settings” command in a bash script inside “.kde4/Autostart”.

Below is a list of modifications I made to my xorg.conf. Please note that these are only the modifications I made to the xorg.conf, this is no complete configuration.

After this changes I restarted the X server and made a few small modifications to the KWin settings:

The result? My KDE4.1 desktop, full compositing features enabled, is blazing fast now!

Section "ServerFlags"
Option "Xinerama" "0"
Section "Extensions"
Option "Composite" "Enable"
Section "Device"
Identifier     "nvidia0"
Driver         "nvidia"
Option      "NoLogo" "True"
BusID       "PCI:1:0:0"
Screen      0
Option "HWcursor"
Option "CursorShadow"
Option "CursorShadowAlpha" "32"
Option "CursorShadowXOffset" "3"
Option "CursorShadowYOffset" "3"
Option "AllowGLXWithComposite" "True"
Option "TwinView" "True"
Option "TwinViewOrientation" "LeftOf"
Option "MetaModes" "1280x1024,1280x1024;1280x1024;1024x768,1024x768;800x600,800x600"
Option "SecondMonitorHorizSync" "UseEdidFreqs"
Option "SecondMonitorVertRefresh" "UseEdidFreqs"
Option "RenderAccel" "true"
Option  "UseEvents" "false"
Option "TripleBuffer" "1"
Option "DamageEvents" "1"
Option "BackingStore" "1"
Option "PixmapCacheSize" "70000"
Option "OnDemandVBlankInterrupts" "true"
Section "Screen"
Identifier     "Screen0"
Device         "nvidia0"
Monitor        "monitor0"
DefaultDepth    24
SubSection     "Display"
Depth       24
Modes      "1280x1024" "1024x768" "800x600" "640x480"
Option "AddARGBGLXVisuals" "True"
Option "DisableGLXRootClipping" "True"
Option "PixmapCacheSize" "1000000"
Option "AllowSHMPixmaps" "0"
Option "AddARGBGLXVisuals" "True"

17 Jul 2008, 16:15

OpenVPN: Static IP Assignments

OpenVPN is a great VPN solution: Easy to use, flexible and stable. But it lacks documentation. When trying to assign static ip adresses to my VPN clients I felt a bit lost. The solution is to create a directory inside the OpenVPN configuration directory and put the client-dependent configuration snippets there. Lets assume this directory is called “ccd” for “Client Configuration Directory”. Then you need to add the line “client-config-dir ccd” to your server.conf.

Inside the ccd you create one file for each client you want to configure and call the file exactly as the common name from the clients certificate. In this files you can use ordinary OpenVPN configuration statements. For assigning fixed IPs you would use “ipconfig-push 10.8.0.X” if you use the suggested subnet of “”.

26 Jun 2008, 19:14

Firefox 3 keeps switching to offline mode

Since I’ve installed the final release of Firefox 3 on my Debian “lenny” system there is this annoying bug, that Firefox keeps switching to offline mode all the time, i.e. when I close it.

After some searching I found out that there are others who have the same problem and that this is a “feature” related to an application called “Network Manager”. Altough Network Manager is installed - I can’t tell why - I did never use it. So why does Firefox keeps annoying me? I don’t want to click on “File -> Work Offline” everytime I start Firefox to get access to the Internet. If you experience the same problem and wan’t to check if it is NM’s fault then run this command in a terminal and see if you get a result of “3” (which means that NM thinks you are online) or “4” (which means offline).

A developer claimed that setting “toolkit.networkmanager.disable” to true would cause Firefox to stop this behavior, I’ll try it out … Nope, doesn’t work. Only completly removing NetworkManager helps.

17 Jun 2008, 12:54

Apache: Force all Visitors to use HTTPS

When using Apache with SSL you may want to force all Visitors to use HTTPS instead of HTTP.

After configuring Apache for SSL you can achieve this by using this VirtualHost definition:

<VirtualHost <your-ip>:80>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^<strong>(</strong>.*<strong>)</strong> https://%{SERVER_NAME}/$1 [R,L]

You should have the SSL-enabled VirtualHost running on the same IP.

25 Mar 2008, 19:02

South Park Episoden im Internet

Unter South Park Studios gibt es alle bisher veröffentlichten South Park Episoden in voller Länge als Streams. Legal und kostenlos.

19 Mar 2008, 20:07

FRITZ!Box Reconnect

Manchmal möchte man vielleicht seine Internetverbindung kurz trennen und wieder aufbauen um z.B. eine neue IP-Adresse zu erhalten. Wenn man eine FRITZ!Box verwendet ist das zumindest nicht über die Oberfläche möglich.

Es gibt verschiedene Methoden. Unter anderem über UPnP, wenn man diese Funktion nicht deaktiviert hat, oder über telnet.

Da ich aus Sicherheitsgründen bei mir die UPnP Fernwartungsfunktionen dekativiert habe, habe ich es heute mal über telnet versucht.

Zunächst muss man den Telnet Dämon starten. Das geht mit einer halbwegs aktuellen Firmware Version über folgende Telefoncodes:

#967 - Telnet anschalten

#968 - Telnet ausschalten

Einfach an einem Telefon eingeben das mit der FRITZ!Box verbunden ist und über die Kommandozeile “telnet fritz.box” aufrufen. Dann noch das Passwort der Weboberfläche eingeben und man ist verbunden.

Um die Verbindung zu trennen ruft man dann

dsld -s

auf um den DSL Dämon zu stoppen und kurz danach


um ihn wieder zu starten.

Fertig, jetzt sollte die FRITZ!Box neu verbunden sein. Ich gebe zu, dass der Weg etwas umständlich ist, aber mir reicht es.

14 Mar 2008, 12:00

FRITZ!Box mit IPv6

Nachdem mir IPv6 schon eine ganze Weile am Herzen liegt weil ich mir damit ein Ende der leidigen NATs und mehr Adressen für SSL-Mass-Hosting verspreche und es auch schon einige Provider mit nativen IPv6 Verbindungen - auch DSL-Provider - gibt, habe ich mal beim Hersteller des wohl bekanntesten Consumer Routers, AVM, nachgefragt wie es eigentlich mit IPv6 Unterstützung für deren Flagschiff, die FRITZ!Box, aussieht.

Wenn ich die Antwort richtig interpretiere ist zwar noch nichts geplant, aber man hat mir versprochen den Vorschlag an den zuständigen “Produktmanager” weiter zu leiten. Was das bedeutet kann ich nicht sagen, aber da es keine Änderungen in der Hardware erfordern würde kann man zumindest darauf hoffen, dass es irgendwann in der nahen Zukunft umgesetzt wird.

13 Mar 2008, 17:02

Google über IPv6

Seit kurzem ist Google unter der Adresse ipv6.google.com bzw. 2001:4860:0:2001::6 auch über IPv6 erreichbar. Yeah!

Wird auch langsam Zeit.

27 Feb 2008, 10:07

TD im Browser

Lust auf eine kleine Runde Tower Defense? Mit Vector TD 2 gibts ein spannendes und anspruchsvolles TD für den Browser.

22 Feb 2008, 12:23

John Cleese's Letter to America

Lange nicht mehr so gelacht. Humor haben sie ja die Engländer.

Insbesondere #10 hat mir gut gefallen:

10. All American cars are hereby banned. They are crap and this is for your own good. When we show you German cars, you will understand what we mean.
John Cleese’s Letter to America

14 Feb 2008, 13:09

Warum ist Ruby on Rails so langsam?

Ruby on Rails ist die erfolgreiche Kombination einer fantastischen Progammiersprache mit einem genialen Framework. Es gibt aber ein großes Problem: RoR ist manchmal verdammt langsam.

Wer schonmal ein paar PDFs mit RoR erzeugt hat weiß was ich meine. Das ist deutlich, sehr deutlich, langsamer als z.B. PHP oder Java - und die sind selbst nicht die allerschnellsten.

Die Guerrillas von Nimble Method versuchen abhilfe zu schaffen und RoR zu beschleunigen.

14 Feb 2008, 10:08

Warum tauchen meine Bilder nicht in der Bildersuche auf?

Ich hatte eine Weile das Problem, dass meine Bilder nicht in den Bildersuchen von Google, Yahoo, etc. vertreten waren. Das Problem war einfach, dass ich die Bilder zwar sehr Benutzerfreundlich in einen HTML-Container verpackt hatte, aber dass in diesem Container leider gar kein Text stand und die Sumas so keinerlei Keywords zuordnen konnten.

Daher sollte man sich merken, wenn man will, dass die eigenen Bilder gefunden werden, folgende Richlinien zu befolgen:

  • Aussagekräftier Dateiname
  • Alt und Title Attribute des img-Tags ausfüllen
  • Das Bild, am besten in Originalgröße, direkt, d.h. im selben HTML-Container (div, …) wie den Text der sich auf das Bild bezieht zu platzieren
Eigentlich nichts neues, aber manchmal übersieht man auch offensichtliche Dinge.

11 Feb 2008, 18:43

Objekte freistellen in GIMP

Fotos sind was feines, aber ganz besonders praktisch sind Bilder deren Objekte freigestellt sind, da man diese Problemlos in eigene Bilder oder Anwendungen übernehmen kann. Um Objekte eines Bildes frei zu stellen gibt es diverse Möglichkeiten und reichlich Anleitungen, insb. für Photoshop. Oftmals sind diese Techniken auch mit GIMP anwendbar, aber für einen Laien wie mich erschließt sich nicht immer die äquivalente GIMP Funktion zu dem Photoshop Pendant. Selbst so manches GIMP Tutorial ist für mich nicht gänzlich verständlich, daher möchte ich hier eine Methode aufzeigen die bei mir gut funktioniert hat. Ich muss noch anmerken, dass ich in Bezug auf Photographie und Bildbearbeitung ein absoluter Laie bin und nehme daher gerne konstruktive Kritik in den Kommentaren entgeben.

Hier die Schritt-für-Schritt Anleitung von Objekten mit GIMP 2.4+. Eine wichtige Vorraussetzung ist, dass das Objekt vor einem möglichst homogenen Hintergrund, am besten weißes Papier, mit gleichmäßiger Ausleuchtung aufgenommen wurde. Bei anderen Szenen empfehle ich eher die Hochpass-Methode oder evtl. auch SIOX/Vordergrundauswahl.

  • Das Bild öffnen
  • Freistellen - Ausgangsbild
  • Den Hintergrund mit dem Zauberstab markieren. Ggf. die Selektion mit den Maskenwerkzeugen und Shift (+) bzw. Strg (-) korrigieren
  • Freistellen - Maskieren
  • Freistellen - Maskieren 2
  • Einen Rechtsklick auf den Hintergrund, “Alphakanal hinzufügen” auswählen
  • Freistellen - Ebenenmaske
  • Noch einen Rechtsklick auf den HG, “Ebenenmaske hinzufügen” und dann “Weiß (volle Deckkraft)” auswählen
  • Freistellen - Ebenenmaske 2
  • Mit dem Füllwerkzeug den Inhalt der Maske schwarz füllen, ggf. von Hand nachbearbeiten.
  • Filter -> Weichzeichnen -> Bewegungsunschärfe mit Weizeichnungsart “Zoom” und 5-10 Einheiten Länge oder Gaußscher Weichzeichner mit 50 Pixel Radius ausführen
  • Freistellen - Gauss
  • Auswahl entfernen
  • Eine neue Ebene einfügen, mit beliebiger Farbe füllen und hinter den HG schieben
  • Freistellen - Endprodukt

07 Feb 2008, 23:15

AIM, ICQ und MSN mit Jabber Unterstützung

So wie es aussieht bahnt sich eine breite Unterstützung für Jabber von Seiten der propitären Messenger-Firmen an.

Im Beitrag zu MSN ist zwar nur die Rede von “GTalk”, aber da Google Talk ja vollkommen auf Jabber aufbaut bedeutet das anscheinend eine mögliche Jabber Unterstützung für den MSN Messenger.

Das wäre fast zu schön um wahr zu sein, wenn ich endlich keine Multi-Protkol-Clients mehr bräuchte um mit dem ganzen ICQ Nutzern zu kommunizieren.

06 Feb 2008, 06:00

htaccess Dateien im Browser erstellen

Auf der Seite .htaccess Editor ist es ganz einfach möglich .htaccess Dateien für den Apache Webserver Online zu erstellen.

22 Jan 2008, 10:49

Email Adresse in PHP validieren

if(!pregmatch(“/^[A-Z0-9.%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}$/i”,$email)) { return true; }

Quelle: How to find or validate Email Adress 

21 Jan 2008, 18:08

Yacy - Verteilte Websuche

Durch einen Artikel in der iX bin ich mal wieder auf die verteilte Websuche Yacy aufmerksam geworden.

Nachdem ich letztes Jahr selbst etwas ähnliches implementiert habe, und durch die erdrückende Marktmacht von Google motiviert habe ich mich entschlossen Testweise selbst als Peer am Yacy Suchnetzwerk teilzunehmen.

Die Installation ist erfreulich einfach:

Das wars. Einfacher gehts wirklich nicht. Dann noch schnell im Webinterface ein Passwort vergeben und schon kann die Suche losgehen.

Wer anderen Peers Zugriff auf den eigenen Index gewähren will, der sollte noch Port 8080 in der Firewall (Router, etc.) freischalten.

Yacy macht wirklich einen guten Eindruck. Mal sehen, wenn sich der Client als stabil erweist lasse ich ihn vielleicht in Zukunft auf einem Root-Server laufen.

15 Jan 2008, 10:18

Scaffoldr 2.0

Wer bei PHP/MySQL Projekten die CRUD Seiten fürs Backend nicht dauernd von Hand bauen will und keine Lust hat sich in ein riesiges Framework einzuarbeiten der sollte sich mal meinen CRUD Code Generator Scaffoldr anschauen.

Das ist ein Template basiertes PHP Script das die CRUD Seiten für eine komplette Datenbank innerhalb weniger Sekunden erstellt. Inkl. differenzierter Behandlung der einzelnen Feld-Datentypen, sortierbaren Spalten sowie “Pageination”.

Ich benutze das oft als Basis für das Administrationsbackend von Webprojekten. Für ein Benutzer-Frontend ist es dagegen weniger geeignet, da weitgehend auf Sicherheitsüberprüfungen verzichtet wird. Daher vorsicht vor SQL-Injection Attacken wenn man nicht vertrauenswürdige Benutzer ran lässt.

07 Jan 2008, 12:34

Datenschutz-Pannen durch frei zugängliche Zugrifsstatistiken

Mit Google lassen sich immer mal wieder interessant Entdeckungen machen.

Sucht man z.B. nach einem User-Agent String (aus einem HTTP-Header) finden man eine ganze Reihe von frei zugänglichen Zugrifsstatistiken. Na wenn das nicht mal Datenschutz par excellence ist.

18 Dec 2007, 19:36

Neue Firmware für FRITZ!Box 7170

Jetzt wo die neuen 7270 fertig ist, gibt AVM endlich die finale Version der neuen Firmeware, bisher nur als Laborversion erhältlich, raus.

Anscheinend steht auch schon eine Firmeware mit der Möglichkeit zum Faxempfang bereit. Das klingt doch sehr gut :)

06 Dec 2007, 12:31

FRITZ!Box Fon Wlan 7270 ab sofort im Handel verfügbar!

Wie AVM sobeben mitgeteilt hat ist die neue, lange erwartete, FRITZ!Box Fon Wlan 7270 ab sofort im Handel verfügbar!

Die neue FRITZ!Box Fon WLAN 7270 des Berliner Kommunikationsspezialisten AVM ist ab sofort im Handel erhältlich. Das neue FRITZ!Box-Modell bietet in einem einzigen Gerät eine bisher nicht erreichte Vielfalt für den DSL-Anschluss. Der neue WLAN-Funkstandard IEEE 802.11n (Draft 2.0) sorgt in Verbindung mit der MIMO-Mehrantennentechnik für eine optimale Übertragung von Daten, Sprache und Filmen. Für Internet- und Festnetztelefonie bietet die FRITZ!Box Fon WLAN 7270 neben Anschlüssen für analoge und ISDN-Telefone erstmals eine integrierte DECT-Basisstation. Über den Medienserver ist gespeicherte Musik auch bei ausgeschaltetem Computer im gesamten Netzwerk verfügbar. So wird die FRITZ!Box Fon WLAN 7270 mehr denn je zur zentralen Datendrehscheibe für den heimischen Internetzugang.
[AVM Pressemitteilung]

Bis jetzt konnte ich noch keinen Shop finden, der dieses Modell als Lieferbar listet, aber der Preis liegt so um die 200€.

Ich bin gespannt wie erfolgreich das neue AVM Flagschiff sein wird, denn trotz des überwältigenden Funktionsumfangs ist sie doch deutlich teurer als viele vergleichbare Produkte.

Sollte bei mir in nächster Zeit ein Router-Neukauf anstehen, würde ich mich für die FRITZ!Box 7270 entscheiden. Wobei mir wichtig wäre, dass sich neben dem WLAN auch das DECT-Modul deaktivieren lässt um die Strahlenbelastung zu reduzieren.

01 Dec 2007, 15:49

Hotspot und Firewall Piercing

Nachdem ich darauf aufmerksam geworden bin, dass es bei vielen öffentlichen Hotspots wohl eine Lücke gibt, des ermöglicht kostenlos zu surfen, habe ich zu diesem Thema ein paar Informationen gesammelt.

Zunächst aber eine Warnung: Wenn man diesen Anleitungen folgt kann das möglicherweise rechtliche Kosquenzen haben, daher rate ich davon ab die beschriebenen Vorgehensweisen ohne die Einwilligung des Zugangsproviders zu testen. <!–01695360–>

Als erstes würde ich eine allgemeine Präsentation zum Thema Firwall Piercing empfehlen. Dort werden auch schon die ersten Möglichkeiten aufgezeigt eine Firewall - und nichts anderes wird auch von einem Hotspot verwendet um den Zugang zu kontrollieren - zu umgehen. Interessant sind insbesondere die Punkte Ping-Tunnel und DNS-Tunnel. Da auf vielen Hotspots entweder ICMP Nachrichten und/oder Port 65/UDP für DNS-Auflösungen geöffnet sind, werden diese Tunnel sehr interessant. Aber auch wenn der Port 65 geschlossen ist, und nur ein DNS-Server des Hotspot-Betreibers zur Verfügung steht ist es noch möglich dies auszunutzen, da man mit einem NSTX Tunnel die Datenpakete auch durch einen fremden DNS Server tunneln kann. Wenn der Port 65/UDP direkt offen ist, dann ist es am einfachsten einen OpenVPN-Server auf Port 65 lauschen zu lassen und diesen als Gateway zu benutzen.

27 Nov 2007, 21:51

Dovecot's Deliver zum Schweigen bringen

Seit ich Dovecots deliver als LDA/MDA zusammen mit exim verwende habe ich das Problem gehabt, dass deliver im syslog immer die Passwörter der Mail-Benutzer ausgegeben hat, was natürlich weder erwünscht noch sinnvoll ist. Ich habe lange Zeit keine Lösung gefunden, da meine Konfiguration eigentlich korrekt war, aber heute hat mir Tim Sirrainen, der Autor von Dovecot eine Lösung aufgezeigt.

Example from delivers logfile:

deliver(user@host.tld): "2007-11-26 19:37:40 "Info: auth input: user@host.tld
deliver(user@host.tld): "2007-11-26 19:37:40 "Info: auth input: user=user@host.tld
deliver(user@host.tld): "2007-11-26 19:37:40 "Info: auth input: password=password
deliver(user@host.tld): "2007-11-26 19:37:40 "Info: auth input: home=/home/mail/host.tld/user
deliver(user@host.tld): "2007-11-26 19:37:40 "Info: auth input: uid=8
deliver(user@host.tld): "2007-11-26 19:37:40 "Info: auth input: gid=8
deliver(user@host.tld): "2007-11-26 19:37:40 "Info: Loading modules from directory: /usr/lib/dovecot/modules/lda
deliver(user@host.tld): "2007-11-26 19:37:40 "Info: Module loaded: /usr/lib/dovecot/modules/lda/lib90_cmusieve_plugin.so
deliver(user@host.tld): "2007-11-26 19:37:40 "Info: maildir: data=/home/mail/host.tld/user/Maildir
deliver(user@host.tld): "2007-11-26 19:37:40 "Info: maildir: root=/home/mail/host.tld/user/Maildir, index=/home/mail/host.tld/user/Maildir, control=, inbox=
deliver(user@host.tld): "2007-11-26 19:37:40 "Info: cmusieve: Using sieve path: /home/mail/host.tld/user/.dovecot.sieve
deliver(user@host.tld): "2007-11-26 19:37:42 "Info: msgid=&lt;49403.;: saved mail to dovecot

Das Problem war ein Bug in Dovecot/deliver der dafür sorgte, dass die Zeile

mail_debug = no

nicht richtig ausgewertet wurde. Die Lösung war die betreffende Zeile auszukommentieren.

Hier noch meine Konfiguration vor der Korrektur.

Dovecot.conf w/o comments:

base_dir = /var/run/dovecot/
protocols = imap imaps pop3 pop3s
disable_plaintext_auth = no
shutdown_clients = yes
log_path = /var/log/dovecot.log
log_timestamp = "%Y-%m-%d %H:%M:%S "
ssl_disable = no
ssl_cert_file = /etc/ssl/certs/cert.crt
ssl_key_file = /etc/ssl/certs/key.pem
ssl_parameters_regenerate = 168
ssl_cipher_list = ALL:!LOW
login_dir = /var/run/dovecot/login
login_chroot = yes
login_user = dovecot
login_process_size = 32
login_process_per_connection = yes
login_processes_count = 3
login_max_processes_count = 128
login_max_connections = 256
login_greeting = Mailserver (powered by Dovecot) ready.
mail_location = maildir:/mail/%d/%n/Maildir
namespace private {
separator =
prefix =
location =
inbox = yes
mail_extra_groups = mail
mail_debug = no
first_valid_uid = 8
last_valid_uid = 8
max_mail_processes = 1024
mail_process_size = 256
mail_max_keyword_length = 50
umask = 0077
mbox_read_locks = fcntl
mbox_write_locks = dotlock fcntl
mbox_dotlock_change_timeout = 120
protocol imap {
imap_max_line_length = 65536
login_greeting_capability = yes

protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
protocol lda {
postmaster_address = postmaster@host.tld
mail_plugin_dir = /usr/lib/dovecot/modules/lda
sendmail_path = /usr/lib/sendmail
auth_socket_path = /var/run/dovecot/auth-master
mail_plugins = cmusieve
auth_process_size = 256
auth_cache_size = 256
auth_cache_ttl = 3600
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
auth_verbose = no
auth_debug = no
auth_debug_passwords = no
auth default {
mechanisms = plain
passdb pam {
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
userdb passwd {
userdb prefetch {
userdb sql {
args = /etc/dovecot/dovecot-sql.conf
user = root
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
client {
path = /var/run/dovecot/auth-client
mode = 0600
user = mail
group = mail
dict {
plugin {

25 Nov 2007, 14:33

Haltestellenaushangfahrpläne des RMV

Tipp: Spart viel Zeit und Nerven.

22 Nov 2007, 12:12

Safari unter Windows

Nachdem es Apples Webbrowser Safari nun schon eine Weile für Windows gibt wollte ich ihn jetzt auch mal ausprobieren.Im klassischen Apple Design gehalten, bin ich die ganze Zeit irritiert da unter Windows so sonst nur iTunes aussieht.Er wirkt etwas langsamer als Firefox und Opera, aber gemessen habe ich das nicht.Gleich beim ersten Start hat er sich allerdings kommentarlos verabschiedet.Um ab und zu mal Webseiten auf die Darstellung zu überprüfen ist er ok, aber dauerhaft damit arbeiten will ich zur Zeit (noch) nicht. 

21 Nov 2007, 06:00

Testbericht: Netgear GS108T Managed Gbit-Switch

Da es mit meinem bisherigen “Switch Ersatz” (Linksys WRT54G) hin und wieder Probleme gab und ich den Router eigentlich als Open/FreeWRT Testplattform verwenden wollte, wurde es Zeit für einen adäquaten Ersatz. Natürlich GBit. Am besten “managed”. Leider waren die Geräte mit Web-Interface bis vor kurzem nicht bezahlbar, und in Ausführungen mit wenigen Ports (< 16) auch gar nicht verfügbar.

Jetzt hat Netgear aber vor kurzem einen sog. “Smart Switch” herausgebracht. Den GS108T. Mit seinem halbwegs moderaten Preis war mir sofort klar, dass das etwas für mich sein könnte.

Nachdem ich einige Zeit darauf warten musste bis ich einen Shop gefunden habe der diesen Switch auf Lager hat, ist mein Paket von Avitos jetzt endlich da.

Der Switch macht einen guten Eindruck, wobei natürlich nur die inneren Werte wirklich zählen. Die ersten Durchsatzmessungen stimmen mich sehr zuversichtlich. Demnächst werde ich die VLAN und QoS Features gründlich testen und dann nochmal darauf zurück kommen.

Netgear GS108T - Auspacken (I) Das Paket ist ziemlich schwer, ca. 2KG. Netgear GS108T - Auspacken (II) Der Pakungsinhalt bietet relativ wenige Überraschungen, das Übliche halt … Netgear GS108T - Netzteile Aber hey, was ist das: Zwei Netzteile? Hat der Switch etwa eine redundate Stromversorgung? Nein, da ist nur ein Anschluss für ein Netzteil, aber das zweite Netzteil hat auch einen UK-Stecker. Der erste Gedanke war so etwa “WTF?”, aber da war es wohl billiger eine EU-Version zu machen anstatt zwei getrennte Modellreihen zu produzieren.

Netgear GS108T - Webinterface

Der Funktionsumfang ist für einen Switch der SOHO/Consumer-Klasse sowieso extrem reichhaltig und geht von Gbit, über VLAN, QoS bis hin zu Port-based RADIUS Authentifizierung.

Die Features im einzelnen:

  • Webinterface
  • IP/Subnetz/Mac ACL
  • RADIUS Client für Port-basierte Authentification
  • NTP-Client
  • LLDP
  • Logging (Local Ram, Flash oder Remote via Syslog)
  • Konfiguration pro Port möglich, inkl. Priorität und Geschwindigkeit
  • QoS
  • VLANs
  • Link Aggregation
  • Monitor/Sniffer Unterstützung (Konfigurierbarer Monitor Port)
  • Jumbo Frames
  • Rate Limiting
  • Storm Control
  • RSTP (Rapid-Spanning-Tree-Protocol)
  • SNMP
Im Moment bin ich dabei die SNMP-Unterstützung unter die Lupe zu nehmen und zur Überwachung des Switches zu nutzen.

14 Nov 2007, 08:59

Google AdSense Zeitzone

Wer zu den Nutzern von AdSense gehört, der hat sich sicher schon manchmal gefragt wie die Angaben “Heute”, “Gestern”, etc. zu verstehen sind, da die Werte oftmals nicht zu stimmen scheinen. Die Vermutung liegt nahe, dass AdSense nicht die lokale Zeitzone des Benutzers verwendet sondern eher eine der US-Zeitzonen.

Auf einem Blog habe ich einen Hinweis dazu gefunden, die von AdSense verwendete Zeitzone liegt wohl -7 Stunden, relativ zur MEZ.

Das würde sich auch mit meinen Vermutungen und Beobachtungen decken.

Update: Ich habe nochmal nachgerechtnet und halte eher -8 bis -9 Stunden für wahrscheinlich, anyway das ist etwa die Größenordnung mit der man rechnen muss. Wäre aber schon nett wenn Google anzeigen würde in welcher Zeitzone sich die “Google-Master-Clock” befinden.

13 Nov 2007, 07:00

Tipps für den Domain Umzug

In der Regel wird man versuchen einen Wechsel der Domain bei einer erfolgreichen Seite zu vermeiden, aber manchmal hat man keine andere Wahl oder es gibt gute Gründe die für einen Wechsel der Domain sprechen. Die nächste Frage ist dann natürlich wie man den Umzug gestaltet ohne Besucher oder Platzierungen in den Suchmaschinen zu riskieren.

Es gibt dazu zwar einige Informationen im Netz, aber ich möchte hier meine ganz persönlichen Erfahrungen dazu schildern.

  • Zunächst sollte man sich natürlich die Domain seiner Wahl registrieren. Am besten unabhängig vom Hosting-Provider bei einem externen Dienstleister.
  • Danach sollte man die neuen Domain zu seinem Portofolio bei den Google Webmaster Tools hinzufügen, authentifizieren sowie eine Sitemap erstellen und dort bekannt machen. Dann sollte man noch die “Bevorzugte Domain” angeben um Inkonsistenzen in den SERPs und “Duplicate Content” zu vermeiden.
  • Jetzt ist es an der Zeit die eigentlichen Inhalte umzuziehen und ausgiebig zu testen. Dies variiert je nach Front- und Backend. Ach ja, robots.txt nicht vergessen!
  • Sofern man Google Analytics verwendet, sollte man dieses auch anpassen. D.h. dort die Domain und den Namen des Profils ändern.
  • Möglicherweise muss man die neue Domain noch für AdSense authentifizieren.
  • Sobald diese Vorarbeiten erledigt sind kann man auf der alten Seite eine permanente Weiterleitung auf die neue einrichten. Dazu verwendet man am besten URL-Rewriting, bei Apache Webservern mit mod_rewrite, und den unten aufgeführten Code.
  • Nachdem nun auch die Umleitung funktioniert darf man sich jetzt daran machen möglichst viele der existierenden Backlinks umzubiegen bzw. neu zu erstellen.
  • Wenn man FeedBurner verwendet sollte man diesen ebenfalls anpassen.
  • Und zum Schluss das wichtigste: Geduld! Bis der Umzug bei allen Suchmaschinen angekommen ist vergehen in der Regel 1-3 Monate, bis der PageRank aktualisiert wird sogar bis zu 6 Monate. Aber keine Sorge, intern aktualisiert Google den PageRank deutlich häufiger. Nur sichtbar wird er eben erst nach diese Zeit. Wenn man auf seiner Seite Paid-Links schaltet könnte das ein Problem sein, aber nach den jüngsten PageRank Kapriolen dürfte das kaum noch ein Thema mehr sein.
Wie richte ich (mit Apache mod_rewrite) eine permanente (301) HTTP-Weiterleitung für eine ganze Domain ein?

Dazu legt man einfach im Wurzelverzeichnis der “alten” Domain eine Datei mit dem Namen “.htaccess” und dem folgenden Inhalt an.

RewriteEngine on RewriteCond %{HTTP_HOST} ^www.altedomain.tld$ [NC] RewriteRule ^(.*) http://www.neuedomain.tld/$1 [L,R=301]

Sollte der Server dann beim aufrufen der alten Domain ein Fehlermeldung bringen (Internal Server Error, o.ä.) dann ist Mod_Rewrite nicht aktiviert und man muss sich an seinen Hoster wenden. Im Erfolgsfall sollte man direkt zur neuen Domain geleitet werden.

Update I (14.11.07): Nach nur 24h hat Google fast alle Seiten unter der neuen Domain im Index.

Update II (20.11.07): So langsam hat die neue Domain die alte aus der SERPs verdrängt und es zeichnet sich ein deutlicher Knick in den Besucherzahlen ab. Ich mache jedoch den Domainumzug und den damit verbundenen PageRank-Verlust dafür verantwortlich und bin mir sicher, dass sich das in den nächste Tagen oder Wochen wieder normalisieren wird.


Update (17.04.08): Googles Webmaster Blog hat noch weitergehende Informationen.

12 Nov 2007, 15:07

Apache: Server-Signatur verstecken

Obwohl ich kein Fan von “Security-by-Obscurity” bin muss ich trotzdem nicht alle Versionsinformationen meines Webservers und der geladenen Module für alle Welt sichtbar machen.

Um die Server Signatur zu manipulieren gibt es hauptsächlich zwei Direktiven die beide im gloablen Kontext gesetzt werden sollten:

  • ServerSignature On|Off|EMail - Damit lässt sich die Signatur komplett abschalten.
  • ServerTokens Minimal|ProductOnly|OS|Full - Ich habe hier “ProductOnly” gewählt, damit zumindest noch angezeigt wird, dass es sich um einen Apache handelt, aber die Version verdeckt wird.

03 Nov 2007, 07:30

SSH-Login mit PublicKeys

Im Normalfall wird man sich an einem SSH-Server mit seinem Benutzernamen und Passwort authentifizieren. Wenn man aber das Passwort nicht immer eintippen möchte, z.B. weil man CVS über SSH benutzt, oder sich oft anmelden muss, dann kann es Sinn machen die Public-Key Anmeldung einzurichten.

Dazu benötigt man zuerst ein Public/Private-Key Pair und, unter Windows, PuTTy mit PuTTy Agent und PuTTyGen.


Unter Linux ist das erzeugen das Schlüsselpaares ganz einfach:

ssh-keygen -t rsa

Dann liegt der öffentliche Schlüssel unter ~/.ssh/id_rsa.pub. Diese kopiert man dann mit scp auf die Maschine an der man sich ohne Passwort anmelden möchte:

scp ~/.ssh/id_rsa.pub user@host.domain.tld:~/id_rsa.pub

Nun muss man sich noch einmal mit seinem Passwort an diese Maschine anmelden und dann dort folgenden Befehl ausführen:

cat id_rsa.pub >> ~/.ssh/authorized_keys

Fertig. Aber jetzt sollte man sich auch ohne sein Passwort eingeben zu müssen an dem Rechner anmelden können.


Unter Windows ist das Vorgehen ein kleines bischen komplizierter, aber nicht minder effektiv.

Zunächst einmal muss man sich PuTTy besorgen. Das komplette Archiv mit allen Hilfsprogrammen und dieses irgendwo entpacken.

Danach geht es wie folgt weiter:

  1. PuttyGen” starten.PuTTyGen Howto
  2. Im Bereich “Parameters” “SSH-2 RSA” auswählen.
  3. Im Bereich “Actions” auf “Generate” klicken.
  4. Die Maus über den leeren Bereich bewegen bis der Balken voll ist. Damit sammelt der Schlüsselgenerator zusätzliche Zufallsdaten.
  5. Auf Wunsch noch einen Kommentar zu dem Schlüssel in das Feld “Key comment” eintragen.
  6. Unter “Key passphrase” und “Confirm passphrase” ein Passwort eintragen mit dem der Schlüssel geschützt wird. Dieses muss beim ersten Zugriff auf den Schlüssel eingegeben werden.
  7. Mit “Save private Key” den privaten Schüssel abspeichern, und an einem sicher Ort aufbewahren. Wichtig ist es, ihn nie weiterzugeben!
  8. Mit “Save public Key” den öffentlischen Schlüssel an einem beliebigen Ort speichern. Dieses Schlüssel kann man an jeden weitergeben oder sogar auf die eigene Webseite stellen.
  9. Bevor man PuTTyGen beendet den öffentlichen Schlüssel aus dem Textfeld kopieren (Zwischenablage).
  10. Per PuTTy ganz normal auf dem entfernten Rechner einloggen und die Datei ~/.ssh/authorized_keys bearbeiten. Dort einfach in eine neue Zeile den öffentlichen Schlüssel aus der Zwischenablage einfügen. Abspeichern und wieder vom entfernten System abmelden.
  11. Jetzt muss man den Schüssel noch in den PuTTy Agent importieren. Dazu startet man “Pageant” und klickt doppelt auf das Icon mit dem Hut in der Kommandozeile. Pageant Icon
  12. Dort klickt man auf “Add Key” und wählt den eben gespeicherten Private-Key aus. Nachdem man noch einmal das Passwort des Private-Key eingegeben hat sollte man sich ohne weiter Passwort-Eingaben zum Server verbinden können.
Pageant Add Key

21 Oct 2007, 07:30

P2P Wiki in Java

Unter dem Namen jP2PWiki habe ich eine Beispielimplementierung eines P2P Wikis in Java veröffentlicht.

Das ganze ist nicht als stabile Software sondern eher als Proof-of-Concept anzusehen, aber möglicherweise hat der eine oder andere Interesse an dieser Thematik.

Alle weiteren Details finden sich auf der Projektseite.

20 Oct 2007, 08:00

No Spam!

Gestern bin ich durch eine Anzeige auf das Buch “No Spam! Besser vorbeugen als heilen” von Tobias Eggendorfer aufmerksam geworden.

In der Anzeige wurden unter andem die folgenden Punkt angeführt:

  • Woher haben Spammer die Adressen?
  • Grundlegende Vorsichtsmaßnahmen
  • eMail Adressen verstecken
  • Harvester blockieren
  • Absichern von Mailinglisten und Newslettern
Wenn ich das Inhaltsverzeichnis so lese, fage ich mich ernsthaft warum man dieses Thema auf ca. 160 Seiten aufblähen muss, und warum man dazu ein ganzes Buch verfasst. Die angesprochenen Punkt lassen sich eigentlich in ein paar Zeilen zusammenfassen, und genau das werde ich hier versuchen.

Was ist Spam?

Der Begriff Spam stammt aus einem Monty Python Sketch und ist die Umgangssprachliche Bezichnung für UCE/UCB was für “Unsolicited Commercial E-mail” bzw. “Unsolicited Commercial Bulk E-mail” steht. Gemeint sind damit unerwünschte Nachrichten die in großem Umfang an eine Vielzahl von Benutzern verschickt wird. Ein weiteres Merkmal von Spam ist, dass in der Regel keine (bewusste) Anmeldung/Einwilligung zum Empfang desselben erfolgte.

Woher haben Spammer die Adressen?

Wer eine möglichst große Anzahl an Personen im Internet erreichen will, kommt über kurz oder lang vielleicht auf die blöde Idee einfach Massenhaft Mails mit Werbung zu verschicken. Doch woher bekommt man die ganzen Adressen? Dafür gibt es ein paar Möglichkeiten. Der naivste Ansatz ist die Brute-Force Methode, d.h. einfach einen Mailserver kontaktieren und alle möglichen Kombinationen von zulässigen Zeichen als Emfänger auszuprobieren. Dies ist natürlich sehr Zeit- und Resourcen intensiv und führt wahrscheinlich bei den meisten Mailservern dazu, dass der sendende Host komplett ausgesperrt wird.

Ein besserer Ansatz, für den Spammer, ist es im Internet nach echten Adressen zu suchen. Dazu werden, ähnlich wie bei Suchmaschinen, sogenannte Spider bzw. Harvester eingesetzt, die von einer Seite aus starten und dann jedem ausgehnden Link folgen und alle Mail-Adressen, erkennbar an dem “mailto:” Prefix, in einer Datenbank speichern. Hier ist auch gleich der erste Ansatz den Spammern die Tour zu vermiesen: Die eigenen eMails verschleiern. Dazu gibt es mehrere Möglichkeiten, aber dazu später mehr.

Grundlegende Vorsichtsmaßnahmen

Hier lautet die oberste Devise: Datensparsamkeit. Man sollte generell möglichst sparsam mit seinen Daten, in diesem Fall der Mail-Adresse, umgehen. Wenn man jedoch seine Adresse seine eigene Adresse veröffentlichen muss, der sollte sicher Gedanken darüber machen wie er diese für Harvester unbrauchbar macht.

Dafür gibt es verschiedene Möglichkeiten:

  • eMail Adresse verschleiern/verstecken
  • einmal Adressen, d.h. eine Adresse pro Nutzungszweck
  • ablaufende Adressen
Auf die einzelnen Punkte gehe ich gleich nochmal ein.

eMail Adresse verstecken

Wenn man seine Adresse für Menschen zugänglich machen will, oder muss, Stichwort Impressumspflicht, dann sollte man diese entweder durch Ersetzungen unkenntlich machen, z.B. info@gauner.org wird zu into_AT_gauner_DOT_org, wobei es hier auch die Möglichkeit gibt, dass Spammer diese Ersetzungen einfach enttarnen können. Eine weiter Möglichkeit ist es die ganze Adresse, oder einen Teil davon, durch Grafiken zu ersetzen. Eine dritte Möglichkeit ist den “mailto:info@gauner.org” Teil durch eine Javascript Funktion zu ersetzen die beim anklicken die richtige Adresse erzeugt.

Einmal Adressen

Eine gute Möglichkeit die Menge des eingehenden Spams zu steuern und zu kontrollieren woher der Spam kommt ist das verwenden von sog. einmal Adressen. Hierbei legt man für jeden Verwendungszweck, z.B. Registrierung in einem Forum oder Blog, eine eigene Adresse wie z.B. gauner-blog@xy.host.tld an und leitet diese auf seine eigentliche Adresse weiter. Wenn man jetzt einmal Spam erhällt kann man anhand der Empfänger-Adresse einfach feststellen wie der Spammer an die Adresse gekommen ist. Jetzt kann man jederzeit diese Adresse zu löschen und man wird auf diesem Weg keinen Spam mehr erhalten. Der Nachteil hierbei ist, dass man eine ziemlich große Zahl an Weiterleitungen anlegen muss und einen Provider benötigt der dies unterstützt.

Ablaufende Adressen

Es ist auch möglich einfach Adressen zu verwenden aus denen deutlich wird, wann Sie ablaufen. Diese Adressen haben die form Max.Mustermann-expires20071031@gauner.org. Diese Adresse können dann nach belieben Benutzt werden, da man Sie nach einer gewissen Frist, meist wenige Monate, einfach nicht mehr benutzt. Ein Nachteil ist natürlich, dass man diese Adresse dann ggf. an vielen Stellen ändern muss. Mir persönlich wäre dieser Aufwand einfach zu groß.

Harvester blockieren

Um den Spammern das Leben weiterhin schwer zu machen gibt es sog. Honeypot Ansätze, die versuchen Harvester in eine Falle zu locken. Diese Falle ist eine speziell angelegte Webseite mit jeder Menge interner Verweise und künstlich erzeugten, ungültigen eMail-Adressen, die die Ressourcen der Harvester binden und mit unnützen Adressen überfluten soll.

Absichern von Mailinglisten und Newslettern

Zum absichern von Mailinglisten und Newslettern ist es generell sinnvoll entweder die vorhandenen Funktion zur Entfremdung der Mail-Adressen der Nutzer zu verwenden, oder sich selbst Gedanken über eine solche Funktion zu machen. Der, in meinen Augen, beste Ansatz ist die verwendung von Bilder zur Darstellung der Mail-Adressen, bzw. von Teilen davon. Dabei darf man natürlich nicht vergessen, dass der Inhalt der, im Bild dargestellten Zeichenkette, nicht im alt Tag angegen werden sollte. Dies läuft zwar der Barrierefreiheit entgegen, aber das ist wohl einer der Kompromisse die man im Moment eingehen muss.


Ich hoffe, dass ich hiermit einige vorbeugende Schritte zur Spam Vermeidung ein wenig erläutern konnte und falls noch Fragen auftauchen steht natürlich die Kommentar Funtkion jederzeit offen. Da man auch hier nicht von Spam verschont bleibt ist leider das lösen einer kleinen Rechenaufgabe notwendig. Aber zum Thema Kommentar-Spam werde ich ein anderes mal etwas sagen …

16 Oct 2007, 12:09

Für die Horde! - oder wie ein Imap Proxy dem Webmailer Beine macht ...

Nein, ich beziehe mich mit “Horde” nicht auf die Allianz von WoW oder WC3, sondern auf den Webmailer Horde. Der ist zwar sehr mächtig und komfortabel, aber leider auch ziemlich langsam wenn man eine “normale” IMAP/POP3 Verbindung nutzt - selbst wenn der Webserver auf localhost läuft.

Nun habe ich vor einigen Tagen einen Artikel gelesen in dem empfohlen wird, local den Imapproxy einzusetzen um damit die Geschwindigkeit zu erhöhen. Der Vorteil des Imapproxy ist, dass dieser die Verbindungen cacht und es somit den Umstand ausgleicht, dass der Webmailer für nahezu jede Aktion eine neue IMAP-Verbindung aufgauen muss.

Die Konfiguration ist unter Debian wirklich simpel:

aptitude install imapproxy

Und dann im debconf einfach den lokalen Server eingeben. Danach sollte man noch sichergehen, dass der Proxy nur auf localhost lauscht und, dass sich der Port nicht mit dem des “echten” IMAP-Servers überschneidet (siehe /etc/imapproxy.conf).


03 Oct 2007, 18:35

Rezepte Sammlung überarbeitet

Die, von mir mit betreute, Rezepte Sammlung wurde überarbeitet und steht jetzt quasi in Version 2.0 zur Verfügung.  “Quasi” weil das Software-Backend eigentilch keine Versionsnummer hat.

Es ist ab sofort möglich sich auf der Seite zu registrieren und dann Kommentare und Bewertungen zu den Rezepten ab zu geben.

28 Sep 2007, 09:15

Debian etch mit RAID per Debootstrap auf Rootserver installieren

Update: Dieses stichpunktartige Installationsprotokoll dürfte kaum zur Nachahmung geeignet sein. Daher existiert unter dem Titel “Rootserver mit RAID unter Debian GNU/Linux etch” ein Nachfolgedokument das zwar inhaltlich noch nicht ganz komplett ist, diesen Beitrag jedoch bereits deutlich übertrifft.

Dies soll ein kurzer Erfahrungsbericht sein, wie man Debian 4.0 aka etch mit RAID per Debootstrap über ein sog. Rescue-System auf einem Rootserver installiert. Es ist eher eine knappe Zusammenfassung als ein Tutorial und beantwortet daher möglicherweise nicht alle Fragen.
  • Resuce System booten
  • cfdisk /dev/sda
  • cfdsik /dev/sdb
  • Geeignetes Partitionierungsschema:
  • sda1 und sdb1 als /boot mit ext2, 128MB
  • sda2 und sdb2 als / mit ext3, 30GB
  • sda3 und sdb3 als swap, 2GB
  • (md0) sda5 und sdb5 als /tmp mit ext2 unter einem RAID0, 4GB
  • (md1) sda6 und sdb6 als /var/log mit ext3 unter einem RAID1, 4GB
  • (md2) sda7 und sdb7 als /var/lib/mysql mit ext3 unter einem RAID1, 6GB
  • (md3) sda8 und sdb8 als /srv mit ext3 unter einem RAID1, Restlicher Platz/2
  • (md4) sda9 und sdb9 als /backup mit ext3 unter einem RAID1, Restlicher Platz/2
  • mke2fs /dev/sd[ab]1
  • mke2fs -j /dev/sd[ab]2
  • mkswap /dev/sd[ab]3
  • sync; sync; sync
  • swapon /dev/sd[ab]3
  • mkdir /mnt/newroot
  • mount -t ext3 /dev/sda2 /mnt/newroot
  • mkdir /mnt/newroot/boot
  • mount -t ext2 /dev/sda1 /mnt/newroot/boot
  • mknod /dev/md1 b 9 2
  • mknod /dev/md2 b 9 3
  • mknod /dev/md3 b 9 4
  • mknod /dev/md4 b 9 5
  • mdadm –creat e /dev/md0 –level=0 –raid-devices=2 /dev/sd[ab]5
  • mdadm –creat e /dev/md1 –level=1 –raid-devices=2 /dev/sd[ab]6
  • mdadm –creat e /dev/md2 –level=1 –raid-devices=2 /dev/sd[ab]7
  • mdadm –creat e /dev/md3 –level=1 –raid-devices=2 /dev/sd[ab]8
  • mdadm –creat e /dev/md4 –level=1 –raid-devices=2 /dev/sd[ab]9
  • WARTEN bis die Festplatten syncronisiert sind. Tipp: “watch cat /proc/mdstat”
  • mkdir /mnt/newroot/tmp
  • mkdir -p /mnt/newroot/var/log
  • mkdir -p /mnt/newroot/var/lib/mysql
  • mkdir /mnt/newroot/srv
  • mkdir /mnt/newroot/backup
  • Die md0 bis md4 Partitionen formatieren
  • Partitionen mounten
  • ggf. debootstrap installieren
  • Das Grundsystem mit debootstap installieren:
    debootstrap –arch {amd64,i386} etch \
         /mnt/newroot http://ftp.de.debian.org/debian
  • Chroot in das neue System:
    LANG=C chroot /mnt/debinst /bin/bash
  • Terminal einstellen:
    export TERM=xterm-color
  • /etc/fstab anpassen: vim /etc/fstab
  • Das Proc Dateisystem mounten: mount -t proc proc /proc
  • aptitude update && aptitude install mdadm
  • tzconfig um die Zeitzone einzustellen
  • /etc/network/interfaces bearbeiten. localhost nicht vergessen.
  • /etc/resolv.conf anpassen.
  • /etc/hosts anlegen.
  • Einen Kernel installieren, z.b. aptitude install linux-image-2.6-amd64 für einen 64bit Kernel.
  • Boot Loader installieren:
    # aptitude install grub

    grub-install /dev/hda


  • Problem: Grub lässt sich nicht installieren. Lösung: chroot verlassen und ‘
    grub-install –recheck –no-floppy –root-directory=/mnt/newroot /dev/sda’ ausführen.
  • Wichtig: Wieder im chroot, mit passwd ein root Passwort setzen
  • Wichtig: OpenSSH Server installieren: aptitude install openssh-server
  • In /etc/fstab die Raid Partitionen eintragen aber am besten bis zum nächsten Neustart erstmal auskommentiert lassen.
  • Benutzer anlegen, administrative Benutzer in staff,users,adm,wheel und www-data aufnehmen.
  • Neu starten
  • /etc/sshd_config anpassen (no root logins, listen ip, etc.)
  • /etc/pam.d/su anpassen, dass nur Mitglieder der Gruppe whell su benutzen dürfen
  • aptitude install munin munin-node dirvish htop vim nload
  • Damit wäre die Grundeinrichtung abeschlossen.
Ich weiss, dass dies kein Howto ist, aber es sollte für erfahrende Benutzer zumindest einen groben Leitfaden für die Einrichtung bieten.

Wer Fragen hat möge bitte die Kommentarfunktion benutzen, dann werde ich versuchen darauf einzugehen.

19 Sep 2007, 10:23


IBM stellt Lotus Symphony aka OpenOffice+Eclipse RCP vor

Ich weiss nicht ob die Welt das braucht, aber es sieht auf jeden Fall schick aus und vielleicht fördert es ja die Verbreitung von OpenOffice in Unternehmen.

Netzbetreiber fordern USB Anschluss für alle Handys

Na das ist mal eine gute Idee. Die komischen propitären Stecker an den Handys und die umständlichen Software-Lösungen der Hersteller waren mir schon lange ein Dorn im Auge.

Open-Source Konkurent für Second Life

Anscheinend gibt es eine attraktive Alternative zu SecondLife. Ich denke ja, dass ein OpenSource-“SecondLife” deutlich bessere Marktchancen hätte.

Telekom bringt das iPhone

So wie es aussieht wird es bald offiziel angekündigt: Die Telekom bringt das iPhone. Zwar scheint die anfängliche Euphorie inzwischen verfolgen, aber spätestens mit der zweiten Generation des iPhones werde ich mir sehr ernsthaft überlegen mir auch so ein Gerät zu kaufen. Enttäuschend ist halt der Net-Lock.

Debian APT-Proxy in Java

Mit Japt-Proxy gibt es einen APT-Proxy in Java. Ob das was taugt? Ich werde es mal testen, da ich sowieso schon eine Weile nach einem APT-Proxy bin. Natürlich gibt es auch noch andere Implementierungen. Da muss ich einfach mal vergleichen.

11 Sep 2007, 13:32

WordPress Feature Request: Automatische Plugin Updates

Ein wichtiges Feature vermisse ich bei WordPress: eine möglichkeit automatisch alle Plugins zu aktualisieren.

Man denke an das entsprechende Feature von Firefox. Dieser überprüft bei jedem Start ob Updates für die installierten Plugins vorliegen. Warum gibt es das nicht auch für WordPress? So ähnlich wie das InstantUpgrade Plugin nur halt für die Plugins.

Update: Mit Version 2.5 wurde diese Funktion endlich integriert.

03 Sep 2007, 10:07

Besucherstatistiken - Firefox, Windows und 1280x1024

Eine kleiner Blick auf die Statistiken.


  • Firefox (+ Mozilla Derivate) - 58,84%
  • Internet Explorer - 30,08%
  • Opera - 5,82%
  • Safari - 2,87%
  • Konqueror - 1,78%
  • Der Rest teilt sich auf in diverse Browser und interessante Kennungen wie “Gzip”.
Yeah, Firefox rocks! So ist es richtig. Die 30% vom IE bekommt der Firefox auch noch klein.


  • Windows - 76,87%
  • Linux - 17,61%
  • MacOS - 4,95%
  • FreeBSD - 0,04%
Schade, ich dachte Linux wäre stärker repräsentiert.

Bei den Bildschirmaufläsungen dominiert 1280x1024 mit 37,49% vor 1024x768 mit 23,24% und 1280x800 (9,41%). 800x600 ist mit nur 0,64% gerade mal auf Platz 11. Interessant sind ein paar Exoten wie z.B. 1920x1200 mit immerhin 2,80% oder 2560x1600 (0,11%). Bei so Auflösungen denke ich nur: “Ich will auch!”.

02 Sep 2007, 13:35

Google Earth mit Flugsimulator!

Omfg ist das genial - Google Earth gibts jetzt mit eingebautem Flugsimulator!

Ich bin definitiv nicht der Erste dem das Aufgefallen ist, aber ich bin gerade viel zu begeistert um nicht etwas darüber zu schreiben.

Um den Flugsimulator zu starten sollte man sich erstmal die neuste Version von Google Earth runterladen und dann, bei fokusiertem Hauptfenster, Strg+Alt+A drücken.

Es gibt auch eine Hilfe.

Google Earth Flightsim über Berlin Mitte

30 Aug 2007, 11:14

XML Dokumente mit Namespaces in PHP5/SimpleXML verarbeiten

SimpleXML ist was feines. Damit lassen sich XML Dokumente ohne viel Aufwand bearbeiten, leider hat das ganze einen kleinen Haken.

Namespaces! Richtig, SimpleXML kann Namespaces zwar verarbeiten aber dadurch wird die Bedienung etwas verwirrend und leider ist das ganze auch nicht gut Dokumentiert.

Ein kleines Beispiel, gegeben sei folgende XML Datei: <XmlResultSet version=“1.0.0” xmlns=“http://www.gauner.org/api" xmlns:bml=“http://www.bla.net/bml" xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://www.gauner.org/api/schema.xsd"> <bml:description>This is an API</bml:description> <bml:name>api</bml:name> <bml:Member> <AnEntry> <bml:name>Blabla</bml:name> </AnEntry> </bml:Member> </XmlResultSet>

So, jetzt mal angenommen ich will auf Xml->bml:Member->AnEntry->Name zugreifen. Ohne Namespaces ist das mit SimpleXML ganz einfach: Xml->Member->AnEntry->Name. Aber das lustige an Namspaces ist, dass die jeweils anderen Namespaces ausgeblendet werden. D.h. SimpleXML sieht alles im Namespace “bml” erstmal nicht.

Ok, dafür gibts eine Lösung: Man kann mit Element->children(‘namespace-url’) explizit auf die Namespaces zugreifen, aber dabei gibt es zwei Fallen. Zum einen muss man unbedingt die URL des Namespaces angeben, nicht etwas den Namen des Namespace, und zum anderen ist es wichtig zu beachten, dass dann eben die anderen Namespaces augeblendet werden, und man ggf. wieder in den Default Namespace (mit ->children(“)) wechseln muss.

Wenn ich jetzt in obigem Beispiel auf <bml:name> Zugreifen will sähe der korrekte Code dann etwa so aus: $xml = new SimpleXMLElement($source); $name = $xml->children(‘http://www.bla.net/bml')->Member->children('')->AnEntry->children('http://www.bla.net/bml')->name;

Siehe dazu auch den Eintrag bei SitePoint.

18 Aug 2007, 09:19

Skype ist kaputt

Ohman, da will man mal nach langer, langer Zeit wieder Skype benutzen und dann bricht das komplette Netzwerk von denen zusammen, und zieht die Netze der Nutzer gleich mit runter.

Naja, so gewinnen die jedenfalls keine neuen Kunden.

Ich weiss warum ich dem ganzen VoIP-Kram z.Z. noch den Rücken kehre und lieber auf POTS setze, mein ISDN Anschluss fällt nicht aus weil irgendein “Algorithmus” spinnt. Wobei das ganze für mich eher wie eine faule Ausrede klingt, ich vermute wirklich, dass das mit dem MS Patchday zusammenhängt und die vorher irgendeinen Windows Bug ausgenutzt haben um die SuperNodes zu verwalten, und der wurde dann plötzlich von MS gepatcht. Sowas nennt man wohl “natürliche Selektion”, die schlechten überleben einfach nicht. Und Skype gehört für mich definitiv nicht zu den guten. Wenn es endlich Clients gibt die Jingle ordentlich implementieren, dann brauche ich kein Skype mehr.

16 Aug 2007, 08:42

Wie geht AVM mit der GPL um?

Nachdem ich mich seit einiger Zeit mit der Fritz!Box von AVM beschäftige, hat sich mir die Frage gestellt wie AVM eigentlich mit der GPL umgeht, da sie ja Linux auf den Fritz!Boxen einsetzen. Zum Teil, d.h. mindestens bei 7170 und 7270, auch Samba und andere GPL Software.

Weder auf der AVM Homepage, noch in der Fritz!Box Dokumentation ist ein Verweis auf die GPL.

Aber in einem Unterverzeichniss auf dem FTP-Server von AVM liegen einige Archive mit allen geänderten Code-Teilen. Leider scheint das ganze ziemlich nutzlos zu sein, da dort lediglich die Patches liegen und sich so kaum eine vollwertige Fritz!Box Firmaware bauen lässt.

Update: Anscheinend machen sich auch andere Gedanken darüber wie AVM mit der GPL umgeht.

08 Aug 2007, 18:59

Rezepte Sammlung in neuem Design

Die Rezepte-Sammlung unter rezepte.gauner.org wurde von mir in den letzten Tagen komplett überarbeitet und erstrahlt jetzt in neuem Glanz. Weg mit hässlichen Parametern (?id=X) und nichts sagenden Dateinamen. So dürfe das ganze wesentlich Nutzerfreundlicher sein, und die Suchmaschienen dürften damit auch besser klarkommen.

War interesse an der Umsetzung hat soll sich bei mir melden, dann werde ich das hier bei Gelegenheit erläutern.

Soviel sei schonmal verraten: Die Apache Mod Rewrite Konfiguration habe ich 1:1 von WordPress übernommen.

01 Aug 2007, 09:53

OpenWRT auf der Fritz!Box

Wie ich gerade erfahren habe gibt es offensichtlich die Möglichkeit OpenWRT Linux auf den Fritz!Boxen zu installieren.

Allerdings steht in der OpenWRT Table of Hardware noch untestet bzw. Work-in-Progress und ich werde bestimmt nicht das komfortable Web-GUI der Fritz!Box für lustiges konsolen-gefrickel eintauschen, aber eine interessante Alternative ist es in jedem Fall.

27 Jul 2007, 10:48

Migrating Debian etch to Debian lenny

Zwar ist es noch nicht lange her, dass etch stable wurde, aber da es sich schon einige Zeit im Freeze befand ist es mal wieder soweit, dass ich mit der Aktualität nicht zufrieden bin und mich mal wieder Richtung testing orientiere.

Insbesondere aiccu brauche ich für IPv6 via SixXS.

Die Migration war eigentlich ganz einfach, wenn auch ein wenig verwirrend.

Einfach die /etc/apt/sources.list angepasst und erstmal ein aptitude update sowie ein aptitude -s dist-upgrade abgesetzt.

Danach hat mir aptitude zwar zunächst vorgeschlagen OpenOffice zu entfernen, aber das hat es sich dann nochmal anderst überlegt.

Grund waren wohl ein paar nicht ganz auflösbare Abhängigkeiten in Bezug auf OOo.

25 Jul 2007, 19:25

FRITZ!Box Wiki

Als ich gerade auf der Suche nach Informationen zu meiner FRITZ!Box 7170 war, bin ich auf ein sehr informatives Wiki zum Thema FRITZ!Box gestossen: wehavemorefun.

16 Jul 2007, 10:29

Aus jHTTPd wird libjhttpd

Nachdem ich den Code zu meinem einfachst-Webserver jHTTPd (HTTP/1.0, Multithreading, IPv6- und UTF-8-Support) in wesentlich mehr Projekten weiter verwendet habe, als zunächst geplant, habe ich mich entschlossen den Code nochmals zu überarbeiten, ein wenig refactoring zu betreiben und als Bibliothek umzuarbeiten.

Der Webserver kann jetzt auch ordentlich binäre Multipart POST Requests verarbeiten. Ein kleines Missverständnis zwischen mir und den Java Streams hat dafür gesorgt, dass es vorher nicht funktioniert hat.

Bytes nach String und wieder zurück zu casten geht selten gut ;)

Die Bibliothek ist so angelegt, dass man den bestehenden Code nicht ändern muss - wobei das für eine Bibliothek selbstverständlich sein sollte.

Im Package webserver.sample befindet sich ein Beispiel dafür wie man die Bibliothek verwenden kann.

Ähnlich wie beim Apache-Webserver existieren ein paar Hooks die es erlauben an verschiedenen Stellen der Request Verarbeitung einzugreifen und die Daten entsprechend zu manipulieren.

Eine lauffähige Instanz des Webservers erzeugt man mit folgendem Code:

Config config = new Config(); // read the config try { config.readConfig(Config.CONFIG_FILE); } catch (IOException e) { e.printStackTrace(); } // check command line arg count if (args.length > 0) { // parse args config.setPort(args[0]); } WebServer ws = new WebServer(config, new SampleHttpRequestFactory()); Thread t = new Thread(ws); t.start();

Weiterhin muss man in einer Klasse die Schnittstelle IHttpRequestFactory implementieren und dort die, ebenfalls zu implementierende, Klasse die von HttpRequest erbt, angeben.

HttpRequest bietet drei sog. Hooks.

  • postConnect() - wird aufgerufen sobald der Client die Verbindung hergestellt hat, aber bevor irgendetwas weiter passiert ist. Hier könnte man z.B. überprüfen ob der Client auf einer Blacklist steht, bzw. aus einem nicht zulässigen Netzwerk kommt und die Verbindung schliessen bevor weitere Ressourcen verbraucht werden.
  • postRequest() - wird aufgerufen nachdem der Request des Clients, d.h. inkl. evtl. vorhandenem POST-Body, verarbeitet wurde. Hier sollte eigentlich fast der gesamte benutzerspezifische Code landen.
  • preClose() - wird aufgerufen direkt bevor die Verbindung zum Client geschlossen wird und nachdem die Antwort gesendet und der Request geloggt wurde. Zu diesem Zeitpunkt besteht keine Garantie dafür, dass die Verbindung zu Client noch existiert.
Die Klasse HttpRequest bietet neben den Hooks noch eine Reihe von Methoden die den Zugriff auf die Daten des Requests ermöglichen.

Die wichtigsten wären:

  • getArgument() - um die komplette Liste der Argumente zu erhalten. Also POST und GET Argumente.
  • getMultiparts() - um die evtl. vorhandenen Multipart Teile eines POST Requests zu erhalten.
  • getRemoteAddress() - um die IP des Clients zu erhalten sowie getRemotePort() um den dazugehörigen Port zu erhalten. Diese zwei Felder sind die einzigen die während postConnect() schon gültige Daten enthalten.
  • getRequestHeader() - um den verarbeiteten Header auszulesen.
  • getResponseHeader() - um auf den Response Header zuzugreifen.
Für weitere Details möchte ich direkt auf den Quellcode verweisen. Fragen und Anmerkungen bitte über die Kommentarfunktion.

Den Quellcode und den Download gibts hier: libjhttpd.

05 Jul 2007, 18:01

Slashdot Comment of the Day

If 10 years ago someone told me the biggest company on the internet would be an advertising agency that used the phrase “do no evil” and people believed them I would have said they were on crack. Alas, it seems to be the case.” [link]

Besser hätte ich es auch nicht ausdrücken können …

05 Jul 2007, 16:02

Warum sich IPv6 in den nächsten 5 Jahren durchsetzen wird

  • Weil immer mehr Anwendungen (Apache, Mailserver, etc.) IPv6 fähig sind
  • Weil Windows Vista IPv6 standardmäßig aktiviert hat.
  • Weil meine Server alle IPv6 sprechen ;)
  • Weil China, mit seiner aufstebenden Wirtschaft, gerade einmal soviele IPv4 Adressen hat wie die Universität von Californien.
  • Weil dieICAAN massiv für IPv6 werben will.
Und wenn ich mich geirrt habe ist es auch nicht schlimm, denn IPv4 ist auch was tolles.

05 Jul 2007, 09:23

T-Online Benutzerkennung

Der Trick ist zwar schon alt, aber ich musst gerade mal wieder danach suchen:

Wie setzt sich der T-Online Benutzername, für Router oder Linux, zusammen.

Laut T-Online wie folgt: Anschlusskennung, T-Online Nummer, #, Mitbenutzernummer und @t-online.de.


03 Jul 2007, 07:10

FRITZ!Box 7270 wahrscheinlich erst im Spätsommer

So ein Mist, die neue FRITZ!Box 7270 gibts wahrscheinlich erst im Spätsommer. So zumindest die Auskunft von AVM.

Nach aktuellem Kenntnisstand wird die FRITZ!Box Fon WLAN 7270 voraussichtlich im Laufe des Sommers 2007 (Tendenz Spätsommer) verfügbar werden.
Quelle: AVM Vertrieb

Schade, das Teil hat mich wirklich neugierig gemacht.

  • Verschlüsslung für VoIP
  • DECT Basisstation
  • LCR (?)
  • WLAN nach 802.11n
  • Unterstützung für VDSL
  • Zugriff auf angschlossene Festplatten über Windows Freigaben (Samba)
  • VPN Zugriff von Aussen
Und das ganze kombiniert mit der ausgereiften FRITZ!Box Oberfläche, das lässt hoffen. Leider kostet das Teil auch entsprechend viel …

Update: Sobald die neue Fritz!Box 7270 auf dem Markt ist werde ich das hier sofort ergänzen, aber bis heute, Stand 13.08.07, ist in den einschlägigen Shops noch nichts von AVMs neusten Topmodell zu sehen. Btw. bei der LCR Funktion bin ich mir nicht ganz sicher, das habe ich möglicherweise falsch aufgefasst. Wir werden sehen …

Update II, 18.08.07: In der neuen c’t (1807) ist auf S.124 ein Screenshot der offensichtlich von der neuen Fritz!Box 7270 stammt. Warum bekommen die eine und ich nicht? Liebe AVM, bitte schickt mir doch auch eine neue Fritz!Box zu testen ;)

Update III, 29.08.07: Jetzt kommt die neue Fritz!Box wohl doch erst im Herbst.

27 Jun 2007, 16:13

Exim4 Konfiguration mit SMA, MySQL, IPv6, SpamAssassin und TLS

Achtung: Dieser Beitrag ist schon älter und teilweise fehlerhaft. Unter dem Titel ISP Email Server mit Exim 4, Dovecot, MySQL und SpamAssassin auf Debian GNU/Linux etch habe ich eine ausführlichere und ausgereiftere Fassung veröffentlicht.

Ich möchte hier kurz meine Mailserver Konfiguration vorstellen, da ich es für gut möglich halte, dass diese Information auch für andere Betreiber von Mailservern von Intresse sein könnte.

Für den Betrieb meines Mailservers setze ich auf exim4 und Dovecot. Das ganze läuft unter Debian etch.

Unter Debian lassen sich die benötigten Pakete einfach mit folgendem Kommando installieren:

aptitude install dovecot-common dovecot-imapd dovecot-pop3d exim4-daemon-heavy mysql-server-5.0 pyzor razor spamassassin spamc dcc-client
Zu Dovecot ist eigentlich nichts weiter zu sagen, ausser das er wunderbar seinen Dienst verrichtet.

Exim greift auf eine MySQL Datenbank für die Überprüfung der Benutzer zurück, bindet SpamAssassin mit diversen Plugins ein, läuft sowohl auf IPv4 als auch IPv6 (via SixXS) und nimmt Mails auch via SMA/RFC2476 entgegen - natürlich alles auch über TLS.

Ein weiteres gute Beispiel für eine Exim4 Konfiguration gibt es hier.

Hier folgt jetzt meine kommentierte Exim 4 Konfiguration. Bei Fragen bitte die Kommentarfunktion des Blogs nutzen.

Zunächst werden einige Macros definiert um die gesamte Konfiguration übersichtlicher zu gestallten. Am Anfang stehe die Zugangsdaten zum MySQL-Server und die Tabellennamen.
Dann folgt die Mailman Konfiguration. Dies wird weiter unten nochmal erläutert.
Hier folgen die aktuelle verwendeten Blacklists, genauer: DNSRBL. Leider muss diese Liste in letzter Zeit oft angepasst werden da die BLs oft unter Beschuss stehen oder den Dienst einstellen.
Nun zum komplizierten Teil: Den SQL Querys. Ich werde nicht auf jede einzelne Query eingehen, aber mit ein paar SQL Kentnissen sollten sie kein Problem sein.
MYSQL_Q_ISAWAY=SELECT domain FROM MYSQL_EMAILTABLE WHERE domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}' AND is_away='yes'
MYSQL_Q_AWAYTEXT=SELECT away_text FROM MYSQL_EMAILTABLE WHERE domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}'
MYSQL_Q_FORWARD=SELECT forward FROM MYSQL_EMAILTABLE WHERE domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}' AND forward != '' AND is_enabled = 'yes'
MYSQL_Q_CC=SELECT cc FROM MYSQL_EMAILTABLE WHERE domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}' AND is_enabled = 'yes'
MYSQL_Q_LOCAL=SELECT domain FROM MYSQL_EMAILTABLE WHERE domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}' AND forward = '' AND is_enabled = 'yes'
MYSQL_Q_WCLOCAL=SELECT domain FROM MYSQL_EMAILTABLE WHERE domain='${quote_mysql:$domain}' AND local_part='*' AND forward != '' AND is_enabled = 'yes'
MYSQL_Q_WCLOCFW=SELECT forward FROM MYSQL_EMAILTABLE WHERE domain='${quote_mysql:$domain}' AND local_part='*' AND forward != '' AND is_enabled = 'yes'
MYSQL_Q_DISABLED=SELECT domain FROM MYSQL_EMAILTABLE WHERE domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}' AND is_enabled = 'no'
MYSQL_Q_BOXPATH=SELECT CONCAT(domain,'/',local_part) AS boxpath FROM MYSQL_EMAILTABLE WHERE domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}'
MYSQL_Q_SPAMC=SELECT domain FROM MYSQL_EMAILTABLE WHERE domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}' AND spam_check='yes'
MYSQL_Q_SPAMPURGE=SELECT domain FROM MYSQL_EMAILTABLE WHERE domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}' AND spam_purge='yes'
MYSQL_Q_AUTHPLAIN=SELECT if(count(*), "1", "0") FROM MYSQL_EMAILTABLE WHERE CONCAT(local_part,'@',domain)='${quote_mysql:$2}' AND pwclear='${quote_mysql:$3}'
MYSQL_Q_AUTHLOGIN=SELECT if(count(*), "1", "0") FROM MYSQL_EMAILTABLE WHERE CONCAT(local_part,'@',domain)='${quote_mysql:$1}' AND pwclear='${quote_mysql:$2}'
# 'hide' damit diese Optionen nicht auf der Kommandozeile angezeigt werden.
# Der primäre Hostname, sollte identisch mit dem RDNS Namen der IP sein.
primary_hostname = mail.gauner.org
# Welche Domains sind lokal
domainlist      local_domains = localhost:gauner.org:lists.gauner.org:mysql;MYSQL_Q_LDOMAIN
domainlist      relay_to_domains = mysql;MYSQL_Q_RDOMAIN
hostlist        relay_from_hosts =
# Definiert zu welchen Zeiten der SMTP Sitzung welche ACLs ausgeführt werden.
# Nachdem das RCPT Kommando gesendet wurde
acl_smtp_rcpt = acl_check_rcpt
# Nachdem das MAIL FROM Kommando gesendet wurd
acl_smtp_mail = acl_check_from
qualify_domain = gauner.org
never_users = root
host_lookup = *
# Trusted Users wird für SpamAssasin benötigt.
trusted_users = mail
rfc1413_hosts = *
rfc1413_query_timeout = 15s
check_spool_space = 50M
check_log_space = 20M
return_size_limit = 20k
message_size_limit = 20M
ignore_bounce_errors_after = 2d
timeout_frozen_after = 7d
deliver_queue_load_max = 8
queue_only_load = 10
remote_max_parallel = 15
# TLS Konfiguration
tls_certificate = /etc/exim4/exim.cert
tls_privatekey = /etc/exim4/exim.key
tls_advertise_hosts = *
local_interfaces = < ; ; aaa.bbb.ccc.ddd ;
# Listen for SMTP on Port 25 and for SMA on Port 587
daemon_smtp_port = 25 : 587
begin acl
  # drop connections on the SMA Port that did not auth
  drop condition = ${if={$interface_port}{587} {1}{0}}
  !authenticated = *
  # accept everything else (policy checks are in rcpt acl)
  accept  hosts = :
  deny    domains       = +local_domains
          local_parts   = ^[.] : ^.*[@%!/|]
  deny    domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/../
  accept  local_parts   = postmaster
          domains       = +local_domains
  require verify        = sender
  accept  authenticated = *
  # Add a warning header if the sending host is in theses
  # DNSBLs but accept the message
  # see http://www.exim.org/howto/rbl.html
  warn    message       = X-blacklisted-at: $dnslist_domain
          dnslists      = BL_WARN
  # Reject messages from senders listed in these DNSBLs
  deny    dnslists      = BL_DENY
  # Consult "greylistd" to obtain greylisting status for this
  # particulat peer/sender/recipient triplet.
  # We do not greylist messages with a NULL sender,
  # because sender callout verification would break (and we
  # mitght not be able to send mail to a host that performs
  # callouts).
          message       = $sender_host_address is not yet authorized to
                          deliver mail from <$sender_address> to < $local_part@$domain>.
                          Please try later.
          log_message   = greylisted.
          domains       = +local_domains : +relay_to_domains
          !senders      = : postmaster@*
    !hosts         = : +relay_from_hosts :
                     ${if exists {/etc/greylistd/whitelist-hosts}
                                 {net-lsearch;/etc/greylistd/whitelist-hosts}{}} :
                     ${if exists {/var/lib/greylistd/whitelist-hosts}
          set acl_m9    = $sender_host_address $sender_address $local_part@$domain
          set acl_m9    = ${readsocket{/var/run/greylistd/socket}{$acl_m9}{5s}{}{}}
          condition     = ${if eq {$acl_m9}{grey}{true}{false}}
  accept  domains       = +local_domains
          verify        = recipient
  accept  domains       = +relay_to_domains
          verify        = recipient
  accept  hosts         = +relay_from_hosts
  deny    message       = relay not permitted
# Die Router. Hier ist es wichtig darauf zu achten in welcher
# Reihenfolge die Einträge angegeben werden, da eine Mail
# von oben nach unten an jeden Router übergeben wird
# bis sie von einem akzeptiert wird.
begin routers
# In der Datenbank deaktivierte Adressen werden gleich zu beginn rausgeworfen.
  driver = redirect
  domains = ${lookup mysql {MYSQL_Q_DISABLED}{$value}}
  data = ":fail:"
# Hier werden Mailman Adressen behandelt
  driver = redirect
  data = ${lookup{$local_part}lsearch{/etc/aliases.mailman}}
  file_transport = address_file
  pipe_transport = address_pipe
  domains = lists.gauner.org
  user = list

# DnsLookup sind externe Nachrichten, d.h. Mails von diesem System an andere.
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = :

  driver = manualroute
  senders = ${lookup mysql {MYSQL_Q_BLACKLIST}{$value}}
  condition = "${if !def:h_X-Spam-Flag: {1}{0}}"
  headers_add = X-Spam-Flag: YES
  route_list = * localhost
  self = pass

# System Aliase
  driver = redirect
  data = ${lookup{$local_part}lsearch{/etc/aliases}}
  file_transport = address_file
  pipe_transport = address_pipe

# SpamAssassin Integration (Scannen und Markieren)
  driver = manualroute
  domains = ${lookup mysql {MYSQL_Q_SPAMC}{$value}}
  senders = ! ${lookup mysql {MYSQL_Q_WHITELIST}{$value}}
  condition = ${if and {
    {!eq {$received_protocol}{spam-scanned}}
    {!eq {$received_protocol}{local}}
    } {1}{0}}
  headers_remove = X-Spam-Flag
  route_list = "* localhost byname"
  transport = spamcheck
  verify = false

# SpamAssassin Integration (Spam löschen)
  driver = manualroute
  domains = ${lookup mysql {MYSQL_Q_SPAMPURGE}{$value}}
  condition = "${if eq{$h_X-Spam-Flag:}{YES} {1}{0}}"
  route_list = "* localhost byname"
  transport = devnull_transport
  verify = false

  driver = accept
  domains = ${lookup mysql {MYSQL_Q_ISAWAY}{$value}}
  transport = vacation_autoreply

  driver = redirect
  data = ${lookup mysql {MYSQL_Q_CC}{$value}}

  driver = redirect
  data = ${lookup mysql {MYSQL_Q_FORWARD}{$value}}

# Lokale Zustellung für Benutzer aus der Datenbank
  driver = accept
  domains = ${lookup mysql {MYSQL_Q_LOCAL}{$value}}
  transport = virtual_local_md_delivery

  driver = redirect
  domains = ${lookup mysql {MYSQL_Q_WCLOCAL}{$value}}
  data = ${lookup mysql {MYSQL_Q_WCLOCFW}{$value}}

  debug_print = "R: local_user for $local_part@$domain"
  driver = accept
  domains = +local_domains
  local_parts = ! root
  transport = local_delivery


begin transports

# Remote Deliveries
  driver = smtp
  # Use Interface aaa.bbb.ccc.ddd for Outgoing Communiction
  interface = aaa.bbb.ccc.ddd

  driver = appendfile
  file = /dev/null
  group = mail

  driver = pipe

  driver = appendfile

  driver = appendfile
  message_prefix = ""
  message_suffix = ""

  driver = autoreply

# SpamAssassin Integration
  driver = pipe
  command = /usr/sbin/exim4 -oMr spam-scanned -bS
  use_bsmtp = true
  transport_filter = "/usr/bin/spamc -u $local_part@$domain"
  home_directory = "/tmp"
  current_directory = "/tmp"
  user = mail
  group = mail
  log_output = true
  return_fail_output = true
  return_path_add = false
  message_prefix =
  message_suffix =

  driver = appendfile
  directory = /home/users/${local_part}/Maildir

# Lokale Zustellung für Benutzer aus der Datenbank
  driver = appendfile
  directory = /home/mail/${lookup mysql {MYSQL_Q_BOXPATH}{$value}}/Maildir
  user = mail
  group = mail
  mode = 0660
  directory_mode = 0770
  check_string = ""
  message_prefix = ""
  message_suffix = ""

  driver = autoreply
  to = ${sender_address}
  from = "vacation@${domain}"
  subject = "Ihre Nachricht an ${local_part}@${domain}"
  text = ${lookup mysql {MYSQL_Q_AWAYTEXT}{$value}}

  driver = autoreply
  from = ${local_part}@${domain}
  to = ${sender_address}
  user = mail
  subject = "Re $h_Subject:"
  text = "Your message to ${local_part}@${domain} was rejected due to an
    disabled account. Please try again later."

  driver = appendfile
  file = /dev/null
  user = mail

begin retry
*                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h
begin rewrite
*@gauner.org    ${lookup{$1}lsearch{/etc/email-addresses}
                                                {$value}fail} frFs
begin authenticators

  driver = plaintext
  public_name = PLAIN
  server_condition = ${lookup mysql{MYSQL_Q_AUTHPLAIN}}
  server_set_id = $2

  driver = plaintext
  public_name = LOGIN
  server_prompts = "Username:: : Password::"
  server_condition = ${lookup mysql{MYSQL_Q_AUTHLOGIN}}
  server_set_id = $1

   driver = cram_md5
   public_name = CRAM-MD5
   server_secret = ${lookup mysql{MYSQL_Q_AUTHCRAM}{$value}fail}
   server_set_id = $1
Die passenden Datenbankschemas für MySQL:
-- ----------------------------------------------------------
-- Tabellenstruktur für Tabelle `exim_emailtable`
CREATE TABLE `exim_emailtable` (
  `id` int(9) NOT NULL auto_increment,
  `local_part` varchar(255) NOT NULL default '',
  `domain` varchar(255) NOT NULL default '',
  `forward` varchar(255) default NULL,
  `cc` varchar(255) default NULL,
  `name` varchar(255) NOT NULL default '',
  `pwclear` varchar(255) NOT NULL default '',
  `pwcrypt` varchar(255) NOT NULL default '',
  `is_away` enum('yes','no') NOT NULL default 'no',
  `away_text` text,
  `spam_check` enum('yes','no') NOT NULL default 'no',
  `spam_purge` enum('yes','no') NOT NULL default 'no',
  `virus_check` enum('yes','no') NOT NULL default 'no',
  `is_enabled` enum('yes','no') NOT NULL default 'yes',
  `customer_id` int(9) NOT NULL default '0',
  `created_at` int(16) NOT NULL default '0',
  `updated_at` int(16) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Alle virtuellen Mail-Accounts' AUTO_INCREMENT=1;

-- Tabellenstruktur für Tabelle `exim_domains`
CREATE TABLE `exim_domains` (
  `id` int(9) NOT NULL auto_increment,
  `domain` varchar(255) NOT NULL default '',
  `is_enabled` enum('yes','no') NOT NULL default 'no',
  `customer_id` int(9) NOT NULL default '0',
  `created_at` int(16) NOT NULL default '0',
  `updated_at` int(16) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `domain` (`domain`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Tabelle aller von exim erkannten Domains' AUTO_INCREMENT=1;

27 Jun 2007, 08:36

Marktanteile von MMORPGs

Da ich gerade auf der Suche nach Informationen zu den Marktanteilen der einzelnen MMORPGs war bin ich auch die Seite MMOGCHART gestossen auf der man genau diese Informationen sehr schön aufbereitet findet.

Leider fallen Spiele wie Guild Wars, die nicht auf ein Subscriptions-Modell setzen aus dem Raster und werde dort nicht erfasst. Schade, es hätte mich doch mal interessiert wie Guild Wars im Vergleich zu WoW abschneidet.

21 Jun 2007, 11:29

Dovecot 1.0.1 veröffentlicht

Der IMAP4/POP3-Server Dovecot wurde vor einigen Tagen in der Version 1.0.1 veröffentlicht.

Die Liste der Änderungen ist relativ kurz und es handelt es sich hauptsächlich um einige kleinere Bugfixes.

Hier das Changelog und der Download.

19 Jun 2007, 07:30

Dovecot macht sich gut ...

Wie ich vor kurzem berichtet habe, läuft der Mailserver seit einiger Zeit unter Dovecot.

Bis jetzt gabs keinerlei Probleme, die Performance stimmt und mit den richtigen Munin Plugins lässt sich das ganze auch wunderbar monitoren.

Fazit: Toll :)

Update: Meine Konfiguration gibt es im Dovecot Wiki.

18 Jun 2007, 11:50

Rechtschreibkorrektur in Java

Nach der Lektüre des überaus interessanten Artikels über einen einfachen Algorithmus zur Rechtschreibkorrektur von Peter Norvig, habe ich beschlossen den abgefahrenen Python Code in Java zu übersetzen. Nach ein paar Versuchen hat es auch schon geklappt. Das Ergebnis des ganzen gibt es ab sofort unter dem Namen jSpellCorrect zu bewundern.


Nachdem Peter Norvig seine Seite aktualisiert hat muss ich sagen, dass ich ein wenig schockiert bin: Aus einem einfachen 21 Zeilen Python Programm werden über 350 Zeilen Code in Java ... autsch ;)

07 Jun 2007, 14:05

Virtual Box 1.4.0 - Keine Probleme mehr mit Linux als Gast

Nachdem ich die neue Version 1.4.0 von Virtual Box installiert habe gibt es endlich keine Probleme mehr mit Linux als Gast OS, wie ich sie noch mit 1.3.8 erleben musste.


Diesen Post schreibe ich auch gerade aus der VM heraus.

Host OS: Debian etch

Gast OS: (noch) Debian etch

Das Gast OS wird gleich zu einem Debian testing. Später, wenn ich genug Plattenplatz freiräumen kann, werde ich evtl. noch ein Debian SID installieren. Damit ich ein bischen auf dem laufenden bleiben kann was sich da so tut. Dafür jedenfalls sind virtuelle Maschinen super geeignet.

07 Jun 2007, 08:12

Gauner on IPv6

Der Server ist seit gestern auch provisorisch über IPv6 via SixXS zu erreichen.

Vorerst dürfte nur der Mailserver zu 100% IPv6 tauglich eingerichtet sein.

Der Apache ist zwar auch schon für IPv6 vorbereitet, die vHosts müssen aber noch entsprechende konfiguriert werden.

Bei den weiteren Diensten ist die IPv6 Unterstützung bis jetzt noch unklar, wird aber nach Möglichkeit bald folgen.

05 Jun 2007, 16:46

Mein erstes Sketchup/Google Earth Modell

Ich habe gerade mal mein erstes Google Earth Modell mit Sketchup erstellt.

Nachdem meine ersten Versuche etwas schief gegangen sind klappt es jetzt schon einigermaßen.

Beeindruckend finde ich vor allem, dass ich das ganze mit nur zwei “schiefen” Fotos hinbekommen habe.

Download direkt oder bei Google.

22 May 2007, 10:49

Followup: vi-Like Bedienung bei Google

Eine Sache hatte ich in dem Post von gestern vergessen:

Mehr nette, neue Features gibt es bei Google Experimental.

21 May 2007, 10:16

vi-Like Bedienung bei Google

Howdy! Bei Google Experimental gibt es jetzt eine Möglichkeit in den Suchergebnissen wie in vi zu navigieren.

Um diese praktische Feature zu nutzen muss man einfach an die Suche (in der Adresszeile) den String “&esrch=BetaShortcuts” anhängen.

Das ganze sieht dann zum Beispiel so aus: flexicrypt

Als vi Nutzer bin ich begeistert!

14 May 2007, 09:05

Skype aka the Worlds biggest Botnet

Ein sehr interessantes und vor allem detailiertes Essay zur Sicherheit von und mit Skype gibt es hier: Skype inSecurity Essay.

Jedem Netzwerkadministrator, Netzwerkverantwortlichen, Sicherheitsbewusstem Benutzer und allen auch nur halbwegs Paranoiden sei das dringend empfohlen.

Update 18.08.07: Siehe auch diesen Beitrag über die aktuellen Probleme mit  Skype.

12 May 2007, 14:26

Munin Plugins für Dovecot und die Auth-Facility

Ich habe im Munin Plugin Exchange (lokaler Mirror) zwei praktische Munin Plugins zur Verfügung gestellt.

Zum einen ein Plugin um die Logins und Verbindungen zum Dovecot IMAP/POP3-Server zu überwachen … Dovecot Day

… und zum anderen eine verbesserte Version das auth Plugin um Logins und fehlgeschlagene Versuche der Auth-Facility zu überwachen.

Auth Day

08 May 2007, 18:50

Mailserver mit Dovecot

Seit mir einiges Positives über den IMAP/POP3-Server dovecot zu Ohren gekommen ist habe ich eine mögliche Migration evaluiert. Nachdem auch die letzten Probleme mit dem Migrations Skript für die Mailboxen behoben waren, habe ich den Mailserver gerade umgestellt. Wirklich kurz und schmerzlos muss ich sagen. Jetzt muss er sich nur noch in der Praxis beweisen.

13 Oct 2006, 08:53


Was ist das? Habe ich mich auch gerade gefragt. Aber, ganz einfach, es ist der Versuch FireFox auf GNU kompatibel zu machen um es mit GNU Linux distributionen auszuliefern. Naja, wer zuviel zeit hat….

Link: http://www.gnu.org/software/gnuzilla/

25 Sep 2006, 18:17

Belgische Zeitungen aus den Google-Index entfernt

Tja, so haben es sich die Verleger wohl nicht vorgestellt, als Sie gegen Google geklagt haben.

Selbst Schuld würde ich sagen.

02 Apr 2006, 13:34

The 35 sexiest designed Websites you've forgotten


19 Mar 2006, 19:05

Software RAID unter Linux

Bis vor kurzem habe ich nichts von einem Software-RAID gehalten, aber diese mdadm Tools sind wirklich einfach zu bedienen und im Vergleich zu den Problemen die ein (billiger) Hardware-RAID Controller unter Linux mit sich bringt ist das ziemlich stressfrei.

Ich glaube ich muss mir demnächst auch mal ein RAID1 einrichten, wenn ich dafür nur meinen Kernel nicht neu kompilieren müsste …

Das Software-RAID How-To Software-RAID unter Debian

15 Mar 2006, 12:44

Maps Service von GoYellow

Ich habe heute festgestellt, dass die Firma GoYellow einen Maps Service, ähnlich Google für Deutschland anbietet. Die Auflösung der Bilder lässt sich auch sehen.

Einfach mal Straße und Hausnummer eingeben - bei mir hat es jedenfalls überraschend gut geklappt.

15 Mar 2006, 10:06

Online Bullshit Bingo

Falls langweile aufkommen sollte, einfach mal ‘ne Runde Bullshit Bingo spielen ;D

13 Mar 2006, 12:04

Google maps

Wie ich gerade entsetzt festellen musste, wurde der Maps Service von Google wurde um Karten des Mondes und den Mars erweitert. Auf den Karten sind ebenfalls ein paar Sehenswürdigkeiten wie Landeplätze der diversen Raumfahrtmissionen eingezeichnet - reinschauen lohnt sich.

08 Mar 2006, 18:04


Ein ganz fieses Spiel ;)

24 Feb 2006, 21:33

chewys blog: UUUHHHGGG-rrrrr!!