Quando l'adsl naviga solo più su Google e internet va in timeout


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)
curl -I grigio.org
HTTP/1.1 200 OK
Server: nginx/1.2.7
..

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&amp;this_file=diag.htm&amp;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.