#!/bin/bash # estensioni possibili: # gestire più connessioni dallo stesso client # facilitare il kill facendo scrivere il pid a toctoc da qualche parte IPROUTER=10.1.1.254 function debug() { # commentare per disattivare l'output diagnostico # o a piacere sostituire con logger... echo "$@" >&2 } function elenca_connessioni() { # riporta l'elenco degli IP (e porta?) connessi in ssh al router ss -nt | egrep "^ESTAB.*$IPROUTER:22[[:space:]]" | awk '{ print $5 }' | cut -f1 -d: } function snmp_check() { snmpwalk -v 1 -c public $1 .1.3.6.1.4.1.2021.2 > /tmp/snmp.$$ # individua quale riga della tabella si riferisce a rsyslogd RIGA=$(egrep "prNames.*rsyslogd" /tmp/snmp.$$ | awk -F "prNames." '{ print $2 }' | awk '{ print $1 }') # il comando seguente ritorna exit code 0 (true) se c'è match, senza produrre output: ideale per l'uso con if grep -q "prErrorFlag.$RIGA = INTEGER: noError(0)" /tmp/snmp.$$ } function abilita_traffico() { # consentano al client ($1) di attraversare il router solo per connettersi al server ($2) sulla porta remota ($3) specificata nel file. Porre attenzione alla direzione delle connessioni. Vista la limitazione di traffico sui server, mascherare i pacchetti che dai client attraversano router. debug abilitazione traffico da $1 a $2:$3 /root/openclose.sh I $1 $2 $3 # # innesco la chiusura della connessione e memorizzo il job id in un file # echo "/root/openclose.sh D $1 $2 $3" | at now + 5 minutes 2>&1 | grep ^job | awk '{ print $2 }' > /tmp/timer_$1_$2_$3 debug attivato watchdog con at job id $(cat /tmp/timer_$1_$2_$3) } function chiudi_connessione () { # cancellare il file creato dal client e disconnettere forzatamente la connessione ssh agendo sul server sshd debug rimozione /tmp/$1 rm -f /tmp/$1 ss -ntp | egrep "^ESTAB.*$IPROUTER:22[^0-9]+$1:" | awk -F '\(\(' '{ print $2 }' | sed -e 's/pid=/\n/g' | grep '^[1-9]' | cut -f1 -d, | while read P ; do debug termino $P per chiudere la connessione kill -9 $P done # potrei usare pid negativo per killare l'intero process group } while sleep 5 ; do for IP in $(elenca_connessioni) ; do debug trovata connessione da $IP if test -f /tmp/$IP ; then debug trovato file corrispondente /tmp/$IP SERVER=$(cat /tmp/$IP | cut -f1 -d' ') if snmp_check $SERVER ; then debug snmp check positivo su $SERVER PORTA=$(cat /tmp/$IP | cut -f2 -d' ') abilita_traffico $IP $SERVER $PORTA chiudi_connessione $IP fi fi done done