Přesměrování
Obsah
Úvod
Toto je finální verze k právě dodělanému modulu přesměrování (červenec 2011). V Unartu Slavičín jsme používali přesměrování napsané s poněkud provizorním návrhem, protože jsme poměrně akutně potřebovali blokovat lidi, kteří neplatili internet. Dříve jsme k tomuto účelu používali přesměrování pomocí firewallu v Mikrotiku, ale toto bylo velmi nešťastné a nepraktické řešení. Konfigurace více než stovky Mikrotiků byla problematická a v praxi to nebylo dlouhodobě použitelné. V roce 2008 během prázdnin, kdy jsme ve Freenetisu dopsali finanční část, která je založená na podvojném účetnictví, jsme potřebovali informace získané o kreditech členů nějak využít. Rozhodli jsme se zabudovat přesměrování do Freenetisu. Výsledný modul tehdy nebyl úplně nejlíp navržený, ale velmi nám pomohl udělat pořádek. Po čase začali růst požadavky a rostla potřeba nových vlastností. Do vývoje Freenetisu se zapojil Lubomír Buben z Hkfree a jeden z modulů, na kterém chtěl pracovat, bylo právě přesměrování. Bohužel ani jemu se nepodařilo dotáhnout výsledek do konce. Dokumentace na této stránce je napsaná až v červenci 2011, kdy konečně nová verze přesměrování byla dokončená.
K čemu to je dobré?
Přesměrování lze využít k blokování přístupu členů na internet z různých důvodů. Jednak je možné takto blokovat lidi, jejichž IP adresa zařízení není v databázi. Dále je možné zablokovat internet lidem, kteří si přerušili členství, anebo nemají zaplaceny členské příspěvky. Přesměrování lze také využít k informování členů o blížící se valné hromadě, o plánovaném výpadku připojení, o možnosti přechodu na novou bezdrátovou technologii apod.
Jak to funguje?
Na jedné straně je Freenetis, ve kterém je kompletní evidence o tom, čí IP adresy mají být přesměrovány. Toto všechno spravuje administrátor Freenetisu nebo hospodář nebo jiný člověk, který tyto věci ve sdružení řeší. On si určí, kdy koho chce zablokovat, kdy komu povolí internet a kdy dá někomu privilegium, aby se na něj přesměrování nevztahovalo.
Na druhé straně je centrální router nebo také brána do internetu. Obvykle je to nějaký stroj s Linuxem, přes který teče provoz ze sítě do internetu a na kterém běží firewall, případně další služby jako DNS atd. Na tomto stroji je cronem spouštěn synchronizační skript v pravidelném intervalu (u nás jedna minuta). Tento skript si stáhne ze speciálních stránek Freenetisu dvě informace. Seznam síťových adres s maskou a seznam povolených IP adres. Skript vezme tyto rozsahy a IP adresy a naplní jimi ipsety v jádře (k tomuto je modul ipset). Následně vygeneruje pravidla pro firewall iptables, na základě kterých pak dochází k přesměrování. Firewall tedy přesměruje ty IP adresy, které chtějí jít na internet, spadají do načtených rozsahů, ale nejsou v seznamu povolených IP adres. To znamená, že přesměrování se uplatňuje jen pro ty podsítě v systému, pro které chce administrátor. Přesměrovány jsou jednak neznámé IP adresy (jinak by byly poslány s v seznamu povolených) a pak ty, které chceme přesměrovat (z pohledu centrálního routeru jde o vyřazení ze seznamu povolených). Toto přesměrování provádí firewall na jiný port (u nás to je 36000) centrálního routeru. Na tomto portu běží lehký webový server, který na tomto portu dělá jednoduchý HTTP redirect na jinou stránku. V našem případě jde o stránku Freenetisu vyhrazenou k tomuto účelu, např. freenetis.domena.cz/redirection.
Vracíme se zpět k Freenetisu. Freenetis si podle IP adresy návštěvníka na této stránce dohledá ve své databázi důvod přesměrování a uživateli zobrazí příslušnou zprávu. Některé zprávy si může uživatel sám zrušit, toto se hodí pro zprávy pouze informativního charakteru. Uživatel v tomto případě klikne na příslušný odkaz a je mu zobrazen rozcestník, na kterém může pokračovat do internetu. Musí ovšem počkat dobu trvání synchronizačního cyklu (u nás jedna minuta) než dojde k aktualizaci informace přesměrování na centrálním routeru.
Typy zpráv
Existuje několik zpráv, které mají různé vlastnosti. Po instalaci obsahuje systém pouze systémové zprávy. Není možné je mazat, protože jsou vázané na konkrétní funkcionalitu v systému.
- Neznámé zařízení
- Přerušené členství
- Dlužník
- Upozornění na placení - člen ho může sám vypnout oproti přesměrování "Dlužník"
- Uživatelské zprávy - administrátor si může nadefinovat vlastní zprávy s libovolnými vlastnostmi
Při úpravě zpráv je možné použít html tagy i speciální tagy Freenetisu. Například {member_name} je speciální tag napsaný v editoru zprávy. Uživateli se však místo toho zobrazí jeho jméno, v případě, že IP adresa návštěvníka patří nějakému členovi, jinak jsou zobrazeny tři otazníky ???. Lze použít tagy
- {ip_address} - IP adresa návštěvníka
- {subnet_name} - jméno podsítě IP adresy návštěvníka
- {member_name} - jméno člena
- {member_id} - ID člena
- {balance} - stav kreditu člena
- {variable_symbol} - variabilní symbol člena
- {comment} - osobní komentář přesměrovanému konkrétnímu členovi od administrátora
Dalším konceptem je bílá listina. Na bílou listinu jsou umísťovány IP adresy členů, na něž se nemá přesměrování používat. Existuje trvalá bílá listina určená pro důležité partnery, obecní úřady apod.
Dále pak dočasná bílá listina, kdy člen je přesměrován, protože neměl zaplaceno. On ale potřebuje aktivovat internet hned, aby mohl zaplatit třeba přes internetové bankovnictví nebo i z jiného důvodu. Je proto umístěn na dočasnou bílou listinu, ze které bude smazán při příštím importu výpisu. Výhledově je možné tuto funkcionalitu rozšířit o nějaký pevný čas, např. 3 dny při každodenním importu plateb nebo o individuální čas. Účel bílé listiny ale zůstává stejný.
Co je potřeba nastavit na straně Freenetisu?
Je potřeba vyplnit nastavení v menu Přesměrování. Informace o jednotlivých položkách je v programové nápovědě. Dále je potřeba napsat texty minimálně pro systémové zprávy. Je možné využít html tagů i speciálních tagů ve složených závorkách.
Pokud máte již Freenetis nainstalovaný, tak musíte ještě upravit váš soubor .htaccess. V něm přidejte povolení přístupu pro stránku redirection a smažte povolení přístupu pro stránku static. Výsledné pravidlo pak může vypadat např. takto:
# URL containing these strings will not be rewrited. RewriteCond $1 ^(index\.php|robots\.txt|favicon\.ico|media|redirection|backuppc) RewriteRule ^(.*)$ - [PT,L]
Toto se netýká nových instalací Freenetisu, jim by už měl být .htaccess vygenerován správně instalátorem.
Co je potřeba nastavit na straně centrálního routeru?
Toto nastavení je už komplikovanější, ale člověk trochu znalý Linuxu by to měl zvládnout. Je potřeba nainstalovat
- ipset (v Debianu 6 je už dostupný přes repozitář, jinak je nutná ruční instalace)
- lighttpd (nebo jiný nenáročný web server pro HTTP redirect)
Do vhodného umístění (např. /usr/local/sbin) umístit synchronizační skript a nastavit jeho pravidelné spouštění v cronu.
Náš současný skript obsahuje zastaralé funkce a zatím nám na starém Debianu funguje. V novém Debianu bude potřebovat menší upgrade, aby fungoval. Současné verze je ve složce
application/redirection/vendors/redirection/frnts_ipset
Co se týče nastavení skriptu je potřeba určit vnitřní a veřejné IP adresy brány a port, na který bude firewallem přesměrován uživatel. Seznam rozsahů je stahován z adresy
<domena>/cs/web_interface/redirected_ranges
Seznam povolených IP adres pak z adresy
<domena>/cs/web_interface/allowed_ip_addresses
- je potřeba mít na centrálním routeru linux, kde jeho jádro bude zkompilováno spolu s modulem ipset
- na centrálním routeru je potřeba mít správně nakonfigurovaný firewall
- je pořeba řádně nastavit synchronizační skript
Instalace ipsetu v bebianu lze z balíků
apt-get install ipset ipset-source m-a a-i ipset
v jiných distrech dle možností a v neposlední řadě je vlastní kompilace.
Sychronizační skript by měl být nekonfliktní s vaším aktuálně nastaveným firewallem. Pokud nastanou problém, je nutné je řešit individuálně.
Do /etc/init.d/freenetis dáme spouštěcí skript z application/vendors/redirection/freenetis
upravíme práva
chmod 755 /etc/init.d/freenetis
a spust9me po startu
update-rc.d freenetis defaults
Do /usr/local/sbin/freenetis_synchronization.sh dáme skript z application/vendors/redirection/freenetis_synchronization.sh
chmod "a+x" /usr/local/sbin/freenetis_synchronization.sh
Do /etc/freenetins.cfg dáme skript z application/vendors/redirection/freenetis.cfg a dle potřeby upravíme.
Při samotném přesměrování se předpokládá, že na centrálním routeru naslouchá na portu 36000(lze kdykoliv změnit v /etc/freenetis.cfg) démon, který veškeré příchozí http dotazy přesměruje pomoci http redirect na stránku freenetisu.
Pro naši potřebu je dostatečný server lighttpd. V debianu nainstalujema pomocí
apt-get install lighttpd
a v /etc/lighttpd/lighttpd.conf přidáme/upravíme:
server.port = 36000
url.redirect = ( "." => "http://freenetis.domain.ltd" )
Defaultně nám server startuje i na ipv6 což nepotřebuje, takže zakomentujeme
#include_shell "/usr/share/lighttpd/use-ipv6.pl"
Takovéto přesměrování ale bude mít kód 301, moved permanently. Pro bezproblémový chd doporučuji přesměrovávát s kódem 307, tj. temporary redirect. V lighttpd od verze 1.5.0 lze změnit kód malou úpravou
url.redirect-code = 307
Je možné použít jakýkoliv http server - i vlastní řešení.
TODO: Plánuji vlastní "server" založený na nějakém malém http serveru - např. TinyHTTPd. Na jakýkoliv dotaz odpoví temporary redirect na freenetis a nic víc. Eazy.
Synchronizační skript startuje automaticky po startu systému. Je pomžné jej zastavit, nastartovat nebo restartovat pomocí příkazu /etc/init.d/freenetis start|stop|restart
POZOR! Pokud budete jakoliv měnit konfigurační soubor ujistěte se, že je skript ukončen a až pak soubor editujte. Vyhnete se tím nanuálnímu odstaňování starých pravidel z iptables.