⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 verify.in

📁 This a good VPN source
💻 IN
字号:
#!/usr/bin/perl# mail OE DNS RR info to relevent administrator## Copyright (C) 2003 Sam Sgro <sam@freeswan.org> ## Based on "verify" from the FreeS/WAN distribution, (C) 2001 Michael # Richardson <mcr@freeswan.org>## This program is free software; you can redistribute it and/or modify it# under the terms of the GNU General Public License as published by the# Free Software Foundation; either version 2 of the License, or (at your# option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.## This program is distributed in the hope that it will be useful, but# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License# for more details.$me="ipsec verify";$ENV{'PATH'}="/sbin:/usr/bin:/usr/local/sbin:@IPSEC_SBINDIR@:$ENV{'PATH'}";if($ENV{'IPSEC_CONFS'}) { $conf=$ENV{'IPSEC_CONFS'} } else { $conf= `ipsec --confdir`; chomp($conf); }$print_depricacted=0;# Should we print in colour by default?$ctype=`/sbin/consoletype`;if ( $ctype && !($ctype eq "serial")){    $colour="1";}sub printfun {  print sprintf("%-65s",@_);}# capture STDOUT as @out, STDERR as @err with no temp files.sub run {    $command=shift;    pipe child_read, parent_write;     pipe parent_read, child_write;    pipe err_read, err_write;         $mypid=fork;    if($mypid)    {	close child_write; close err_write;	@out=<parent_read>;	@err=<err_read>;    }    else     {         close parent_read; close parent_write;	open STDOUT,">&child_write";         open STDERR,">&err_write";        exec $command; print STDERR "Cannot execute command \"$command\": $!\n";    }}# Code to print out [OK], [FAILED].sub errchk {	if (!shift(@_)) 	{	    print "\t[";	    if($colour) { print "\e[1;31m"; } 	    if(@_) 	    { 		print "@_"; 	    } 	    else 	    { 		print "FAILED"; 	    }	    if($colour) { print "\e[0;39m"; } 	    print "]\n";	    if(@err) 	    { 		print @err; 	    }	}	else	{	    	    print "\t[";	    if($colour) { print "\e[1;32m"; } 	    print "OK";	    if($colour) { print "\e[0;39m"; } 	    print "]\n";        }}# Code to print out [DEPRECATED] and key restrict messagesub deprecated {    print "\t[";    if($colour) { print "\e[1;33m"; }     print "DEPRECATED";    if($colour) { print "\e[0;39m"; }     print "]\n";}# Verification routines begin here...## Check DNS Configuration based on a hostname# $1 = Hostname (string)# eg: checkdnshost oetest.freeswan.orgsub checkdnshost {    run "host -t key $_[0]";    ($keypresent)=grep /(0x4200|16896)/, @out;    if($keypresent)     { 	printfun "   Looking for KEY in forward dns zone: $_[0]";	deprecated;     }    printfun "   Looking for TXT in forward dns zone: $_[0]";    run "host -t txt $_[0]";    ($txtpresent)=grep /X-IPsec-Server/,@out;    errchk "$txtpresent", "MISSING";}# Check DNS Configuration based on IP address# $1 = IP Address (string)# eg: checkdnsip 127.0.0.2sub checkdnsip {    $fortxt=$_[0];    $revtxt=join('.',reverse(split(/\./, $fortxt))).".in-addr.arpa.";    printfun "   Looking for TXT in reverse dns zone: $revtxt";    run "host -t txt $revtxt";    ($txtpresent)=grep /X-IPsec-Server/,@out;    errchk "$txtpresent", "MISSING";    if($txtpresent) {	$txtpresent=~ s/.*X-IPsec-Server\([0-9].*\)=//; $txtpresent=~ s/[\"\ ].*//;	$gwip=$txtpresent;	chomp($gwip);	$gwrev=join('.',reverse(split(/\./, $gwip))).".in-addr.arpa.";	# Check for a KEY record for the indicated IPSec GW.	run "host -t key $gwrev";	($keypresent)=grep /(0x4200|16896)/, @out;	if($keypresent) 	{ 	    printfun "   Looking for KEY in reverse dns zone: $gwrev";	    deprecated; 	    $print_deprecated = 1; 	}	# If the host is its own gateway, then we know we've got a TXT record.	if($gwip ne $fortxt) {		    printfun "Looking for TXT in reverse dns zone: $gwrev";	    run "host -t txt $gwrev";	    ($txtpresent)=grep /X-IPsec-Server/,@out;	    errchk "$txtpresent", "MISSING";	}    }}sub udp500check {    run "netstat -an";    # Flaw: Only taking the first IP address found listening...    ($listen)=grep /:500/, @out;    if(!$listen)    { 	printfun "Pluto not listening on port udp 500. Check interfaces defintion in ipsec.conf.";	    }    else    {	( $rest, $rest, $rest, $defaultsrcip, $rest)=split(' ',$listen); 	$defaultsrcip=~ s/:500//;	run "/bin/ls /proc/sys/net/ipv4/conf";	foreach $net (grep !/(lo|all|default|ipsec|vmnet)/, @check=@out)	{	    if ( -e "/proc/net/ip_fwchains" )	    {		chomp($net);		printfun "Checking IPchains port 500 hole ($defaultsrcip on $net)";		run "ipchains --check input -p udp --src $defaultsrcip 500 --dst 2.3.4.5 500 -i $net";		chomp($out[0]);		if( $out[0] eq "accepted" ) { errchk "$out[0]"; } else { errchk "","BLOCKED"; }	    }	    elsif( -e "/proc/net/ip_tables_names" )	    {		# iptables --check will never happen, hack it outselves		# use tcpdump? nmap? custom rule? at least check outgoing 500? ping outside activeOE box?		# print "Cannot check if IPtables has port 500 hole ($defaultsrcip on $net)";	    }	}    }}sub checktunnel {    $csource=$_[0]; $cdest=$_[1]; $ctun=$_[2]; $all="0.0.0.0/0";    printfun "Checking $ctun from $csource to $cdest";    run "iptables -t nat -L POSTROUTING -n";    @out=grep !/(Chain POSTROUTING|target)/, @out;    foreach (@out) {	( $target, $prot, $opt, $source, $dest ) = split(' ',$_);	if(((($source eq $csource) || ($source eq $all)) && (($dest eq $cdest) || ($dest = $all))) && $target eq "ACCEPT")	{ 	    errchk "@out";	}	else	{	    @err="$target from $source to $dest kills tunnel $source -> $cdest\n";	    errchk "","FAILED";	}    }}sub installstartcheck {	print "Checking your system to see if IPsec got installed and started correctly:\n";	printfun "Version check and ipsec on-path";	run "ipsec --version";	errchk "@out";	print grep /Linux/, @out;        printfun "Checking for IPsec support in kernel";	if ( -e "/proc/net/ipsec_eroute" || -e "/proc/net/pfkey" ) { $test="1" }	errchk "$test";	printfun "Checking for RSA private key ($conf/ipsec.secrets)";	run "ipsec showhostkey --txt 1.1.1.1";	errchk @out;		# Wouldn't this test fail if your mucked up your interface definition?	printfun "Checking that pluto is running";	run "ipsec whack --status";	errchk "@out";	if (grep /interface/, @out)	{	    udp500check;	}}sub tunnelchecks {    open("dev", "/proc/net/dev");    if((grep !/(ipsec|lo:|Inter|packets)/, <dev>) > 1)     {	printfun "Two or more interfaces found, checking IP forwarding";        open("cat", "/proc/sys/net/ipv4/ip_forward");	if(<cat> == "0") 	{ 	    errchk ""; 	} 	else 	{	    errchk "@out";	    printfun "Checking NAT and MASQUERADEing";	    if( -e "/proc/net/ip_conntrack" )	    {		run "iptables -t nat -L -n";		if(grep /(NAT|MASQ)/, @out)		{		    printf "\n";		    open("cat", "/proc/net/ipsec_eroute");		    foreach(grep /tun0x/, <cat>)		    {      			@eroute=split(' ',$_);			checktunnel $eroute[1], $eroute[3], $eroute[5];		    }		}		else		{		    errchk "1";		}	    }	    else	    { 		errchk "","N/A";	    }	}    }}sub cmdchecks {    # check for vital commands    printfun "Checking for 'ip' command";    run "which ip";    errchk "@out";    printfun "Checking for 'iptables' command";    run "which iptables";    errchk "@out";    open("cat","/etc/ipsec.conf");    foreach(grep /crlcheckinterval/,<cat>)     {      if(!$curlcheckdone) {              $curlcheckdone=1;              printfun "Checking for 'curl' command for CRL fetching";              run "which curl";              errchk "@out";             }     }    if ( -e "/proc/net/pfkey") {       printfun "Checking for 'setkey' command for NETKEY IPsec stack support";       run "which setkey";       errchk "@out";    }}    sub dnschecks {    # Check the running hostname.    printf "\nOpportunistic Encryption DNS checks:\n";    run "hostname";     ($hostname)=@out; chomp $hostname;    checkdnshost $hostname;        # Check all the public IP addresses...    run "/sbin/ifconfig -a";    foreach (grep /inet addr/,@out)    {	$_=~ s/^\s*//;        @temp=split(/[:\ ]+/, $_);	push(@address,$temp[2]);    }    # Purge all non-routeable IPs...    @address=grep !/^(127.*|10.*|172.1[6789]+.*.*|172.2+.*.*|172.3[01]+.*.*|192.168.*.*|169.254.*.*)/,@address;    printfun "   Does the machine have at least one non-private address?";    errchk @address;    foreach(@address=grep !$check{$_}++,@address)    {	checkdnsip $_;    }}# Main function begins here!# Harvest options, ensure they're valid.use Getopt::Long;%optctl = ("host" => \$hostname,"ip" => \$ip, "colour" => \$colour);GetOptions(\%optctl, "host=s" ,"ip=s", "colour!");# Exit if we get passed an option we don't recognize.if($Getopt::Long::error) { exit; }# If you've passed --host or --ip, do only those checks.if($hostname || $ip){# Check this --host for OE.    if($hostname)    {	printf "Checking $hostname for Opportunistic Encryption:\n";	checkdnshost $hostname;	run "host -t A $hostname";	if(($ipaddr) = grep (/address/i, @out))	{	    $ipaddr=~ s/.*address\ //;	    chomp $ipaddr;	    checkdnsip $ipaddr;	}	else	{	    printf "$hostname does not resolve to an IP, no reverse lookup tests possible.\n";	}    }# Check this IP for OE.    if($ip)    {	printf "Checking IP $ip for Opportunistic Encryption:\n";	checkdnsip $ip;    }}else{    # Call the default routines...    # Root check...    if($> != "0")     {	print "To check this machine, you need to run \"$me\" as root.\n"; exit;    }    else    {	installstartcheck;	tunnelchecks;	cmdchecks;	dnschecks;        if($print_deprecated)        {        print "   RFC 3445 restricts the use of the KEY RR to DNSSEC applications. The use of    a KEY record sub-type for Opporunistic Encryption (OE) has been deprecated.   TXT records are used to provide all OE functionality.   For more information on these changes, see:   http://www.freeswan.org/freeswan_snaps/CURRENT-SNAP/doc/upgrading.html\n\n";        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -