|  | #!/usr/local/bin/perl | 
|  | # for best results, bring up all your interfaces before running this | 
|  |  | 
|  | if ($^O =~ m/^irix/i) | 
|  | { | 
|  | &irix_mkfilters || regular_mkfilters || die $!; | 
|  | } | 
|  | else | 
|  | { | 
|  | ®ular_mkfilters || irix_mkfilters || die $!; | 
|  | } | 
|  |  | 
|  | foreach $i (keys %ifaces) { | 
|  | $net{$i} = $inet{$i}."/".$netmask{$i} if (defined($inet{$i})); | 
|  | } | 
|  | # | 
|  | # print out route suggestions | 
|  | # | 
|  | print "#\n"; | 
|  | print "# The following routes should be configured, if not already:\n"; | 
|  | print "#\n"; | 
|  | foreach $i (keys %ifaces) { | 
|  | next if (($i =~ /lo/) || !defined($net{$i}) || defined($ppp{$i})); | 
|  | print "# route add $inet{$i} localhost 0\n"; | 
|  | } | 
|  | print "#\n"; | 
|  |  | 
|  | # | 
|  | # print out some generic filters which people should use somewhere near the top | 
|  | # | 
|  | print "block in log quick from any to any with ipopts\n"; | 
|  | print "block in log quick proto tcp from any to any with short\n"; | 
|  |  | 
|  | $grpi = 0; | 
|  |  | 
|  | foreach $i (keys %ifaces) { | 
|  | if (!defined($inet{$i})) { | 
|  | next; | 
|  | } | 
|  |  | 
|  | $grpi += 100; | 
|  | $grpo = $grpi + 50; | 
|  |  | 
|  | if ($i !~ /lo/) { | 
|  | print "pass out on $i all head $grpo\n"; | 
|  | print "block out from 127.0.0.0/8 to any group $grpo\n"; | 
|  | print "block out from any to 127.0.0.0/8 group $grpo\n"; | 
|  | print "block out from any to $inet{$i}/32 group $grpo\n"; | 
|  | print "pass in on $i all head $grpi\n"; | 
|  | print "block in from 127.0.0.0/8 to any group $grpi\n"; | 
|  | print "block in from $inet{$i}/32 to any group $grpi\n"; | 
|  | foreach $j (keys %ifaces) { | 
|  | if ($i ne $j && $j !~ /^lo/ && defined($net{$j})) { | 
|  | print "block in from $net{$j} to any group $grpi\n"; | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | sub irix_mkfilters | 
|  | { | 
|  | open(NETSTAT, "/usr/etc/netstat -i|") || return 0; | 
|  |  | 
|  | while (defined($line = <NETSTAT>)) | 
|  | { | 
|  | if ($line =~ m/^Name/) | 
|  | { | 
|  | next; | 
|  | } | 
|  | elsif ($line =~ m/^(\S+)/) | 
|  | { | 
|  | open(I, "/usr/etc/ifconfig $1|") || return 0; | 
|  | &scan_ifconfig; | 
|  | close I;		# being neat... - Allen | 
|  | } | 
|  | } | 
|  | close NETSTAT;			# again, being neat... - Allen | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | sub regular_mkfilters | 
|  | { | 
|  | open(I, "ifconfig -a|") || return 0; | 
|  | &scan_ifconfig; | 
|  | close I;			# being neat... - Allen | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | sub scan_ifconfig | 
|  | { | 
|  | while (<I>) { | 
|  | chop; | 
|  | if (/^[a-zA-Z]+\d+:/) { | 
|  | ($iface = $_) =~ s/^([a-zA-Z]+\d+).*/$1/; | 
|  | $ifaces{$iface} = $iface; | 
|  | next; | 
|  | } | 
|  | if (/inet/) { | 
|  | if (/\-\-\>/) { # PPP, (SLIP?) | 
|  | ($inet{$iface} = $_) =~ s/.*inet ([^ ]+) \-\-\> ([^ ]+).*/$1/; | 
|  | ($ppp{$iface} = $_) =~ s/.*inet ([^ ]+) \-\-\> ([^ ]+).*/$2/; | 
|  | } else { | 
|  | ($inet{$iface} = $_) =~ s/.*inet ([^ ]+).*/$1/; | 
|  | } | 
|  | } | 
|  | if (/netmask/) { | 
|  | ($mask = $_) =~ s/.*netmask ([^ ]+).*/$1/; | 
|  | $mask =~ s/^/0x/ if ($mask =~ /^[0-9a-f]*$/); | 
|  | $netmask{$iface} = $mask; | 
|  | } | 
|  | if (/broadcast/) { | 
|  | ($bcast{$iface} = $_) =~ s/.*broadcast ([^ ]+).*/$1/; | 
|  | } | 
|  | } | 
|  | } | 
|  |  |