[zorp-hu] virtualis ip cimak hasznalata ?
Balazs Scheidler
bazsi@balabit.hu
Wed, 21 Aug 2002 15:07:50 +0200
On Wed, Aug 21, 2002 at 01:38:43PM +0200, nagy_l@vaxst2.tii.matav.hu wrote:
>
> >SNAT osztalyt valahogy igy kell letrehoznod:
>
> >class MySNAT(AbstractNAT):
> > def performTranslation(self, session, addr, nat_type = NAT_SNAT):
> > return SockAddrInet('xxx.xxx.xxx.xxx', 12345)
>
> >a fuggveny testeben lehet barmi, ami pythonban engedelyezett. Tovabbi
> >peldakent a standard NAT osztalyokat megtalalod a NAT.py allomanyban.
>
> Ok, ezt ertem. Az SNAT-nal nincs jelentosege a forrasportnak nem ?
> Vagyis az 12345 helyett a 0 is jo ha jol gondolom.
igen. a 0 azt jelenti, hogy dinamikusan keressunk forrasportot, a nem 0 azt,
hogy az adott portrol akarsz menni. (persze ez nem biztos, hogy sikerul)
>
> >>
> >> ha a cel cimet hamisitom, akkor :
> >> - router=TransparentRouter() (itt nem csinalok semmit, kerdes, hogy ha be
> >> kell irni a celportot, akkor azt hogy kell megcsinalni ?)
> >> vagy, ha virtualis cimra jott (egy gepeseten) :
> >> - router=DirectedRouter(SockAddrInet('192.168.253.11', ? ))
> >> (ide mit kell irni a celporthoz, ha ugyanaz mint amire jott ? ha nem ugyanaz,
> >> akkor termeszetesen beirom, hogy hova kell kuldeni...)
>
> >A portot jelenleg kotelezo kiirni, bar egy kb ket soros patch segitsegevel
> >megvalosithato, hogy 0-s port eseten az eredeti port a default.
>
> >Miert van erre szukseg?
>
> Azert mert elofordulhat, hogy egy port tartomanyt akarok atengedni (a 2100-tol
> a 3100-as portig egy csomo portot hasznal az alkalmazas es nem akarom mindet
> felsorolni, hanem csak megadom, hogy mettol meddig menjenek at a csomagok)
> Ebben az esetben kellene valahogy az eredeti port es azt tudnam betenni a
> DNAT-hoz vagy a DirectedRouterhez. pl port(orig(akarmi)) visszaadna azt a
> portot amire eredetileg ment a csomag.
>
> Ha egy port van , akkor ez nem problema, de ha tobb portot fel akarok solorlni,
> vagy egy port tartomanyt adok meg, akkor elore nem irhatom be, hogy melyik
> portra kell menni (arra kell menni, amire eredetileg ment a csomag)
> Ha egy konkret portra kell mindent atiranyitani azt persze meg tudom csinalni,
> de most nem ez a feladat.
oke, felveszem a todo-ra.
>
> >> vagy, ha virtualis cimre jott (tobb gen eseten)
> >> - router=myDirectedRouter()
> >>
> >> (A 192.168.253.111 a virtualis cim)
> >> Itt is erdekelne, hogy ez a myDirectedRouter hogy nezzen ki. Attol fuggoean,
> >> hogy milyen cimre jott a csomag hova kell tovabbitani. Ezt valahogy le kellene
> >> vizsgalni es e szerint cselekedni. Az is kerdes, hogy a portot (ha ugyanaz, ill
> >> ha valtozik) hogy tudom betenni ?
>
> >A forras- ill. celnat-ot ugyanaz az osztaly vegzi, a nat_type argumentumban
> >megkapja, hogy konkretan mirol is van szo.
>
> Ok, de meg mindig nem vilagos, hogy ha egy proxyval akaok lekezelni tobb
> virtualis cimet, akkor azt hogy oldjam meg.(es nm mappingrol van szo)
> Valami if - else szeruseget kell betenni a myDNAT-ba, de nem tudom ennek mi a
> pontos szintaktikaja. (Persze meg is tanulhatnek pythonul, de gondoltam hatha
> megmondjatok, hogy ezt hogy kell betenni ide...)
>
az elozo levelemben volt egy pelda, ezt az osztalyt tedd be a
peldanydefinicioid ele:
class MySNAT(AbstractNAT):
def performTranslation(self, session, addr, nat_type = NAT_SNAT):
if nat_type == NAT_SNAT:
if addr < InetDomain('192.168.0.0/24'):
# a forditando cim benne van a 192.168.0.0/24-ben
return SockAddrInet('1.2.3.4', 0)
else:
return addr
Egy kicsit ertelmesebb NAT osztaly pl a HashNAT:
class HashNAT(AbstractNAT):
def __init__(self, ip_hash, default_reject=TRUE):
AbstractNAT.__init__(self)
self.ip_hash = ip_hash
self.default_reject = default_reject
def performTranslation(self, session, addr, nat_type=NAT_SNAT):
try:
if nat_type == NAT_SNAT:
ip = self.ip_hash[session.client_address.ip_s]
return SockAddrInet(ip, 0)
else:
ip = self.ip_hash[addr.ip_s]
return SockAddrInet(ip, addr.port)
except KeyError:
if self.default_reject:
raise DACException, 'IP not within the required range.'
else:
return addr
> Ezek az esetek nem agyafurt modon megkrealt szituacios gyakorlatok, hanem igy
> mukodik nehany rendszer. Arpi irt erre egy sajat 'Zorp'-pt,de en szeretnem a
> standard eljarasok segitsegevel megoldani a problemat, hogy ne kelljen minden
> tuzfalra raszabni a Zorpot, hanem egyfelekeppen le tudjunk kezelni minden
> lehetoseget.
>
> Igazabol mar odaig eljutottam, hogy a OneToOneMultiNAT alkalmazasara egy
> reszletes pelda is eleg lenne a virtualis cimek kezelesehez.
Ez egy OneToOneNAT-os pelda:
Service("prot_PLUG", PlugProxy,
dnat=OneToOneNAT(InetDomain('10.0.0.1/32'),
InetDomain('192.168.1.2/32'),
default_reject=FALSE))
MultiNAT-os pelda:
Service("prot_PLUG", PlugProxy,
dnat=OneToOneMultiNAT([(InetDomain('10.0.0.1/32'), InetDomain('192.168.1.2/32')),
(InetDomain('10.0.0.3/32'), InetDomain('192.168.1.3/32'))],
default_reject=FALSE))
termeszetesen az adott cimek teljes cimtartomanyok is lehetnek.
--
Bazsi
PGP info: KeyID 9AF8D0A9 Fingerprint CD27 CFB0 802C 0944 9CFD 804E C82C 8EB1