Első szolgáltatas amit nyújtani szeretnénk az a cég weblapjának elérhetősége az internetről. Ehhez egy olyan proxy modult indítunk, amely a csomag eredeti céljától függetlenűl mindenképpen a DMZ-ben lévő webszerverhez csatlakozik, melynek IP címe: 192.168.0.2.
Ehhez négy dolgot kell tennünk. Első, hogy megmondjuk a Zorp-nak, figyeljen a tűzfal külső lábán a 80-as porton jövő kérésekre. Ezt a kovetkező sorrral tudjuk megtenni:
Example 4-2. Listener létrehozása
Listener(SockAddrInet("10.9.8.7", 80), plug_direct_service)
|
Így a Zorp figyelni fog a 10.9.8.7 -es IP cim 80-as portján, és ha érkezik egy kapcsolat, akkor elinditja a plug_direct_service nevu Service-t.
Ezután létre kell hoznunk azt a szolgáltatást, amit kapcsolódáskor a Listener elindít. Esetünkben ez most egy direkt kapcsolódású szolgáltatás, ami azt jelenti, hogy mi határozzuk meg - az eredeti céltol teljesen függetlenül - hogy mi legyen a szerver címe. Ez most azert fontos, mivel kintről csak a 10.9.8.7-es cím elérhető, a DMZ-ben levő IP cimek nem route-olhatoak.
Itt például a cél a 192.168.0.2-es gép 8080-as portja. (ahol remélhetőleg egy web szerver várja a kéréseket.)
Example 4-3. Direkt kapcsolódású szolgáltatás létrehozása
plug_direct_service = \
Service("directplug",
DirectedChainer(SockAddrInet("192.168.0.2", 8080)),
MyPlug)
|
Végül engedélyezzük a zónadefinicióban is az internet felől érkező, a DMZ-be tartó directplug szolgaltatast.
Example 4-4. Zóna definíció szolgáltatás engedélyezéssel
Zorp.zones = [
InetZone("intranet","192.168.1.0","255.255.255.0", None),
InetZone("DMZ", "192.168.0.0", "255.255.255.0", None,
inbound_services = ["directplug"]),
InetZone("internet", "0.0.0.0", "0.0.0.0", None,
outbound_services = ["directplug"])]
|
Már csak a MyPlug osztályt kell definiálni. A példánkban egy egyszerű, Plug tipusú proxy modult használunk.
Example 4-5. Származtatott proxy modul definíciója
class MyPlug(Plug.PlugProxy): def config(self): pass |
Example 4-6. Szolgáltatás definíció beépített proxy osztállyal
plug_direct_service = \
Service("directplug",
DirectedChainer(SockAddrInet("192.168.0.2", 8080)),
PlugProxy)
|
from Zorp.Zorp import *
from Zorp import Zorp
from Zorp.Zone import InetZone
from Zorp.Service import Service
from Zorp.SockAddr import SockAddrInet
from Zorp.Chainer import TransparentChainer, DirectedChainer, InbandChainer, FailoverChainer
from Zorp.Plug import PlugProxy
from Zorp import Http
from Zorp.Http import HttpProxy
from Zorp.Ftp import FtpProxyAllow
from Zorp.Listener import Listener
Zorp.firewall_name = 'bzorp@fiktiv'
Zorp.zones= [
InetZone("intranet","192.168.1.0","255.255.255.0", None),
InetZone("DMZ", "192.168.0.0", "255.255.255.0", None,
outbound_services=[],
inbound_services = ["directplug"]),
InetZone("internet", "0.0.0.0", "0.0.0.0", None,
outbound_services = ["directplug"],
inbound_services = [])]
class MyPlug(Plug.PlugProxy):
def config(self):
pass
def init(name):
plug_direct_service = \
Service("directplug",
DirectedChainer(None,
SockAddrInet("192.168.0.2", 8080)),
MyPlug)
Listener(SockAddr.SockAddrInet("10.9.8.7", 80),
plug_direct_service)
|
Így a szükséges új elemek:
Example 4-7.
plug_transparent_service = \
Service("intransplug",
TransparentChainer(forge_addr=TRUE),
MyPlug)
Listener(SockAddrInet("192.168.1.1", 8080), plug_transparent_service)
|
A szerverhez való kapcsolódáskor a kapcsolat forráscímét a TransparentChainer osztály két paraméter alapján határozza meg:
local, ha nem None, akkor erre a címre bindol kapcsolódás előtt
forge_addr, ha értéke TRUE, akkor a tűzfal felveszi a kliens eredeti címét kapcsolódás előtt. Ilyenkor a local paraméter értéke érdektelen.
Example 4-8.
plug_transparent2_service = \
Service("transplug",
TransparentChainer(local=None, forge_addr=FALSE),
MyPlug)
Listener(SockAddrInet("192.168.1.1", 80),
plug_transparent2_service)
|
Nézzük meg, hogy hol is tartunk:
Example 4-9.
...
Zorp.firewall_name = 'bzorp@fiktiv'
Zorp.zones= [
InetZone("intranet","192.168.1.0", "255.255.255.0", None,
outbound_services = ["intransplug", "transplug"],
inbound_services = []),
InetZone("DMZ", "192.168.0.0", "255.255.255.0", None,
outbound_services = [],
inbound_services = ["directplug", "intransplug"]),
InetZone("internet", "0.0.0.0", "0.0.0.0", None,
inbound_services = ["transplug"],
outbound_services = ["directplug"])]
class MyPlug(Plug.PlugProxy):
def config(self):
pass
def init(name):
plug_direct_service = \
Service("directplug",
DirectedChainer(SockAddrInet("192.168.0.2", 8080)),
MyPlug)
plug_transparent_service = \
Service("intransplug",
TransparentChainer(forge_addr=TRUE),
MyPlug)
plug_transparent2_service = \
Service("transplug",
TransparentChainer(),
MyPlug)
Listener(SockAddrInet("10.9.8.7", 80),
plug_direct_service)
Listener(SockAddrInet("192.168.1.1", 8080),
plug_transparent_service)
Listener(SockAddrInet("192.168.1.1", 80),
plug_transparent2_service)
|
Example 4-10. Http proxy osztály definiálása
class MyHttp(Http.HttpProxy): def config(self): self.transparent_mode = 1 |
Example 4-11.
http_service = Service.Service("http", TransparentChainer(), MyHttp)
|