Voglio fare outing, ho un problema inspiegabile con l'adsl da molto tempo, dopo un numero variabile di minuti riesco solo a navigare su Google, Youtube e pochi altri siti.
Su internet si leggono le soluzioni più fantasiose, passare da PPPoA a PPPoE, cambiare router, cambiare DNS, ma il problema è davvero curioso perché anche se non ho ancora scoperto una causa sensata, almeno riesco ad identificarlo e a risolverlo con un hack/workaround.
Il mistero problema dell'adsl che naviga solo su Google
Il problema si manifesta all'improvviso e senza una motivazione precisa (forse se ci sono più connessioni attive è più probabile) e le caratteristiche sono queste:
- Il DNS funziona, dig risolve come al solito vecchi e nuovi indirizzi
- ping funziona, forse con qualche valore alto ma anche qui ci siamo
- curl -I , anche qui ci siamo restituisce 200 (http)
Anche se si vuole scaricare l'immagine binaria favicon funziona:
curl grigio.org/favicon.ico
<binary data>
Ma a questo punto se ci si collega a grigio.org (esempio) il browser (qualsiasi e su qualsiasi sistema operativo) resterà in attesa per un tempo indefinito e poi ci sarà timeout.
Infatti curl o telnet su una pagina html testuale ha smesso di funzionare e non riceve più i dati!
curl grigio.org -m 13
curl: (28) Operation timed out
L'opzione -m permette di prestabilire la durata del timeout.
Ora la "soluzione" per poter tornare a navigare su qualsiasi sito è riavviare la connessione adsl, riavviare il router da remoto o spegnere e riaccendere il router fisicamente. :(
Tralasciando l'automatizzazione di accendere e spegnere un tasto fisico, programmaticamente si può controllare ogni tot se il router si è imppalato e di conseguenza riavviarlo in automatico mandando una richiesta POST all'interfaccia di amministrazione Netgear.
#!/usr/bin/env ruby # source: http://grigio.org def restart(ip, user, pass) puts ">> [restart]: " + `curl -X POST --user #{user}:#{pass} http://#{ip}/setup.cgi --data "todo=reboot&this_file=diag.htm&next_file=diag.htm"` end def is_down?(url) res = `curl #{url} -m 10` puts ">> [check]: " + res[0..100] res.start_with? 'curl: (28) Operation timed out' end # main loop loop do unless is_down? "grigio.org" restart "192.168.1.1", "admin", "mypassword" sleep 2 * 60 end puts "ii [loop]" sleep 1 * 60 end
É un hack molto triste, ma almeno con questo script il problema viene mitigato.