VerliLinker je Lua script napsaný pro Verlihub, který dovoluje různým hubům spojit se v jednu ucelenou síť. Práce byla dokončena pomocí LuaSocket knihoven v non-blocking módu. To znamená že tento script NEBUDE blokovat Verlihub v průbehu provádění síťových operací, jako listen(), accept(), connect(), apod.
Každý hub bude ukazovat všechny uživatele v síti ve svém nicklistu a uživatelé kteří jsou přihlášeni v síti přes jiný hub budou zobrazeni s prefixem svého hubu (napr. [A]nick).
Představa je velmi jednoduchá. Každý hub se může připojit k jakémukoliv počtu jiných hubů, pomocí hublink spojení, tak je možné spojit 2 různé existujicí sitě, spojené pomocí VerliLinkeru, v jednu větší síť. Jediná věc, která může dělat problém, je smyčka (loop) v síti (smyčka je jakýkoliv uzavřený okruh mezi dvěma huby v síti). VerliLinker obsahuje anti-loop ochranu, takže všichni admini budou informováni o smyčce, ale můžete se pokusit tomu zabránit bezpečným naplánováním sítě.
Každý hub očekává připojení na specifickém portu pro spojení s jiným hubem. Každý tento port je určen pro spojení pouze s jedním hubem, kvůli bezpečnosti. Pro každý nový hub který chcete připojit s vaším hubem, musíte otevřít nový port příkazem !links. Tedy, pokud chcete spojit váš hub s 3 dalšímy huby, budete potřebovat vytvořit 3 připojení, každé s novým portem, příkazem !links add. (Zde je myšleno nastavení spojení v síti, nikoliv samotné nastavení portu v konfiguraci hubu, to je třeba provést předem)
Nový port je použit jako bezpečnostní opatření. Každé spojení ma vlastní port. Proč? Kdykoliv vzdálený počítač zkouší spojení s tímto portem, hub pouze potřebuje zkontrolovat zda tato vzdálená IP adresa je ta povolená pro spojení s tímto portem. DNS lookup pro vzdálený host pole tohoto spojení může vrátit IP adresu, která může být porovnána se spojující IP adresou. Tímto způsobem vzdálený hub nemusí mít statickou IP adresu. Tímto si můžem být jisti že zde nebudou brute force útoky za účelem neautorizovaného vstupu do sítě.
Pro spojení s jiným hubem za učelem vytvoření sítě použijete příkaz !links connect. Pokud se oba admini pokusí o spojení hubů ve stejný moment, jedno z těchto spojení bude přerušeno a druhé bude provedeno (není důvod mít 2 TCP spojení pro 1 věc).
Napsáním !links, po nahrání lua scriptu, dostanete více informací o využití příkazu.
Po úspěšném TCP spojení mezi dvěma huby je použit jednoduchý ověřovací protokol, příklad:
S | C > $AuthRequest 89347589376| < $AuthReply F47E4C117101B42BCCE1A662119157E5| > $AuthOK|
Pro zjednoduššení, hub který akceptuje TCP spojení (server hub) bude pojmenován Server a druhý hub, který požádal o TCP spojení, bude pojmenován Client, přesněji S a C.
Takže, Server napřed pošle $AuthRequest příkaz, následovaný náhodným řetězcem parametru (parametr nesmí obsahovat mezery). Client odpoví na tuto žádost příkazem $AuthReply následovaný s md5 hash. Hash je vytvořený použitím náhodného řetězce z $AuthRequest příkazu a hesla, přiřazeného tomuto spojení hubů (heslo se nastavuje při zadávání nového spojení přikazem !links add):
hash = md5(link['password'] + authreq_param)
Toto je použito pro zabránění posílaní hesla nezabezpečenou cestou.
Pokud ověřování selže, Server zavře spojení se zprávou o chybě, jinak odešle $AuthOK jako odpověď a nyní huby vzájemně sestaví síťovací proces.
Aby nedošlo k chybám v síti, před každým úspěšným sestavením spojení je zde pár věcí, které musí být zkontrolovány. Jedna z těchto věcí je hub prefix v síti. Samozřejmě, že 2 huby nesmějí mít stejný prefix, proto musejí oba zkontrolovat, zda jsou jejich prefixy unikátní v síti.
Můžete si nastavit svůj hub prefix editováním scriptu links.lua, změnou hodnoty v links_my_prefix . Zde je pár limitů pro používání speciálních znaků v prefixu. Důležité je zamezit v používání: $ (dollar), <space>, <tab>, | (vertical line), & (ampersand). Také nezapomeňte, že vaši uživatelé mouhou být z celého světa, proto je nejlepší použít pouze 7-bit ASCII znaky.
Zde je příklad nastavených prefixů:
S | C < $MyPrefixes [Alfa]$[Gama]$[G]$[T]| > $MyPrefixes [Beta]| < $LoginOk|
Zde se ukazuje, že Client hub je zodpovídá za všechny uživatele s prefixem: [Alfa], [Gama], [G] a [T] a Server hub zodpovídá za prefix [Beta]. Pokud některý hub už nastavený prefix používá, spojení se uzavře s oznámením chyby. V opačném případě je odeslán $LoginOk a sestavovací proces je kompletní. Huby jsou nyní uspěšně spojeny do sítě.
Poznámka: Client hub chce registrovat více prefixů, tzn Client hub je již součástí jiné sítě a nyní se pokouší spojit se Server hubem do existující sítě. (Server hub neznamená „hlavní“, jedná se pouze o hub, ke kterému se pokoušíme připojit)
Poznámka: $MyPrefixes není jediná věc která se kontroluje pro sestavení spojení. V budoucích verzích bude možné kontrolovat více nastavení, proto je lepší se spolehnout na $LoginOk oznámení před prací v síti.
Jestliže je vše správně nastaveno a zkontrolováno, huby můžou rozesílat do nastavené sítě cokoliv potřebují, mainchat zprávy, PM zprávy, vyhledávání, myinfo a jiné. Většina věcí kolujících mezi huby v síti je regulérní NMDC protokol, může však dojít k zobrazení některých kontrolních zpráv.
Na začátku si huby rozešlou nicklist mezi sebou. Dále huby informují další připojené huby o nových hubech a uživatelích v síti. Pokud dojde k přerušení spojení v síti, huby nemusejí rozesílat hromadně $Quit za každého uživatele, místo toho odešlou příkaz $PrefixDel , pro každý odpojený hub, tím se ušetří prostor v přenosech dat. Všechny ostatní huby, které obdrží příkaz $PrefixDel, odstraní uživatele s daným prefixem ze svého nicklistu.
Zde je příklad komunikace, která může být probíhat v síti:
$ConnectToMe [Omega]nick1 89.216.68.229:6255 $Kick [hub1]burek [hub2]nick3 Because you were bad $Kicked [hub1]burek [hub2]nick3 Because you were bad $MainChat [Beta]burek Some text here. $Join [A]nick1 0 <++ V:0.706,M:A,H:1/0/0,S:5>$ $0$$0$ $PrefixAdd [Omega] $PrefixDel [Omega] $Quit [hub2]burek $Search 89.216.68.229:2516 F?T?0?1?matrix $To: [Beta]brlja From: [Alpha]burek $<[Alpha]burek> Some text here.
V zásadě většina NMDC komunikace probíhá mezi huby bez úprav. Main chat zprávy jsou rozesílány ve formě upravené pro rychlou kontrolu nicků s jejich prefixy. Jsou zde také nové zprávy, jako $Kicked, které jsou odesílány jako oznámení když operátor vykopne uživatele z hubu, tak ostatní huby jsou informovány že dotyčný uživatel byl vykopnut a proč (vzájemné kopání uživatelů mezi huby je možné). Kompletní seznam zpráv mezi huby, používajících Verlilinker protokol (VLP), můžete najít zde.
Script zavádí nový příkaz: !links
Použití:
!links <add/del/edit/list/connect/disconnect> <link_name> <params>
Příklad:
!links add gusari host=2.3.4.5 port=1234 password=gusari666 type=nmdc enabled=1 listen_port=33333 !links add gusari host=1.2.3.4 password=gusari1 listen_port=2222 !links del gusari !links edit gusari name=gusari2 host=5.4.3.2 port=4321 password=gusari456 !links edit gusari2 port=321 !links list !links connect gusari !links disconnect gusari
Od verze 1.4 jsou implementovány flags aby dovolili adminům konfigurovat co vše se bude v síti přenášet z/na jejich hub. Jejich použití je velmi jednoduché:
!links edit <link_name> flags=<flags>
Zde následuje seznam flagů (malými písmeny jsou flagy použité pro povolení/zakázání přenosu zpráv z hubu, velkými písmeny jsou flagy použité pro povolení/zakázání příjmu zpráv z ostatních hubů na váš hub:
| Flag | Význam |
|---|---|
| m | povolí MainChat zprávy z mého hubu budou šířeny na další huby |
| M | povolí MainChat zprávy ze vzdáleného hubu na mém hubu |
| p | povolí private chat zprávy z mého hubu budou šířeny na další huby |
| P | povolí private chat zprávy ze vzdáleného hubu na mém hubu |
| s | povolí Search zprávy z mého hubu budou šířeny na další huby |
| S | povolí Search messages zprávy ze vzdáleného hubu na mém hubu |
| c | povolí ConnectToMe zprávy z mého hubu budou šířeny na další huby |
| C | povolí ConnectToMe zprávy ze vzdáleného hubu na mém hubu |
| i | povolí MyINFO zprávy z mého hubu budou šířeny na další huby |
| I | povolí MyINFO zprávy ze vzdáleného hubu na mém hubu |
| k | povolí Kick zprávy z mého hubu budou šířeny na další huby (dovoluje mým OPs kopat vzdálené uživatele na síti) |
| K | povolí Kick zprávy ze vzdáleného hubu na mém hubu (dovoluje vzdáleným OPs kopat na mém hubu) |
| o | ukáže OPs z mého hubu jako OPs na vzdáleném hubu |
| O | ukáže OPs ze vzdáleného hubu jako OPs na mém hubu |
Například:
!links edit alpha flags=MsScCk
Dejme tomu že máme 5 hubů: hub1, hub2, hub3, hub4 a hub5. Chceme je spojit podle následujícího diagramu:
Dejme tomu že adresy těchto hubů jsou:
Dále heslo pro každé spojení:
Další, prefix pro každý hub:
A konečně, každý hub potřebuje port pro nové spojení:
Podívejte se, jak bude vypadat konfigurace pro každý hub:
Na hubu1, admin napíše:
!links add hub2 host=hub2.domain2.org port=301 password=pass12 listen_port=201
Pokud admin nenastaví listen_port parametr, hub nebude schopen přijímat příchozí komunikaci. To je užitečné pokud chcete mít něco jako Master hub, kde bude možné přijímat pouze komunikaci z ostatních hubů.
Na hubu2, admin napíše:
!links add hub1 host=hub1.domain1.org port=201 password=pass12 listen_port=301 !links add hub3 host=hub3.domain3.org port=501 password=pass23 listen_port=401
Na hubu3, admin napíše:
!links add hub2 host=hub2.domain2.org port=401 password=pass23 listen_port=501 !links add hub4 host=hub4.domain4.org port=701 password=pass34 listen_port=601 !links add hub5 host=hub5.domain5.org port=901 password=pass35 listen_port=801
Na hubu4, admin napíše:
!links add hub3 host=hub3.domain3.org port=601 password=pass34 listen_port=701
Na hubu5, admin napíše:
!links add hub3 host=hub3.domain3.org port=801 password=pass35 listen_port=901
Ještě jedna věc. Každý admin musí mít nastaven prefix pro svůj hub v síti. Každý musí editovat svůj script links.lua , změnit hodnotu links_my_prefix na jejich prefix který chtějí použít ([Alpha], [Beta], [Gamma], [Delta], [Epsilon]).
A je to. Po úspěšné konfiguraci se můžeme spojit v jednu síť.
Admin hubu1:
!links connect hub2
Admin hubu2 nemusí zadávat příkaz: !links connect hub1, protože admin hubu1 už spojení spustil.
Admin hubu3:
!links connect hub2 !links connect hub4 !links connect hub5
Po úspěšném spojení je síť hotova a funguje.
Doufám že se vám líbí projekt který se snaží udělat p2p síť lepší, která může fungovat jako IRC síť.
Poznámka: Starší verze Verlihubu která byla otestována s tímto scriptem je Verlihub v0.9.8d-RC2 a VH plugin for Lua v1.7rc1
Všichni uživatelé, kteří mají správný hub prefix, mohou vyhledávat v celé síti hubů. Ti, kteří zvolili nepoužívat prefix, mohou také používat hub, ale pouze lokální hub, bez síťové podpory, mohou tedy pouze hledat a stahovat od lokálních uživatelů. Ti, kteří si nastavili prefix v nicku pro svůj hub, mohou plně využívat sílu sítě hubů.
Jdi na: http://www.lua.org/download.html a stáhni lua-5.1.4.tar.gz
Přečti: INSTALL soubor
obvykle skončíš napsáním tohoto:
# make (or make linux) # sudo make install # ldconfig
test (jestli je lua v pořádku nainstalovaná):
# lua -v
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
Jdi na: http://luaforge.net/projects/luasocket/ a stáhni luasocket-2.0.2
Přečti: Install instructions
obvykle skončíš napsáním tohoto:
# make # sudo make install # ldconfig
test (jestli je LuaSocket správně nainstalován):
# cd test # lua testsrvr.lua server: waiting for client connection...
stiskněte CTRL+C pro zrušení konzoly
Dále napiš:
sudo ln -s /usr/local/lib/lua/5.1/socket/core.so /usr/local/lib/libluasocket.so sudo ln -s /usr/local/lib/lua/5.1/mime/core.so /usr/local/lib/libluamime.so
pro ujištění, že vše je kompatibilní
Pokud instaluješ starší verzi Verlihubu, neměl bys používat nové verze gcc compileru, které můžou velmi stížit instalaci starších verzí Verlihubu a pokud jej chceš použít, podívej se zde: viewtopic.php?f=3&t=4272&p=8475
Jdi na: verlihub-project.org nebo sourceforge.net a stáhni si verzi Verlihubu kterou chceš.
Přečti: Verlihub manuál - Instalace
obvykle skončíš napsánim tohoto:
# ./configure
pokud se podaří, uvidíš toto:
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Configure has completed successfully. Now you must run make. If make fails with errors, please consult the forums and see if anyone else has had the same issue. The forums are located here http://forums.verlihub-project.org Extensive documentation is also available at the project website which can be found here http://www.verlihub-project.org Please feel free to join and register at the Verlihub suport hub located here [[dchub://hub.verlihub-project.org:7777|dchub://hub.verlihub-project.org:7777]] -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
potom napiš:
# make # sudo make install # ldconfig
nyní, pokud čteme INSTALL soubor, vidíme toto (na konci):
run the mysql server run vh_install and let yourself guide run vh_regnick -f -c 10 -n "yournick" run vh_runhub 1234 # where 1234 is the listening port of your choice connect to the hub with "yournick" use command +passwd yourpassword and reconnect use hub command != listen_port 1234 now on you can use vh_runhub without an argument..
# ./configure --with-luasocket # make # sudo make install # sudo ln -s /usr/local/lib/liblua_pi.so /etc/verlihub/plugins/liblua_pi.so # ldconfig
a potom na hubu:
!plugin /etc/verlihub/plugins/liblua_pi.so
Nyní si vyzkoušej search/download/pm/mainchat.. pokud najdeš nějakou chybu, ohlaš ji prosím zde (eng forum).
Užij si síť
VerliLinker protokol (VLP) popisuje zprávy používané v hub-to-hub komunikaci. Zprávy používané ke komunikaci ve spojení, jsou většinou identické s NMDC zprávami, jen bylo přidáno několik nových a některé NMDC zprávy byly lehce upraveny před jejich odesláním do sítě. Tento dokument popisuje formát těchto zpráv.
Syntaxe: $AuthRequest <random_string>
Popis: Tato zpráva je odeslána Serverem (hub který schvaluje žádost o připojení jiného hubu), hned potom co je vzdálený hub (Client hub) připojen. Client hub potřebuje odpovědět s odpovídající $AuthReply zprávou pro ustavení spojení.
Příklad: Pokud je heslo pro spojení (definováno příkazem !links add) nastaveno na „pass123“, poté následující příklad je schválenou autentizací:
S | C > $AuthRequest x34jh29sdgfk45g| < $AuthReply F35D5DA8FC421573106016A21267A556| > $AuthOK|
Poznámka: md5('pass123x34jh29sdgfk45g') == 'F35D5DA8FC421573106016A21267A556'
Syntaxe: $AuthReply <auth_response_string>
Popis: Tato zpráva je odeslána jako odpověď na $AuthRequest zprávu, odeslanou „server“ hubem (hub který acceptoval spojení s jiným hubem). Pokud client hub pošle vadnou $AuthReply zprávu, server hub uzavře spojení. Pro správné vytvoření $AuthReply zprávy, client hub musí znát heslo které zkombinuje s $AuthRequest parametrem (a random string). $AuthReply parametr je vytvořen následovně:
auth_reply_param = md5(hublink_password + auth_request_param)
Příklad: Pokud heslo pro spojení (nastaveno pomocí příkazu !links add) je „johndoe“, potom následující příklad je schválenou autentizací:
S | C > $AuthRequest 6mag5hdslerE| < $AuthReply 318C4C93DA17101364211A001EFEF981| > $AuthOK|
Poznámka: md5('johndoe6mag5hdslerE') == '318C4C93DA17101364211A001EFEF981'
Syntaxe: $AuthOk Popis: Tato zpráva je poslána server hubem jako potvrzení autentifikace vyžadané client hubem. Příklad: uvidíš na příkladech pro $AuthRequest a $AuthReply zpráv.
Syntaxe: $MyPrefixes prefix$prefix$…$prefix
Popis: tato zpráva je odeslána hubem v průběhu nastavování spojení, pro oznámení v síti že tento hub je zodpovědný za nicky s daným prefixem. Hub může být připojen k jiným hubům před pokusem ke spojení v nové síti nebo k dalšímu hubu. V tom případě odesíla seznam všech prefixů, které už jsou použity v síti, ještě před připojením hubu do nové sítě.
Příklad:
S | C > $AuthRequest 6mag5hdslerE| < $AuthReply 318C4C93DA17101364211A001EFEF981| > $AuthOK| < $MyPrefixes [Alpha]$[Beta]| > $MyPrefixes [G]| < $LoginOk|
Syntaxe: $LoginOk
Popis: Tato zpráva je odeslána Client hubem jako oznámení Server hubu, že nastavení spojení je ukončeno a vše je připraveno pro přenos v síti v tomto novém spojení. Poznámka, pokud Client hub posle $LoginOk, bez odeslání $MyPrefixes zprávy předem, Server hub uzavře spojení, protože Client hub musí definovat svoje prefixy ještě před jakýmkoliv datovým přenosem v síti.
Příklad: uveden v $MyPrefixes zprávě.
Syntaxe: $MainChat <nick> <text>
Popis: Tato zpráva reprezentuje mainchat zprávu, vyslanou do sítě ostatním hubům. Důvod k modifikování mainchat zprávy do $MainChat formátu je udržení jednoduchosti analyzování všech síťových zpráv (všechny musí být ve stejném formátu).
Příklad:
$MainChat [G]burek Hello world
Syntaxe: $Join <nick> <class> <tag>
Popis: Tato zpráva je odeslána jako odpověď na událost připojéní nového uživatele k jednomu z hubů v síti. Tímto způsobem všechny huby v síti vědí o uživatelově class a mohou mu nastavit patřičná práva.
Příklad:
$Join [A]burek 3 <++ V:0.706,M:A,H:1/0/0,S:10>$ $0.005$$55518912719$
Syntaxe: $Notice <SrcPrefix> <DstNick> <text>
Popis: Tato zpráva je použita pro informování vzdálenych operátorů o určité události na jiném hubu. Například, když operátor chce kopnout admina jiného hubu, operátor dostane zprávu $Notice z druhého hubu že není oprávněn k této akci. <SrcPrefix> parametr je prefix hubu který posílá tuto zprávu, <DstNick> je operátorův nick a <text> je vlastní zpráva.
Příklad:
$Notice [Alpha] [G]ninja You cannot kick that user (your class is not big enough).
Syntaxe: $PrefixAdd <prefix>
Popis: Tato zpráva je použita jako ohlášení všem hubům v síti o novém hubu připojujícím se do sítě. Pokud nový hub má nastaven prefix, který už v síti existuje, bude tento hub informován a odpojen ze sítě. Prefixy všech hubů jsou kontrolovány při „sestavování spojení“, ale když jsou přidávány huby později, je každá $PrefixAdd zpráva důkladně zkontrolována na již existující prefix a nový hub nemá povolení se připojit pokud je nalezen již existující prefix v síti dokud svuj prefix nezmení.
Příklad:
$PrefixAdd [Alpha]
Syntaxe: $PrefixDel <prefix>
Popis: Tato zpráva je použita pro známení všem hubům v síti o odpojení jednotlivého/jednotlivých hubů ze sítě. všechny huby po obdržení této zprávy odstraní všechny uživatele odpojených hubů ze svého nicklistu podle nastavených prefixů.
Příklad:
$PrefixDel [Alpha]
Syntaxe: $Kick <OpNick> <VictimNick> <reason>
Popis: Běžná kick zpráva je modifikována přidáním <OpNick> parametru. Zpráva je přesměrována na hub „oběti“ ( <VictimNick> ) a pokud hub povoluje kopaní ze vzdálených hubů, odpoví odesláním $Kicked zprávou, následovanou kopnutím oběti ( <VictimNick> ) z hubu. Pokud hub nepovolí kopnutí ze vzdáleného hubu, je operátor informován pomocí $Notice zprávy.
Příklad:
$Kick [G]burek [Alpha]ninja Because you were bad.
Syntaxe: $Kicked <OpNick> <VictimNick> <reason>
Popis: Tato zpráva je identickás $Kick zprávou, S tím rozdílem že tato zpráva je odeslána hubem který vykopl oběť a dává tímto informaci ostatním hubům o tomto stavu (<OpNick> is kicking VictimNick because: reason…).
Příklad:
$Kicked [G]burek [Alpha]ninja Because you were bad.
Tato zpráva je stejná jako NMDC $Search zpráva. Pouze aktivní hledání může být šířeno v síti. Pasivní hledání nemůže být šířeno v síti ze známých důvodů.
Tyto zprávy jsou v síti šířeny stejně jako NMDC zprávy bez žádných modifikací.