Software |
DMX4Linux Driver Suite for Linux |
csv2iif.pl suite convert PayPal transactions to IIF, OFX, QIF |
Hardware |
DMX30 Interface 128Ch SPP |
DMX43 Interface 2out 2in EPP |
LED Hardware for Linux and Windows |
EPROM Sampler for 8 bits of sound |
Misc |
CatWeasel Linux drivers for MK3/4 PCI |
pg_trompe PostgreSQL replication |
trycatch C exception/signal handling lib |
Patches to various software |
Tools and small scripts |
Docs misc documents |
Links to lighting stuff |
sshhackfilterThis is my perl script solution to set Linux iptables rules when remote hosts try to login into SSH accounts on your computer. It reads the syslog. #!/usr/bin/env perl use vars qw(%ip %iplast $blocked $interface $prog); my $logfile="/var/log/messages"; $interface="ppp0"; ###################################################################### use strict; $prog="sshhackfilter["."$$]"; my $run=1; open(A, "tail -f $logfile|") or die "could not tail $logfile"; END { close(A); foreach my $i (keys %ip) { if($ip{$i}>=10) { unblock($i); } } system("logger -t $prog exit. Blocked $blocked IPs"); } sub sighandler { $run=0; system("logger -t $prog caught a signal"); } $SIG{HUP} = \&sighandler; $SIG{INT} = \&sighandler; $SIG{TERM} = \&sighandler; sub usrhandler { my @k=keys %ip; system("logger -t $prog blocking 0 IPs") if $#k==-1; foreach my $i (@k) { if($ip{$i}>=10) { system("logger -t $prog blocking $i"); } } } $SIG{USR1} = \&usrhandler; system("logger -t $prog start"); while($run) { while(<A>) { exit 0 unless $run; if(/Failed password for (invalid user)?.+ from (\d+\.\d+\.\d+\.\d+) port \d+ ssh2/) { block($2); } elsif(/ntpd\[\d+\]: sendto\((\d+\.\d+\.\d+\.\d+)\): Invalid argument/) { block($1); } } } sub block { my ($i) = @_; my $t=time(); # after 1day we monitor an ip again if(exists($iplast{$i})) { undef $ip{$i} if $t > $iplast{$i}+86400; } $iplast{$i}=$t; # upon the 10th failed login we block this ip if(++$ip{$i} == 10) { system("iptables -A INPUT -j REJECT -i $interface -s $i"); $blocked++; usrhandler(); } # unblock some old IPs foreach $i (keys %ip) { if($ip{$i}>=10 && $t > $iplast{$i}+86400) { unblock($i); undef $iplast{$i}; undef $ip{$i}; usrhandler(); } } } sub unblock { my ($i) = @_; system("logger -t $prog unblocking IP $i"); system("iptables -D INPUT -j REJECT -i $interface -s $i"); } System startupI use the following startup script to start and stop sshhackfilter as a system service. It utilizes the daemon program for process control. #!/bin/sh # chkconfig: 2345 90 10 # description: sshhackfilter PROG=sshhackfilter case "$1" in start) echo "Starting $PROG" daemon -n ${PROG} /usr/sbin/$(PROG) ;; stop) echo "Stopping $PROG" daemon -n $PROG --stop ;; restart) daemon -n $PROG --stop sleep 3 daemon -n $PROG /usr/sbin/$PROG ;; status) PID=`ps ax|grep $PROG|grep perl|awk '{print $1}'` if [ "$PID" ] ; then kill -s SIGUSR1 $PID logger test sleep 1 ; echo 1 tail /var/log/messages | grep $PROG else echo $PROG seems not running. fi ;; *) echo "Usage: $PROG {start|stop|restart|status}" exit 1 ;; esac |