in reply to Re: Questions regarding regular expressions and arrays
in thread Questions regarding regular expressions and arrays

The typical log file entry looks like this (all on one line). Note, the x's replace the real mac and source ip just for anonymity.

Dec 10 13:14:39 mymachine kernel: [74697.914492] IPTABLES:Blacklist: IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=xxx.xxx.xxx.xxx DST=192.168.1.10 LEN=60 TOS=0x00 PREC=0x00 TTL=38 ID=25551 DF PROTO=TCP SPT=53521 DPT=22 WINDOW=14600 RES=0x00 SYN URGP=0

Replies are listed 'Best First'.
Re^3: Questions regarding regular expressions and arrays
by jwkrahn (Abbot) on Dec 13, 2011 at 02:07 UTC

    You could probably use something like this:

    #!/usr/bin/perl use warnings; use strict; # # This script grabs ip addresses from my firewall log file # and adds them to a blacklist for my iptables ruleset. # ## NOTE - This script must be run as root use Socket; # Check to make sure root is running this $< and die "You must run this program as root!\n"; my $log = '/var/log/iptables.log'; my $blacklist = '/var/log/blacklist'; # Open log file, retrieve list of ip addresses and write them # to the blacklist open IN, "<", $log or die "Can not open $log $!"; my %seen; while ( <IN> ) { next unless /\S/; if ( /SRC=([0-9.]+) / ) { next if $1 =~ /^192\.168/; $seen{ inet_aton( $1 ) }++; } } close IN; # Sort my list of IP addresses my @sorted = map inet_ntoa( $_ ), sort keys %seen; # Create clean blacklist file and append iptables rules open BL, '>', $blacklist or die "Cannot open $blacklist $!"; foreach my $ip ( @sorted ) { print BL "$ip\n"; 0 == system '/sbin/iptables', '-A', 'BLACKLIST', '-p', 'all', '-s' +, $ip, '-d', '0/0', '-j', 'LOG', '--log-prefix', 'IPTABLES:Blacklist: + ' or die "system /sbin/iptables failed: $?"; 0 == system '/sbin/iptables', '-A', 'BLACKLIST', '-p', 'all', '-s' +, $ip, '-d', '0/0', '-j', 'DROP' or die "system /sbin/iptables failed: $?"; } close BL; chmod 0600, $blacklist;

      jwkrahn, thank you very much for your suggestion. I need to study the Socket module to understand some of what you suggested.

      Also, the test for root line has me a bit confused so I need to research that as well.

      Finally, I like the format that you used for the system calls. It just seems to be a bit cleaner.

      Again, thank you for your help!