ggrelay - agent przekazujacy (przezroczysty proxy) dla Gadu-Gadu Copyright (C) 2003-2004 Szymon Acedanski Ten drobny program to nic innego, jak prosty proxy dla polaczen Gadu-Gadu. To znaczy, ze jesli jestes administratorem sieci i chcialbys, aby ludzie w lanie mogli korzystac z polaczen bezposrednich (rozmowy glosowe, przesylanie plikow) przez Gadu-Gadu, to ta aplikacja powinna pomoc. UWAGA: Grzecznie prosze o przeczytanie "Konfiguracji dla GG6.0", bo inaczej 98% lub wiecej ludzi bedzie narzekac, ze GG nie dziala. :) Wymagania --------- Aktualna wesja jest napisana do dzialania na architekturach little-endian (w praktyce na prockach intelopodobnych). Choc jest stworzona dla Linuxa, nie wykluczone, ze zadziala na innych systemach unixowych. Instalacja ---------- 1. zaloguj sie na roota 2. ./install.sh 3. /etc/rc.d/init.d/ggrelay start 4. iptables -t nat -A PREROUTING -i -p tcp \ --dport 8074 -j REDIRECT 5. iptables -I FORWARD -o -d 217.17.41.0/24 \ -p tcp --dport 443 -j REJECT Jak chcesz wiedziec, po co to zamieszanie z iptables, to proponuje poczytac nastepne rozdzialy. **UWAGA!** Nalezy tak skonfigurowac regulki firewalla, zeby nie wycinac polaczen przychodzacych na port 1550 na zewnetrzne IP. Dotyczy to rowniez polaczen inicjowanych *z*wnetrza*sieci*! Jak to sprawdzic? Odpalic ggrelay'a i z jakiegos kompa w LAN-ie odpalic telnet'a na port 1550 na zewnetrzne IP serwera. Polaczenie powinno sie udac i po wklepaniu przez uzytkownika jakichs ok. osmiu znaczkow ggrelay powinien zamknac polacznie. Jesli nie da sie nawiazac w ten sposob polaczenia, to nalezy poprawic konfiguracje firewalla. Konfiguracja ------------ Wszystkie opcje konfiguracyjne musza byc przekazane ggrelay-owi jako parametry linii komend. Trzeba mu powiedziec co najmniej, ktory z interfejsow jest wyjsciem na swiat (tutaj beda przekierowywane polaczenia bezposrednie): ggrelay -o ppp0 W tym przypadku wszystkie polaczenia z sieci wewnetrznej idace na port 8074 beda przechwytywane i kierowane tak, aby polaczenia bezposrednie przychodzily na domyslny adres IP interfejsu ppp0. Wszystkie te polaczenia beda przychodzic na jeden i ten sam port - 1550. Juz ggrelay zajmie sie rozdzielaniem ich na poszczegolnych klientow w lanie. Inne ciekawe opcje to np. ustawianie interfejsu wewnetrznego, na ktorym ggrelay bedzie sluchal nadchodzacych polaczen GG (opcja -i), ustawienie alternatywnych portow polaczen GG i polaczen bezposrednich (--gg-port, --dcc-port). Inny uzyteczny parametr to -u, pozwalajacy na odpalenie ggrelaya jako jakiegos kitowego uzytkownika, ktory nie jest w stanie nic namieszac, jakby jakis maniacki hacker wpadl na nieskonczenie idiotyczny pomysl i chcial sie zabrac za ggrelaya. Przelacznik -d powoduje, ze po poprawnym zainicjalizowaniu, ggrelay zaczyna chodzic w tle jako demon. Tak wiec w sumie wypada odpalic sprzet jako cos typu: ggrelay -i -o -u nobody -d Kolejny krok to skonfigurowanie tych wszystkich iptables'ow zeby polaczenia GG byly przekierowywane do ggrelaya. Najprosciej to wyglada tak: iptables -t nat -A PREROUTING -p tcp --dport 8074 -j REDIRECT Trzeba jeszcze pamietac, zeby nie wycinac komunikacji na porcie 1550 (na wszystkich interfejsach), aby polaczenia bezposrednie mogly jakos dosiegnac ggrelaya. To samo dotyczy portu 8074 na wewnetrznym intefejsie. Jeszcze jedna uwaga: jesli z jakiegos powodu ggrelay albo nie zostanie odpalony, albo sie wysypie podczas, gdy regulka przekierowujaca bedzie w iptables, to polaczenia GG pojda do smietnika i potem w sumie nikomu GG nie bedzie dzialac. Dolaczony skrypcik install.sh ma poniekad pomoc w konfigurowaniu skryptow startowych. Tworzy on standardowe skrypty w /etc/rc.d, w wersji dla RedHata/Fedory (co nie znaczy, ze na innych nie bedzie dzialac, ale moga byc pewne problemy). install.sh tworzy tez automatycznie plik konfiguracyjny /etc/sysconfig/ggrelay. W tym pliku znajduja sie parametry przekazywane do ggrelaya przez skrypt /etc/rc.d/init.d/ggrelay. Konfiguracja klientow --------------------- Generalnie, aplikacje klienckie nie wymagaja specjalnej konfiguracji, trzeba jedynie wlaczyc (lub nie wylaczac) bezposrednie polaczenia: a) na ekg: odpalic 'set dcc 1' i potem 'reconnect' b) na Kadu: zaznaczyc 'Enable DCC' w Kadu -> Configuration -> Network. c) na Windowsowym GG: zaznaczyc Ustawienia -> Polaczenie -> Uzywaj polaczen bezposrednich. Konfiguracja dla GG6.0 ---------------------- GG 6.0 (i bycmoze jakies poprzednie wersje) wprowadzily: a) pedantyczne reguly sprawdzania adresow, od ktorych przychodza polaczenia bezposrednie b) kryptografie oparta na SSL-u ggrelay radzi sobie aktualnie z czescia a) bez dodatkowej konfiguracji. Drugi problem to kryptografia - GG6 uzywa domyslnie SSLa i ggrelay nie obsluguje tego na tyle, zeby dzialalo to z windowsowym GG. Jednakze jest mozliwosc zmiany zachowania sie klientow bez koniecznosci przekonfigurowywania czegokolwiek w GG. Otoz, jesli sie zablokuje komunikacje do serwerow GG na porcie 443 (ssl), to GG automatycznie sie przelaczy na komunikacje nieszyfrowana na standardowym porcie 8064. Poniewaz nie jest to aktualnie idealne rozwiazanie, pracuje nad pelna implementacja kryptografii w ggrelayu. Chociaz obsluga SSL jest juz wpisana w zrodla, to jest wysoce eksperymentalna i poki co dziala jedynie z uniksowym ekg. Zatem pozostaje: iptables -I FORWARD -o -d 217.17.41.0/24 -p tcp \ --dport 443 -j REJECT Obsluga SSL (wysoce eksperymentalna) ------------------------------------ Poczawszy od ggrelay-1.0-rc3, istnieje eksperymentalne wsparcie dla kryptografii opartej o OpenSSL. Aktualnie najwazniejszym celem jest uzyskanie kompatybilnosci z windowsowym GG (zatem aktualnie jeszcze nie dziala). Jesli chcesz odpalic SSL, istnieje drobny skrypcik 'sslsetup' w katalogu scripts/, ktory pomoze w konfiguracji SSLa. Mozna to jednak zrobic rowiniez recznie: a) nalezy wygenerowac klucz serwera oraz certyfikat poswiadczajacy autentycznosc openssl req -x509 -newkey rsa:1024 -keyout \ -out -nodes b) trzeba dopisac do parametrow --ssl-key --ssl-cert Azeby przechwycic przychodzace polaczenia SSL, ruch adresowany do serwerow GG na port 443 powinien zostac przekierowany do serwera, na port 8075 (albo inny ustawiony parametrem --ssl-port). Przyklad: iptables -t nat -A PREROUTING -p tcp -d 217.17.41.0/24 --dport 443 \ -j REDIRECT --to-ports 8075 Strategia wyboru serwera GG --------------------------- Poczawszy od wersji 1.3-rc1, ggrelay uzywa nowej strategii wyboru serwera GG, z ktorym bedzie nawiazywal polaczenie (poprzednio wybieral kolejne serwery z wpisanej listy). Teraz proces przebiega w dwoch fazach. Najpierw ggrelay sprawdza, do kogo oryginalnie polaczenie bylo adresowane (jesli zostalo przekierowane REDIRECT'em). Jesli ten adres znajduje sie na liscie serwerow GG (opcje -s) to polaczenie jest adresowanie wlasnie tam. W przeciwnym razie albo jest odrzucane, albo program przechodzi do fazy drugiej. To zachowanie jest kontrolowane parametrem --drop-unlisted. Jesli z jakiejs przyczyny pierwsza faza nie wyloni serwera, do ktorego mozna sie polaczyc, serwer zostanie wybrany z wpisanej listy. Jednakze tutaj wybierane beda przede wszystkim serwery, z ktorymi nie bylo problemow przy ostatnich polaczeniach. Ponadto w przypadku problemow z nawiazaniem polaczenia z jakims z serwerow, proba jest powtarzana z innymi serwerami. Ilosc prob mozna ustawiac przy pomocy parametru --conn-attempts. Wszystkie parametry ------------------- -i , --inner-ip wewnetrzne IP lub interfejs -o , --outer-ip zewnetrzne IP lub interfejs -d, --daemonize spadaj w tlo do odpaleniu -s , --server adres serwera GG (moze wystapic kilka razy) -u , --user odpal jako inny uzytkownik -m , --gg-limit max. ilosc polaczen GG -n , --dcc-limit max. ilosc polaczen bezposrednich --conn-attempts ilosc prob polaczenia sie z svrem --drop-unlisted wytnij polaczenia do nieznanych serwerow (opcja -s) --static-buffers wylacz dynamiczna alokacje buforow --gg-port zmien port GG (domyslnie 8074) --relay-local przechwytuj rowniez polaczenia bezp. miedzy ludzmi w lanie --cascade wlacz tryb kaskady (ggrelay-za-ggrelayem) --scalable uzywaj duzych tablic haszujacych --dcc-port zmien port pol. bezp. (dom. 1550) --ssl-port zmien port pol. SSL (dom. 8075) --ssl-key klucz prywatny SSL --ssl-cert certyfikat SSL -l, --logging wlacz szczegolowe logowanie -v, --verbose wlacz bardzo szczegolowe logowanie na stderr (musi byc skompilowany z --enable-debug) -h, --help, --usage pokaz pomoc --version pokaz informacje o wersji UWAGA: Wlaczenie --logging moze powodowac zapisywanie kupy smieci w logach. UWAGA: Jesli chcesz uzywac klienta GG na serwerze, to dobrze jest ustawic alternatywny port na przekierowywanie polaczeen bezposrednich, np: ggrelay -o ppp0 --dcc-port 1551 Dodatkowe uwagi --------------- - nie dziala 'dcc rsend' (w ekg) do klientow za ggrelayem, ale zawsze mozna sie do nich dostac zwyklym 'dcc send'. Problemy itp. ------------- Prosze dolaczyc natepujace informacje podczas raportowania bledow i problemow. Raporty mozna prezesylac mi bezposrednio na adres accekpoczta{dot}onet[dot]pl. a) wersja ggrelay (ggrelay --version) b) wersja iptables (iptables --version) c) wersja jadra Linuxa (uname -a) d) 'iptables -v -n -t nat -L' e) 'iptables -v -n -L' f) /etc/sysconfig/ggrelay g) informacje generowane przez ggrelaya skompilowanego ze zrodel uzywajac './configure --enable-debug' i odpalonego w konsoli z parametrami ggrelay -i ... -o ... -l -v Podziekowania ------------- Serdecznie dziekuje tym wszystkim, ktorzy przyczynili sie do powstania ggrelaya oraz tym, ktorzy pomagali i pomagaja mi w testowaniu, a takze tym ktorzy notorycznie narzekaja, ze cos nie dziala. Szczegolnie chcialbym podziekowac Przemyslawowi "Przemo-c" Dubielowi ze to, ze spedza mnostwo czasu na testowaniu aplikacji, za udostepnienie mi konta na jego servie, a takze za cala jego pomoc. Dzieki, Przemku! Autor ----- Szymon Acedanski ul. Sloneczna 81D/1 40-136 Katowice, POLAND phone: +48 506 202715 email: accek{at}poczta[dot]gazetapl vim:tw=70:syntax=