Autor Zpráva
cernokneznik
Profil *
Ahoj, dělám si menší scriptík co my má projet různé IP adresy a porty. Tím že jsem si přečetl něco o sítích, jsem celý proces zvlídnul zrychlit z 10ti let vkonávání jen na jeden :D Ale i tak.

Přečetl jsem si pár návodů a článku o multithreadingu, ale jelikož jsem to ještě nikdy nezkoušel, absolutně nevím jak postupovat, a procházet mím klasickým learningovým postupem - pokus->omyl by bylo zdlouhavé,

Samotný script je jednoduchý, jen párkrát for() ...
/* Vyhledávání serverů */
for($p5 = 10000; $p5 <= 49152; $p5++){ //Generace portů - snížený rozsah -> odebrány funkční porty
    echo"Procházím možné ip-adresy pro port $p5";
    
    for($p1 = 1; $p1 <= 255; $p1++){ //část IP - snížený rozsah -> ip 0.něco fakt není
    
    //Skip privátních IP adres
      if($p1 == 10){ 
      $p1=11;
      echo"Přeskočen rozsah IP adresy 10.0.0.0 – 10.255.255.255";
      }
      
        for($p2 = 0; $p2 <= 255; $p2++){ //část IP
        
        //Skip privátních IP adres
          if($p1 == 172 && $p2 == 16){
          $p2=32;
          echo"Přeskočen rozsah IP adresy 172.16.0.0 – 172.31.255.255";
          }elseif($p1 == 192 && $p2 == 168){
           $p2=169;
           echo"Přeskočen rozsah IP adresy 192.168.0.0 – 192.168.255.255";
          }
          
            for($p3 = 0; $p3 <= 255; $p3++){ //část IP
            
                for($p4 = 1; $p4 <= 254; $p4++){ //část IP - snížený rozsah -> privátní sítě
                    $ip = "".$p1.".".$p2.".".$p3.".".$p4.""; //Sestavení IP adresy    
                    
                    //Ověření dostupnosti serveru
                    if(testserver($ip, $p5)== 1){ 
                        $soubor=fopen("vysledky.txt", "w+"); //na zápis do databáze jsem líný
                        $text = "TIME> ". $cas ." | IP> ". $ip .":". $p5 ."\n"; 
                        fwrite($soubor, $text);    //Zapsání výsledku do souboru                
                        fclose($soubor); //Uzavření souboru
                    } 
                }
            }
        } //Schody, Woooohooo!!
    }
}
Chtěl bych tedy zjistit, jak třeba jen prní for() rozdělit na 20 částí, a ty provést současně.

...Ano vím, že je kousek kontroverzní scanovat všechny IP adresy, a že většina serverů mě zablokuje... Ale i tak, je to můj projekt!
DJ Miky
Profil
Jeden rok? Spíš miliony let. S dvaceti servery možná statisíce. Dřív než vzdálené servery nebo sítě tě spíše zablokuje tvůj poskytovatel připojení/serverů.
Joker
Profil
DJ Miky:
Tipoval bych „jen“ nějaké desítky až stovky tisíc let :-) (Podle toho, jak přesně bude udělaná ta kontrola dostupnosti)
Na druhou stranu by to šlo opravdu dobře paralelizovat, dokonce i celkem jednoduše (rozsekat to na víc skriptů, každý nechat kontrolovat jen určitý úsek adres a vyřešit souběh zápisů do souboru, triviálně by každý skript zapisoval do svého souboru).

Pak by podle mě stačilo na to vyhradit „jen“ řádově tak stovky serverů a ten rok je dosažitelný.

cernokneznik:
Poznámka, ten skript by teoreticky mohl generovat větší soubor vysledky.txt, než je uložitelné na běžných souborových systémech (když pominu velikost disku a dostupný diskový prostor).
V praxi to asi nehrozí, protože skenovaný rozsah portů se běžně k ničemu nepoužívá, takže podle mě to najde leda tak nějaké veřejné herní servery.
cernokneznik
Profil *
Ano, odhadl jsi správně, toto mi má vyhledat herní servery... Co se týče ověření, mám nastanený celkem malý timeout... a většina normálně nastavených serverů, kde nic neběží by měla rovnou odpovědět něco ve stylu "wtf" a hodit eror, takže na ten timeout ani nedojde. A servery s velkým pingem vážně nepotřebuju... :)
Myslíš teda, že mi stačí prostě udělat 20 souborů, kde každý bude zjišťovat svůj rozsah?
Není nějáká jednoduchá možnost jak to udělat přímo naráz v jednom souboru? Rozkouskovat to umí každej, já chci být lepší... :)


