   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 <interfejs wewnetrzny> -p tcp \
     --dport 8074 -j REDIRECT

5. iptables -I FORWARD -o <interfejs zewnetrzny> -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 <interfejs na lan> -o <interfejs na swiat> -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 <external iface> -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 <plik klucza> \
	-out <plik certyfikatu> -nodes

b) trzeba dopisac do parametrow

	--ssl-key <plik klucza>
	--ssl-cert <plik certyfikatu>

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 <ip/if>, --inner-ip <ip/if>  wewnetrzne IP lub interfejs
  -o <ip/if>, --outer-ip <ip/if>  zewnetrzne IP lub interfejs
  -d, --daemonize                 spadaj w tlo do odpaleniu
  -s <ip>, --server <ip>          adres serwera GG (moze wystapic
                                                           kilka razy)
  -u <user>, --user <user>        odpal jako inny uzytkownik
  -m <num>, --gg-limit <num>      max. ilosc polaczen GG
  -n <num>, --dcc-limit <num>     max. ilosc polaczen bezposrednich
  --conn-attempts <num>           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 <file>                klucz prywatny SSL
  --ssl-cert <file>               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
accek<at>poczta{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]gazeta<dot>pl




vim:tw=70:syntax=
