[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