+ Zápis do souboru je jen dočasný, vše půjde do databáze...
Alphard
Profil
Výpočet, jak dlouho to bude hledat, nechám na vás...
O paralelním stahování psal třeba Jakub Vrána (stačí hledat na php.vrana.cz), ale v tomto případě se opravdu nabízí nekomplikovat to, spustit více instancí a pak sloučit řešení.

Chcete to spouštět přes cron, nebo by bylo možné udělat „spouštěcí“ html stránku, kde budou jednotlivé scripty načtené třeba javascriptem?
Joker
Profil
cernokneznik:
odhadl jsi správně, toto mi má vyhledat herní servery
Připadá mi to jako dost zoufalá metoda.

většina normálně nastavených serverů, kde nic neběží by měla rovnou odpovědět něco ve stylu "wtf" a hodit eror, takže na ten timeout ani nedojde
Netroufnu si odhadovat, jak dlouho to reálně potrvá. Spousta zařízení bude nedostupných a je otázka, co se pak stane. Možná hodně zařízení nebude vůbec odpovídat. A podobně.
Každopádně oskenovat všechny (ve skriptu kontrolované) porty jednoho zařízení které má ping 100 ms (což není nijak moc) potrvá víc než hodinu.

Dál podle mě může nastat situace, kdy zařízení bude generovat falešně pozitivní výsledek (nakolik vím, třeba firewall v kombinaci s některými metodami skenování to může udělat). Skript pak nahlásí všechny porty jako otevřené a do souboru nageneruje něco pod 2MB záznamů.

V každém případě jsem názoru, že výstup toho skriptu není moc použitelný, rozhodně ne ve srovnání s náklady, které stojí jeho získání.
A taky že to sice jde skvěle paralelizovat, ale přesto nebude možné na jednom počítači se dostat na použitelné časy.
Kdyby třeba paralelizace srazila potřebný čas o 99%, pořád to bude třeba z 60 000 let na 600 let.
DJ Miky
Profil
Počítal jsem 1 sekundu na test/timeout, což podle mě není vůbec přestřelená hodnota s ohledem na možnou dobu odezvy včetně doby, než cílové zařízení zareaguje (což také může být i pár desítek milisekund). Testy vypnutých zařízení budou timeoutovat, testy zapnutých zařízení na portech, kde nic neběží, budou často timeoutovat taky – z mé zkušenosti je častá praxe pakety prostě zahazovat namísto odpovědi port-unreachable, protože je to prostě levnější (odpadá cena odeslání ICMP paketu). Zkusil jsem několik serverů a domácích routerů (s veřejnou IP) a kromě jednoho serveru všechna zařízení pakety na neznámý port ignorovala (timeoutovala). Z toho usuzuji, že většina testů skončí timeoutem. Proto mi vyšly řádově miliony let s jedním serverem. 100ms timeout a paralelizace tomu už příliš nepomůže.

Spíše bych se zaměřil na omezení počtu testů:
1) Vyřadit IP rozsahy, u kterých je velmi malá pravděpodobnost nalezení fungujícího serveru s malou odezvou. Např. vyloučit větší IP rozsahy, které jsou přiděleny americkým, asijským nebo africkým společnostem. To není úplně spolehlivé, ale něco málo to ušetřit může.
2) Snažit se najít typické porty pro herní servery. Mnoho her standardně používá jeden konkrétní port, omezením na ty typické sice přijdeš o některé servery běžící na nestandardních portech, ale těch by nemuselo být tolik.
cernokneznik
Profil *
Joker: Proč ubohé? Samozřejmě, že můžu kontaktovat hostingové společnosti, například Fakaheda poskytuje i feed serverů s informacemi. http://query.fakaheda.eu/mncb.feed
Já tohle ale nechci.

