Szia, On 11/09/2012 11:07 AM, Kálmánczi Sándor wrote:
Üdvözlet!
Nagy örömmel olvastem az IPTABLESes levelet, nagy várakozásal vagyok ez ügyben. Sajnos nem volt időm foglalkozni mostanában nagyon ezzel, mert itt megkezdődött az évvégi hajtás. Jól. :(
De!
Meglestem a dolgot.
Ez alapján csináltam is egy olyat, hogy:
Vagy egy zorp amiben egy dummy0 interfacen fut egy webszerver:
iptables
# Generated by iptables-save v1.4.14 on Fri Nov 9 10:54:37 2012 *filter :INPUT ACCEPT [12630:1064741] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [30302:5576360] -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -m state --state ESTABLISHED -j ACCEPT -A INPUT -m mark --mark 0x80000000/0x80000000 -j ACCEPT -A OUTPUT -m mark --mark 0x80000000/0x80000000 -j ACCEPT COMMIT # Completed on Fri Nov 9 10:54:37 2012 # Generated by iptables-save v1.4.14 on Fri Nov 9 10:54:37 2012 *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [55883:34402514] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [30302:5576360] :POSTROUTING ACCEPT [0:0] -A PREROUTING -m socket --transparent -j MARK --set-xmark 0x80000000/0x80000000 -A PREROUTING -j KZORP --tproxy-mark 0x80000000/0x80000000 -A FORWARD -j KZORP --tproxy-mark 0x80000000/0x80000000 -A POSTROUTING -j KZORP --tproxy-mark 0x80000000/0x80000000 COMMIT # Completed on Fri Nov 9 10:54:37 2012
policy.py
from Zorp.Core import * from Zorp.Http import * from Zorp.Proxy import *
InetZone('internet', ['0.0.0.0/0'], outbound_services=[ "inetnetnet_HTTP_login0-localcahe"])
InetZone('login0', ['1.1.1.1/32'])
InetZone('login0-localcache', ['172.16.101.254/32'], inbound_services=[ "inetnetnet_HTTP_login0-localcahe"], admin_parent='login0')
NATPolicy(name="inetnet_2_login0-localcache", nat=GeneralNAT(mapping=((InetDomain(addr="0.0.0.0/0"), InetDomain(addr="1.1.1.1/32"), InetDomain(addr="172.16.101.254/32")),)))
def http() : Service(name="inetnetnet_HTTP_login0-localcahe", router=TransparentRouter(forced_port=0, forge_addr=FALSE, forge_port=Z_PORT_ANY, overrideable=FALSE), chainer=ConnectChainer(), max_instances=0, proxy_class=HttpProxy, dnat_policy="inetnet_2_login0-localcache") Dispatcher(transparent=FALSE, bindto=DBIface(protocol=ZD_PROTO_TCP, family=2, iface="eth0", ip="1.1.1.1", port=80), service="inetnetnet_HTTP_login0-localcahe", rule_port="80")
Ez így müködik is és megjelenik a weboldal a kíváncsiskodó számára, de az látszik a logban, hogy a kérelem a 172.16.101.254.ről érkezik. Akkor sem látszik az eredeti IP, ha a webszerveren a logolásnál figyelek a varnish x-forwarded-for-ra.
172.16.101.254 - - [09/Nov/2012:11:01:54 +0100] "GET http://example.com/sites/all/themes/bordo/images/backtotop-arrow-dark.png HTTP/1.1" 304 0 "http://example.com/sites/all/themes/bordo/style.css?md27b0" "Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0 Iceweasel/16.0.2"
Akad esetleg egy mentő ötlet?
Köszönöm!
Tisztelettel: Cs
Ha jól értem a felállást, akkor a Zorp fogadja a HTTP kéréseket és továbbadja a varnish-nak, majd az vagy kiszolgálja cache-ból, vagy pedig továbbadja a belső webszervernek. Ha így van, akkor a probléma lényege az, hogy már a varnish sem láthatja az eredeti forrásip-t, mert a zorp-nak ahhoz, hogy a routing szerint a varnish ne az eredeti kliensnek válaszoljon, át kell írnia a forráscímet arra, ami a felé az interfész felé néz (legyen az akár gépen belül is). Az legegyszerűbb megoldás az, ha csinálsz egy olyan HTTP proxy osztályt, aminek a konfig metódusában az eredeti IP-t beleteszed egy egydi header-be, pl: class ClientIPHttpProxy(HttpProxy): def config(self): HttpProxy.config(self) self.request_header["X-Original-Ip"] = (HTTP_HDR_INSERT, self.session.client_address.ip_s) Majd a belső webszerveren átállítod a loggolást, hogy az X-Original-Ip header tartalmát loggolja forráscímként. Ha minden jól megy, a varnish-on keresztül ennek a header-nek is át kéne folynia a webszerverig és megkapod az eredeti címet. Balint