Na domácím serveru se mi stala zvláštní věc. Pokoušel jsem se forknout repositář z Githubu s Bowerem:
media@mediaserver:/var/www/playground$ bower install bootstrap
Výsledek byl:
bower bootstrap#* not-cached git://github.com/twbs/bootstrap.git#* bower bootstrap#* resolve git://github.com/twbs/bootstrap.git#* bower bootstrap#* ECMDERR Failed to execute "git ls-remote --tags --heads git://github.com/twbs/bootstrap.git", exit code of #128 Additional error details: fatal: unable to connect to github.com: github.com[0: 192.30.252.130]: errno=No route to host
Analýza problému
Zaujala mě přeložená adresa Githubu – 192.30.252.130. Pravděpodobně kvůli nedostatku IP adres se začaly přidělovat i rozsahy určené pro lokální sítě – 192.0.0.0 a 138.0.0.0. Spíš jen pro jistotu jsem zkusil telnet:
media@mediaserver:/var/www/playground$ telnet github.com 9418 Trying 192.30.252.130... telnet: Unable to connect to remote host: No route to host
Jako první mě napadlo, jestli není na firewallu v routeru (s dd-wrt) blokovaný port 9418. To byla ale úvaha mylná, protože na jiném počítači v síti git používám bez problému.
Tak jsem zkusil cílovou ip pingnout:
media@mediaserver:/var/www/playground$ ping 192.30.252.130 PING 192.30.252.130 (192.30.252.130) 56(84) bytes of data. From 192.168.1.100 icmp_seq=1 Destination Host Unreachable From 192.168.1.100 icmp_seq=2 Destination Host Unreachable From 192.168.1.100 icmp_seq=3 Destination Host Unreachable From 192.168.1.100 icmp_seq=4 Destination Host Unreachable From 192.168.1.100 icmp_seq=5 Destination Host Unreachable From 192.168.1.100 icmp_seq=6 Destination Host Unreachable
Áha. Takže se na cílovou ip ani nedostanu. Z jiných počítačů vše v pohodě, problém je tedy přímo v serveru.
Řešení
Rutinně jsem se kouknul na routy:
media@mediaserver:/var/www/playground$ netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0 192.0.0.0 * 255.0.0.0 U 0 0 0 eth0
Bingo! Druhá routa požere všechno začínající 192. Řešení je jednoduché. V mém případě, kdy v lokální síti používám více rozsahů jsem přidal pouze menší rozsah:
media@mediaserver:/var/www/playground$ sudo route add -net 192.30.0.0 netmask 255.255.0.0 gw 192.168.1.1 dev eth0
A routovací tabulka nyní vypadá:
media@mediaserver:/var/www/playground$ netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0 192.0.0.0 * 255.0.0.0 U 0 0 0 eth0 192.30.0.0 192.168.1.1 255.255.0.0 UG 0 0 0 eth0
A vše funguje:
media@mediaserver:/var/www/playground$ ping 192.30.252.130 PING 192.30.252.130 (192.30.252.130) 56(84) bytes of data. 64 bytes from 192.30.252.130: icmp_req=1 ttl=48 time=132 ms 64 bytes from 192.30.252.130: icmp_req=2 ttl=48 time=132 ms 64 bytes from 192.30.252.130: icmp_req=3 ttl=48 time=132 ms 64 bytes from 192.30.252.130: icmp_req=4 ttl=48 time=132 ms 64 bytes from 192.30.252.130: icmp_req=5 ttl=48 time=132 ms 64 bytes from 192.30.252.130: icmp_req=6 ttl=48 time=132 ms
Ponaučení
Pokud na jednom stroji nefungují některé stránky nebo služby, vyplatí se kouknout do routovací tabulky.
192.0.0.0 není rozsah pro lokální sítě, ten je jen 192.168.0.0/16. http://tools.ietf.org/html/rfc1918
Jedna věc je standard a druhá praxe. Už jsem několikrát viděl, že měly lokální sítě nastavený např. 192.1.1.* . Možná proto Ubuntu nebo dd-wrt (nevím, odkud se mi to ta vzalo) pak bere celý rozsah 192.* jako lokální. Podobně jsem četl před pár měsíci, že některý hostingy dostaly adresy začínající na 1 (nebo něco podobnýho) a část uživatelů se tam (asi kvůli nastavení firewallu) nedostala. I když všechno bylo podle standardu.