DJ Miky: Jde mi hlavně o hru Minecraft, a ta běží na typickém portu 25565, ale hodně serverů jsou někde hostované, a proto port není defaultní.

Co se týče mého zázemí, mám plně k dispozici myslím že celkem výkoný počítač, s INTEL Six-Core XEON X5680, o grafice a dalších specifikacích se tu nechci chlubit :D Celková cena byla asi 150k.
Počítám s tím, že to mi práci urychlí...

Dál mám bandu asi 20ti lidí, co jsou ochotní mi pomoct.

Děkuji Alphard za Vránu :D
DJ Miky
Profil
V tomhle případě ti spíše pomůže kvalitní a stabilní připojení s nízkou odezvou, než supervýkonný počítač (až na kapacitu a výkon pevného disku).

Ohledně omezení portů – pokud chceš opravdu najít všechny servery, pak ti to asi nepomůže. Ale koukal jsem letmo na tebou odkazovaný feed serverů a většina tam má porty 27xxx nebo 37xxx. Proto bych se nejprve zaměřil na tyto rozsahy (tedy 27000–27999, 37000–37999 a standardní port 25565 nebo nějaký rozsah okolo něj) a až poté bych případně zkoušel zbytek portů.
Joker
Profil
cernokneznik:
Proč ubohé?
Psal jsem zoufalé, ne ubohé.
Zoufalé proto, že to zkonzumuje relativně hodně prostředků, efektivita bude tristní a výsledky dost možná nepoužitelné.

Minecraft serverů může být pár desítek tisíc? Pokusů se udělá 155 bilionů, takže připadá jeden Minecraft server na řádově miliardy pokusů (což při 10 ms na pokus a počítač a zapojení 20 počítačů je plus mínus měsíc na nalezení jednoho serveru, celý scan by trval asi 2500 let).

Druhá věc je, že informace o nalezených serverech budou nejpozději po několika letech zastaralé (server změní IP, odpojí se, připojí se nový někde kde dřív žádný nebyl), takže maximum co bych od toho čekal je seznam několika desítek funkčních Minecraft serverů (když by někdo ty servery průběžně kontroloval a odstraňoval ty nefunkční). Což lze získat přes Google a několik kliknutí, aniž bych kvůli tomu ve dne v noci vytěžoval 20 počítačů.

A třetí věc je, že uvedený rozsah portů se sice běžně nepoužívá, ale i tak se používá ke spoustě jiných věcí než Minecraft. Takže jestli ten skript jen skenuje porty, bude mít velké množství falešně pozitivních výsledků. Respektive v tom seznamu otevřených portů jen malá část budou opravdu Minecraft servery*.
Byl by potřeba ještě další kód, který ověří, jestli na tom portu opravdu běží něco z pohledu skriptu užitečného, což ale zase prodlouží čas skenování.

Celková cena byla asi 150k.
Počítám s tím, že to mi práci urychlí...
Asi moc neurychlí, v tomhle případě bude rychlost záviset spíš na rychlosti síťové komunikace a podobných věcech, které ten počítač nebude mít zas o tolik lepší.
Mít k dispozici 20 počítačů v ceně 7500 Kč by to urychlilo podstatně víc.
Ale připomínám, že i s těmi 20 dalšími počítači by doba toho skenu nejspíš přesáhla 1000 let.

*V zásadě jde o problém, kterému se říká „base rate fallacy“.
Ukázka problému: Řekněme, že by Praha zavedla systém na sledování obyvatel, který by s úspěšností 99% poznal teroristy (tj. 1% falešně negativních a 1% falešně pozitivních výsledků). V Praze budou tři teroristi. Jaká je pravděpodobnost, že člověk označený systémem jako terorista je opravdu terorista?
Výsledek: Ze skutečných teroristů systém 99%, tj. všechny tři, označí jako teroristy a žádného jako nevinného. Z 1,25 milionu nevinných systém 99% označí za nevinné a 1% = 12 500 za teroristy. Pravděpodobnost, že člověk označený jako terorista je opravdu terorista je 3/12503 = 0,02%.
DJ Miky
Profil
Ještě se zpožděním dodám odkaz na unixový nástroj, na který jsem dnes narazil:
https://zmap.io/

Pro rozumné časy skenování by mělo stačit dostatečně rychlé a kvalitní připojení.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: