Z praktyki wiem, że czasami przychodzi nam monitorować sieć do której nie posiadamy bezpośredniego dostępu. Dziwnie to brzmi, ale zdarza się gdy na przykład mamy dostęp tylko do jednego hosta w sieci i inny ruch przychodzący z zewnątrz jest wycinany na firewallu. W takim przypadku można się posłużyć pewną sztuczką wykorzystującą stare, dobre ssh.
Aby tego dokonać należy się upewnić, że na urządzeniu do którego mamy dostęp uruchomiony jest serwer ssh. Polecenie sprawdzające, czy host w danej podsieci żyje i ma się dobrze jest następujące:
ssh IPserwera ping IPhosta
Wymiana kluczy publicznych ssh
Aby ping zadziałał należy zalogować się na serwer. Chcąc zautomatyzować to zadanie należy wymienić klucze z serwerem. W tym celu na stacji z której będziemy odpytywać hosty wykonujemy polecenie:
Klucz prywatny został zapisany w pliku /home/user/.ssh/id_rsa . Oczywiście tego pliku nie udostępniamy nikomu. Natomiast klucz publiczny znajdujący się w /home/user/.ssh/id_rsa.pub przesyłamy na zdalny serwer używając w tym celu polecenia:
Po tych zabiegach mamy dostęp do serwera bez konieczności wpisywania hasła.
Po wykonaniu polecenia
otrzymujemy :
Problemem jest wyrzucana na konsolę „wizytówka” hosta przez który się łączymy:
Aby się tego pozbyć należy dodać do ssh opcję -q (quiet).
Nasze polecenie nabiera realnych kształtów jeszcze tylko dodamy opcję timeoutu, aby nie czekać zbyt długo na nawiązanie połączenia ssh i gotowe:
Powyższe polecenie to rdzeń naszego skryptu sprawdzającego dostępność hostów w sieci. Tak naprawdę cała reszta to parsowanie wyniku w celu porównania z wpisanymi przez nas progami.
Pora na skrypt tradycyjnie pisany w perlu, który jak wiadomo stworzony jest do parsowania:
Tak przygotowany skrypt wystarczy dodać do op5 Monitora. Dzięki podawanym argumentom uzyskujemy dość uniwersalny sposób na radzenie sobie z opisaną na wstępie sytuacją.
Po skopiowaniu naszego skryptu w odpowiednie miejsce przechodzimy do aplikacji op5 Monitor wybierając zakładkę Configure. Następnie przechodzimy do Commands:
W polu command_line wpisujemy ścieżkę do skryptu wraz z odpowiednimi parametrami.
Zmienna $ARG1$ odpowiada za adres serwera ssh, $HOSTADDRESS$ za adres IP hosta $ARG2$ za ilość wysłanych pingów $ARG3$ za próg ostrzeżenia. Ostatnia zmienna odpowiedzialna jest za critical level. Po dodaniu hostów naszym oczom ukazuje się taki oto widok:
Aby tego dokonać należy się upewnić, że na urządzeniu do którego mamy dostęp uruchomiony jest serwer ssh. Polecenie sprawdzające, czy host w danej podsieci żyje i ma się dobrze jest następujące:
ssh IPserwera ping IPhosta
Wymiana kluczy publicznych ssh
Aby ping zadziałał należy zalogować się na serwer. Chcąc zautomatyzować to zadanie należy wymienić klucze z serwerem. W tym celu na stacji z której będziemy odpytywać hosty wykonujemy polecenie:
KOD: ZAZNACZ CAŁY
Code:
user@host:~> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
66:23:50:0e:76:c1:d0:c7:9e:5e:5a:65:78:20:5c:fb user@host.example.com
The key's randomart image is:
+--[ RSA 2048]----+
| o++X. |
| E= O |
| . O . |
| = + . |
| o + S |
| + + . |
| o |
| |
| |
+-----------------+
Klucz prywatny został zapisany w pliku /home/user/.ssh/id_rsa . Oczywiście tego pliku nie udostępniamy nikomu. Natomiast klucz publiczny znajdujący się w /home/user/.ssh/id_rsa.pub przesyłamy na zdalny serwer używając w tym celu polecenia:
KOD: ZAZNACZ CAŁY
Code:
user@localhost: ssh-copy-id -i ~/.ssh/id_rsa.pub user@serwerssh
Po tych zabiegach mamy dostęp do serwera bez konieczności wpisywania hasła.
Po wykonaniu polecenia
KOD: ZAZNACZ CAŁY
Code:
ssh user@192.168.1.1 ping 192.168.1.7 –c 4
otrzymujemy :
KOD: ZAZNACZ CAŁY
Code:
DD-WRT v24 std (c) 2008 m-NET GmbH
Release: 07/27/08 (SVN revision: 10011)
PING 192.168.1.7 (192.168.1.7): 56 data bytes
64 bytes from 192.168.1.7: seq=0 ttl=64 time=1.071 ms
64 bytes from 192.168.1.7: seq=1 ttl=64 time=0.981 ms
64 bytes from 192.168.1.7: seq=0 ttl=64 time=1.131 ms
64 bytes from 192.168.1.7: seq=1 ttl=64 time=0.962 ms
--- 192.168.1.7 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.939/1.001/1.131 ms
Problemem jest wyrzucana na konsolę „wizytówka” hosta przez który się łączymy:
KOD: ZAZNACZ CAŁY
Code:
DD-WRT v24 std (c) 2008 NewMedia-NET GmbH
Release: 07/27/08 (SVN revision: 10011)
Aby się tego pozbyć należy dodać do ssh opcję -q (quiet).
Nasze polecenie nabiera realnych kształtów jeszcze tylko dodamy opcję timeoutu, aby nie czekać zbyt długo na nawiązanie połączenia ssh i gotowe:
KOD: ZAZNACZ CAŁY
Code:
ssh -o ConnectTimeout=5 –q user@192.168.1.1 ping 192.168.1.7 –c 4
Powyższe polecenie to rdzeń naszego skryptu sprawdzającego dostępność hostów w sieci. Tak naprawdę cała reszta to parsowanie wyniku w celu porównania z wpisanymi przez nas progami.
Pora na skrypt tradycyjnie pisany w perlu, który jak wiadomo stworzony jest do parsowania:
KOD: ZAZNACZ CAŁY
Code:
#!/usr/bin/perl
use strict;
use utils qw (%ERRORS $TIMEOUT);
use Getopt::Long;
my ($opt_h, $opt_ssh, $opt_w, $opt_c, $opt_ile, $opt_host);
Getopt::Long::Configure("bundling");
my $result=GetOptions(
"H=s" => \$opt_host, "HOST=s" => \$opt_host,
"w=f" => \$opt_w, "warning=f" => \$opt_w,
"c=f" => \$opt_c, "critical=f" => \$opt_c,
"i=i" => \$opt_ile, "ile=i" => \$opt_ile,
"s=s" => \$opt_ssh, "ssh_sever=s" => \$opt_ssh);
if(! $result) {
exit $ERRORS{'UNKNOWN'};
}
if (!defined($opt_host) || !defined($opt_w) || !defined($opt_ile) || !defined($opt_c) || !defined($opt_ssh)){
print_usage();
exit $ERRORS{'OK'};
}
chomp($opt_ssh);
chomp($opt_c);
chomp($opt_w);
chomp($opt_ile);
chomp($opt_host);
my $line;
my $i;
my $ssh_server = 'root@'.$opt_ssh;
my $cmd="/usr/bin/asmonitor ssh -o ConnectTimeout=5 -q $ssh_server ping $opt_host -c $opt_ile";
my @return = `$cmd`;
if(@return == undef){
print "Connection failure\n";
exit(2);
}
for($i = 0;$i<=$#return;$i++){
if($return[$i] =~ /packets transmitted/){
$line = $return[$i];
}
}
my @tempTab = split(",",$line);
my @value = split(" ",$tempTab[-1]);
chop($value[0]);
my $number = $value[0];
my $output = ($number > $opt_c)?2:($number > $opt_w)?1:0;
if($output == 2){
print "CRITICAL :".$line;
exit $output;
}
elsif ($output == 1){
print "WARNING :".$line;
exit $output;
}
else {
print "OK :".$line;
exit $output;
}
sub print_usage(){
print "Usage: $0 -s <ssh server IP> -H <host> -i <how many pings> -w <warn level> -c <crit level> \n";
}
Tak przygotowany skrypt wystarczy dodać do op5 Monitora. Dzięki podawanym argumentom uzyskujemy dość uniwersalny sposób na radzenie sobie z opisaną na wstępie sytuacją.
Po skopiowaniu naszego skryptu w odpowiednie miejsce przechodzimy do aplikacji op5 Monitor wybierając zakładkę Configure. Następnie przechodzimy do Commands:
W polu command_line wpisujemy ścieżkę do skryptu wraz z odpowiednimi parametrami.
KOD: ZAZNACZ CAŁY
Code:
/opt/plugins/custom/nazwa_skryptu -s $ARG1$ -H $HOSTADDRESS$ -i $ARG2$ -w $ARG3$ - c $ARG4$
Zmienna $ARG1$ odpowiada za adres serwera ssh, $HOSTADDRESS$ za adres IP hosta $ARG2$ za ilość wysłanych pingów $ARG3$ za próg ostrzeżenia. Ostatnia zmienna odpowiedzialna jest za critical level. Po dodaniu hostów naszym oczom ukazuje się taki oto widok: