Nachdem ich sie 2 mal abends beim Sonnenbad gesehen hatte, bin ich nochmal schnell mit der Kamera hingefahren. Etwas zu spät abends und zu weit weg. Aber sie können mir nicht entkommen, das Wasserwerksgelände ist gut eingezäunt 😉
Die Hummel
Aussage:
Die Hummel hat ein Gewicht von 1,2 Gramm bei einer Flügelfläche von 0,7 cm2.
Nach den Gesetzen der Aerodynamik kann die Hummel nicht fliegen.
Die Hummel weiß das nicht, die fliegt einfach.
Ableitungen:
bringe der Hummel Aerodynamik bei und sie stürzt ab.
So lange du nicht weißt was du tust, glaubst du, du kannst fliegen.
Piloten wissen nicht, was sie tun, denn sie fliegen.
Wer nicht weiß was er tut, ist dick, schwarz-gelb und brummt.
Apache als Exchange OWA Reverse Proxy
Da Microsoft den TMG aka ISA zu 2015 einstellen will und eine Loadbalancer als Reverse Proxy etwas übertrieben ist, baue ich dafür immer wieder mal einen Apache mit mod_proxy. Und weil ich mir das nicht immer zusammensuchen will, hier wieder ein Artikel nur für mich selbst *g*
Zum Einsatz kommt ein Linux nach Wahl mit Apache und einigen Module. (mod_ssl, mod_proxy, mod_proxy_connect, mod_proxy_html, mod_headers, mod_deflate)
Dann noch etwas Konfiguration und fertig ist der einfache Proxy.
Der Exchange wird hier unter der IP: 192.168.111.2 betrieben.
Es werden nur die Verzeichnisse /owa, /ecp und /Microsoft-Server-ActiveSync weitergereicht.
Zum Weiterreichen von /ews (Exchange web Services) sind noch einige Anpassungen notwendig, da der Apache ab Version 2.0.55 mit dem Chunked Header ein Problem hat.
### Host auf 80 mit Redirects ### <VirtualHost *:80> ServerName server.domain.tld ServerAlias www.domain.tld ServerAlias mail.domain.tld ServerAdmin webmaster@domain.tld ErrorLog /var/log/apache2/error.log CustomLog /var/log/apache2/access.log combined Header always set X-Frame-Options SAMEORIGIN Header set Server Apache Header unset X-AspNet-Version Header unset X-OWA-Version Header unset X-Powered-By ProxyRequests Off RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^/owa(.*) https://www.domain.tld/owa$1 [R,L] RewriteRule ^/ecp(.*) https://www.domain.tld/ecp$1 [R,L] RewriteRule ^/Microsoft-Server-ActiveSync(.*) https://www.domain.tld/Microsoft-Server-ActiveSync$1 [R,L] DocumentRoot /var/www <Directory /> Order deny,allow Deny from all </Directory> <Directory /var/www> DirectoryIndex index.php index.html Options -Indexes +FollowSymLinks Order allow,deny Allow from all </Directory> <Proxy *> Order deny,allow Allow from all </Proxy> </VirtualHost> ### SSL Host ### <IfModule mod_ssl.c> <VirtualHost *:443> ServerName www.domain.tld ServerAdmin webmaster@domain.tld ErrorLog /var/log/apache2/error.log CustomLog /var/log/apache2/access.log combined Header always set X-Frame-Options SAMEORIGIN Header set Server Apache Header unset X-AspNet-Version Header unset X-OWA-Version Header unset X-Powered-By ProxyRequests Off ProxyPreserveHost On SSLProxyEngine On # owa ProxyPass /owa https://192.168.111.2/owa ProxyPassReverse /owa https://192.168.111.2/owa # ecp ProxyPass /ecp https://192.168.111.2/ecp ProxyPassReverse /ecp https://192.168.111.2/ecp # Microsoft-Server-ActiveSync ProxyPass /Microsoft-Server-ActiveSync https://192.168.111.2/Microsoft-Server-ActiveSync ProxyPassReverse /Microsoft-Server-ActiveSync https://192.168.111.2/Microsoft-Server-ActiveSync DocumentRoot /var/www <Directory /> Order deny,allow Deny from all </Directory> <Directory /var/www> DirectoryIndex index.php index.html Options -Indexes +FollowSymLinks Order allow,deny Allow from all </Directory> <Proxy *> SetEnv proxy-nokeepalive 1 SetEnv force-proxy-request-1.0 1 Order deny,allow Allow from all </Proxy> SSLEngine on SSLCertificateFile /etc/ssl/certs/www.domain.tld.pem SSLCertificateKeyFile /etc/ssl/private/www.domain.tld.key BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 # MSIE 7 and newer should be able to use keepalive BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown # old Server config #BrowserMatch ".*MSIE.*" \ # nokeepalive ssl-unclean-shutdown \ # downgrade-1.0 force-response-1.0 </VirtualHost> </IfModule>
Weitere Links dazu im Netz
http://www.msxfaq.de/internet/apache.htm
http://geekerrific.blogspot.de/2010/08/exchange-2010-cas-apache-2-reverse.html
Nagios + check_mk Part 2 – jmx4perl
heute noch die Grundkonfiguration von JMX4PERL von ConSol
Die gute Nachricht der aktuellen Version (OMD 0.56), man muss im Java Container (Tomcat) den JMX Remote Port nicht mehr aktivieren. Die schlechte Nachricht, man muss ein kleines WAR Paket „jolokia“ deployen.
http://www.jolokia.org/download.html
Im Tomcat kann/sollte man dafür Authentifizierung aktivieren. Über die URL http://server.domain.tld:xxxx/j4p sollte dann eine JSON formatierte Ausgabe an Daten erscheinen.
Dann die config Dateien für jmx4perl anpassen:
etc/jmx4perl/server.cfg
<Server localhost> Url http://localhost:8090/j4p </Server>
etc/jmx4perl/jmx4perl.cfg
# Simple Check: <Check j4p_memory_heap> Use memory_heap Critical 95 Warning 90 </Check> <Check j4p_thread_count> Use thread_count Critical 1000 Warning 800 </Check>
Dann sollte ein Aufruf von „jmx4perl http://localhost:8090/j4p“ diverse Informationen zum Tomcat liefern.
checks:
check_jmx4perl --config $USER5$/jmx4perl/jmx4perl.cfg --server $HOSTNAME$ --check j4p_memory_heap check_jmx4perl --config $USER5$/jmx4perl/jmx4perl.cfg --server $HOSTNAME$ --check j4p_thread_count
Nagios + check_mk Part 1 – ESXi
Diese Blogposts sind eigentlich nur für mich, um ein paar Konfigurationen zu dokumentieren 😉
Benutzt wird das check_esx.pl von op5 http://www.op5.org/community/plugin-inventory/op5-projects/check-esx-plugin
Check Kommand Definitionen sind sowohl in der commands.cfg von Nagios als auch in der main.mk gültig:
extra_nagios_conf += r""" // place legacy check commands here """
define command{ command_name check-esx-datacenter command_line $USER2$/check_esx.pl -D 'vcenter' --extra-opts=check_esxi@/opt/omd/sites/nag/etc/nagios/plugins.ini -l $ARG1$ } define command{ command_name check-esx-vm command_line $USER2$/check_esx.pl -D 'vcenter' -N $ARG1$ -l $ARG2$ --extra-opts=check_esxi@/opt/omd/sites/nag/etc/nagios/plugins.ini } define command{ command_name check-esx-host command_line $USER2$/check_esx.pl -H $HOSTADDRESS$ -l $ARG1$ --extra-opts=check_esxi_host@/opt/omd/sites/nag/etc/nagios/plugins.ini } define command{ command_name check-esx-host-sub command_line $USER2$/check_esx.pl -H $HOSTADDRESS$ -l $ARG1$ -s $ARG2$ <a>--extra-opts=check_esxi_host@/opt/omd/sites/nag/etc/nagios/plugins.ini</a> }
legacy_checks Definition in der main.mk:
legacy_checks = [ (( "check-esx-datacenter!runtime", "ESXi VCenter Runtime", True ), [ "vcenter" ] ), (( "check-esx-host!cpu", "ESXi Host CPU", True ), [ "esx" ], ALL_HOSTS ), (( "check-esx-host!mem", "ESXi Host Speicher", True ), [ "esx" ], ALL_HOSTS ), (( "check-esx-host!net", "ESXi Host Netzwerk", True ), [ "esx" ], ALL_HOSTS ), (( "check-esx-host!io", "ESXi Host IO", True ), [ "esx" ], ALL_HOSTS ), (( "check-esx-host!runtime", "ESXi Host Runtime", True ), [ "esx", ALL_HOSTS ] ), (( "check-esx-host!vmfs", "ESXi Host vmfs", True ), [ "esx" ], ALL_HOSTS ), (( "check-esx-host!service", "ESXi Host Service", False ), [ "esx" ], ALL_HOSTS ), (( "check-esx-host-sub!vmfs!ISOStore", "ESXi Host ISO Store", True ), [ "esxi" ], ALL_HOSTS ), (( "check-esx-host-sub!vmfs!VMStore1", "ESXi Host VM Store 1", True ), [ "esxi" ], ALL_HOSTS ), (( "check-esx-host-sub!vmfs!VMStore2", "ESXi Host VM Store 2", True ), [ "esxi" ], ALL_HOSTS ), (( "check-esx-host-sub!vmfs!VMStore3", "ESXi Host VM Store 3", True ), [ "esxi" ], ALL_HOSTS ), ]
plugin.ini:
[check_esxi] username=DOMAIN\Nagios password=geheimespasswort [check_esxi_host] username=root password=nochvielgeheimer
Limit Postfix E-Mails pro Stunde
Nachdem aus dem OTRS in der Nacht 25.000 E-Mails versand wurden, hatte uns unser Provider vorübergehend auf seinen Relay Servern blacklistet.
Um solche nächtliche Überraschungen künftig zu vermeiden, habe ich einen Policy Server für Postfix geschrieben. Dieser wird auf dem ausgehenden Mail Relay eingebunden und gibt nach 750 E-Mails pro Stunde dem Exchange DEFER zurück gibt, worauf dieser die Mails in seiner Queue behält.
Der Policy Server liest aus der Datei /tmp/postfix-counter den aktuellen Count und den Timestamp des letzten Counterreset. Ist der Timestamp älter als eine Stunde, wird der Counter auf 1 gesetzt, sonst um 1 erhöht und wieder in die Datei zurückgeschrieben.
Zur Überwachung habe ich einen einfachen Nagios Check geschrieben, welcher den Counter ausliest, die Anzahl Mails prüft und als Performancedaten ausgibt. Die enstandenen PNP Graphen sehen dann wie Sägezähne aus.
Im Postfix wird das Ganze in der main.cf eingebunden.
smtpd_recipient_restrictions = permit_mynetworks check_policy_service inet:127.0.0.1:8895 reject_unauth_destination
#! /usr/bin/perl -W # based on sample from Postfix Page use strict; use Errno; use IO::Select; use IO::File; my $fds; my $flog; my $conffile; my %times = (); my $maxcount = 750; # max mail per hour sub init_sockets; # initialize anything (database etc) sub init() { $fds = IO::Select->new() or die "unable to create IO::Select object\n"; init_sockets('inet:127.0.0.1:8895'); use IO::File; $flog = IO::File->new("/tmp/smtpd-policy.log", 'a'); } init(); sub request($;$) { my ($attr,$sock) = @_; my $act = 'DUNNO'; my $now = time; open(FILE, "/tmp/postfix-counter"); while(<FILE>){ chomp($_); my ($key, $val) = split(/:/, $_); $times{$key} = $val; } close(FILE); if ($times{'1htime'} + 3600 > $now){ if ($times{'1hcount'} < $maxcount){ my $tmp = $times{'1hcount'}; $tmp = $tmp + 1; $times{'1hcount'} = $tmp; $act = 'OK'; $times{'now'} = $now; }else{ $act = 'DEFER to many mail'; $times{'now'} = $now; } }else{ $times{'1htime'} = $now; $times{'1hcount'} = 1; $act = 'OK'; $times{'now'} = $now; } open(FILE, ">/tmp/postfix-counter"); for my $key ( keys %times ) { my $value = $times{$key}; print FILE "$key:$value\n"; } close(FILE); if (defined $flog) { $flog->print("request:"); $flog->print(" $_=$attr->{$_}") foreach keys %$attr; $flog->print(" action=$act\n"); $flog->flush; } $act; } sub request_cb($) { my $s = shift; my $r = ${*$s}{attrs} || ( ${*$s}{attrs} = {} ); for(;;) { $_ = $s->getline; unless (defined $_) { $fds->remove($s) unless $!{EAGAIN}; return; } if (/^([a-zA-Z_]+)=([^\r\n]*)\r?\n$/) { $r->{$1} = $2; } elsif (/^\r?\n$/) { last; } else { $r->{error} = 1; } } ${*$s}{attrs} = undef; my $act; if ($r->{error}) { $act = 'ERROR unknown request line'; } elsif (!exists($r->{request}) || $r->{request} ne 'smtpd_access_policy') { $act = 'ERROR required request attribute is not present'; } else { $act = request($r); unless (defined $act) { $fds->remove($s); return; } } $s->print("action=$act\n\n") or $fds->remove($s); } sub accept_cb($) { my $ls = shift; my $s = $ls->accept; if ($s) { $s->blocking(0); ${*$s}{cb} = \&request_cb; $fds->add($s); } } sub init_sockets { foreach my $sock ( @_ ) { my $s; if ($sock =~ /^inet:([^:]+:.+)$/i) { use IO::Socket::INET; $s = IO::Socket::INET->new( LocalAddr => $1, Proto => 'tcp', Type => SOCK_STREAM, Listen => 5, ReuseAddr => 1, ); } elsif ($sock =~ /^unix:(.+)$/) { use IO::Socket::UNIX; unlink $1; $s = IO::Socket::UNIX->new( Type => SOCK_STREAM, Local => $1, Listen => 5, ); } else { die "invalid listening point specification: $sock\n"; } die "unable to create listening socket for $sock: $!\n" unless $s; $s->blocking(0); ${*$s}{cb} = \&accept_cb; $fds->add($s); } } for(;;) { foreach my $s ( $fds->can_read() ) { &{${*$s}{cb}}($s); } }
- « Vorherige Seite
- 1
- …
- 4
- 5
- 6
- 7
- 8
- …
- 11
- Nächste Seite »