La IOS C837-K9O3Y6-M sviluppata per il router Cisco 837 ha un bug, ovvero è possibile che dopo qualche reload si "dimentichi" di una o più PAT translations che riguardano porte più alte delle well-known (per intenderci, superiori alla 1023).
Nel mio caso, il problema ha iniziato a verificarsi da quando ho deciso di mettere in ascolto SSH su una porta non standard, in modo da risparmiarmi i tentativi di attacco lanciati dagli script kiddie di turno.
Inoltre, per motivi di sicurezza, ho consentito l'accesso via SSH al router solo dagli host della LAN, quindi, nel caso in cui dovessi accedere alla sua configurazione, atterro sul server e da lì mi collego al router.
Ovviamente, se la porta SSH non è forwardata non posso atterrare sul server, dunque l'unica soluzione praticabile consiste nell'andare fisicamente dal cliente e ricreare la regola per il PAT.
E qui viene il bello: poichè mi sono stancato di dover perdere almeno un'ora per andare dal cliente, riconfigurare il tutto e tornarmene a casa, ho deciso di creare il seguente script, il quale si collega al router tre volte al giorno e ricrea la regola per l'SSH.
Ecco lo script:
#!/usr/bin/expect
set password1 "<password1>"
set password2 "<password2>"
spawn ssh -l <username> <IP del router>
expect "*?assword:*"
send "$password1r"
expect ">"
send "enar"
expect "Password:"
send "$password2r"
expect "#"
send "conf tr"
expect "(config)#"
send "no ip nat inside source static tcp <ip> <porta> interface Dialer0 <porta>r"
expect "(config)#"
send "ip nat inside source static tcp <ip> <porta> interface Dialer0 <porta>r"
expect "(config)#"
send "exitr"
expect "#"
send "copy run startr"
expect "?"
send "r"
expect "#"
send "exitr"
expect eof
Come al solito, mancano i backslash prima della r perchè myblog li filtra.
Una volta che avete creato lo script, convertitelo in eseguibile lanciando il comando:
nightfly@nightbox:~$ sudo chmod +x ssh_autoforward
e salvatelo nella directory /usr/bin:
nightfly@nightbox:~$ sudo mv ssh_autoforward /usr/bin
A questo punto potete creare la regola per cron, in modo da schedulare l'esecuzione dello script alle 6, alle 12 ed alle 18:
nightfly@nightbox:~$ sudo nano /etc/crontab
00 06,12,18 * * * root ssh_autoforward
Riavviamo cron:
nightfly@nightbox:~$ sudo service cron restart
ed abbiamo finito.
A presto.
PS: non preoccupatevi se lo script entra in esecuzione mentre siete loggati sul server: la regola per il forward dell'SSH non verrà rimossa poichè la state già utilizzando, quindi niente perdita di connessione.