Transparenter HTTP proxy mit squid

boesemar

Well-Known Member
Hallo,
ich frag mich ob hier jemand mal einen squid transparent mit ipfw fuer FreeBSD 4 configuriert hat..
Ich hab einen halben tag mich daran versucht, will nicht. Ich wollte eigentlich allen port-80 traffic auf localhost:3128 umlenken (da laeuft der proxy, der funktioniert auch wenn man browser darauf umstellt).

Also mach ich:
${ipfw} add 950 allow tcp from ${ip_router} to any
${ipfw} add 951 allow tcp from any to me 80
${ipfw} add 955 fwd ${ip_router},3128 tcp from ${net_int} to any 80

# dannach nat rule
${ipfw} add 1000 divert natd all from ${ip_router} to any 80

..das liefert mir leider leere documente zurrueck (steht nix drinne). net_int ist 192.168.0.0/16, ip_router der rechner selbst.

Netgraph, ipfilter ist im kernel.

Aus der squid Makefile habe ich eine option gefunden (mit "nettem" kommentar):

# This option does not work on FreeBSD at the moment:
# --enable-ipf-transparent
# Enable Transparent Proxy support for IP-Filter systems (incl 3.0)
# (IPFilter headers are not currently installed to the base system,
# PRs ports/60700 and misc/44148 describe the problem; see
# http://www.squid-cache.org/Doc/FAQ/FAQ-17.html for information
# about how to do transparent proxying with ipfw)

Die FAQ hab ich auch gelesen... :)

Wenn ich trotzdem anschalte, finder der die netgraph header files nicht.

In hab irgendwo noch gelesen dass ich in der squid.conf:

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

..anschalten soll. Wenn ich das mache bekomme ich sogar eine rueck(fehler)meldung vom squid: host not found - allerdings ist der host abgehackt: wenn z.B. http://www.bsdforen.de/index.html, sagt der "Host .sdforen.de/index.html" not found (so in etwa).

Ich hab FreeBSD 4.10.

Danke!
martin
 
ich hab mal gehört das es wichtig is, das der squid auch auf port 80 läuft, da ipfw die packete 1:1 durchreicht ohne die header zu verändern.
 
Danke, klappt leider auch nicht (gleiches problem), bin aber noch dran ..
Das mit dem 80er port ist (wenn richtig verstanden) wenn du deinen eingenen webserver entlasten willst.
 
Hoi,

wenn die IP Adresse eine lokale Adresse ist werden die zutreffenden Pakel forwarded zum Port wo angegeben ist, bzw. falls keine Port Nummer in der Rule angegeben ist zu der wo im Pakel enthalten ist.

Wenn die IP Adresse keine lokale Adresse ist wird, falls eine Port Nummer angegeben ist, die Portnummer ignoriert und das Paket zur angegebenen nicht lokalen Adresse, unter Nutzung der Routing Tabelle, geforwardet. Die Portangabe im IP Pakel wird hierzu verwendet.

Zu Deinem Squid:

ipfw add <Rule-No> fwd <ziel-ip>,<ziel-port> <protokoll> from <src-ip> to <$host_selber> <eingehender Port> in recv ${interface}

z.B. ipfw add 10 fwd 127.0.0.1,3128 tcp from any to me 80 in recv ${netzwerk-interface}

würde eingehende TCP Pakel auf Port 80 umleiten auf IP 127.0.0.1 auf Port 3128,. sofern diese über das Interface ${netzwerk-interface} eingehen.

Gruß Bummibaer
 
Zuletzt bearbeitet:
Was auf keine Fall vergessen werden darf (und ich spreche aus Erfahrung :)) sind die Access-Control-Lists. Z. B. für ein 192.168.0.x-Netz:
> acl allowed_hosts src 192.168.0.0/255.255.255.0
> http_access allow allowed_hosts
 
mos6510 schrieb:
Was auf keine Fall vergessen werden darf (und ich spreche aus Erfahrung :)) sind die Access-Control-Lists. Z. B. für ein 192.168.0.x-Netz:
> acl allowed_hosts src 192.168.0.0/255.255.255.0
> http_access allow allowed_hosts

Hi ich hatte schonmal geschrieben aber keine Antwort gekriegt.


ich habe nach der Anleitung von hier:
http://wiki.bsdforen.de/tiki-index.php?page=Transparenter+Squid squid aufgesetzt.

Dazu habe die Firewall Konf einmal angepasst.

#!/bin/sh
fwcmd="/sbin/ipfw -q"
internnw="rl0"
externnw="sk0"
inet="10.210.64.0/24"

${fwcmd} -f flush

${fwcmd} add 00010 fwd 127.0.0.1,8080 tcp from any to me 80 in recv ${internnw}
${fwcmd} add 00100 allow ip from any to any via lo0
${fwcmd} add 00500 check-state

#tcp
${fwcmd} add 01000 allow tcp from { me or ${inet} } to 192.xxx.xxx.xxx 25 setup keep-state
${fwcmd} add 01001 allow tcp from { me or ${inet} } to 192.xxx.xxx.xxx 993 setup keep-state
#${fwcmd} add 01100 allow tcp from any to me ${tcp_server} setup keep-state

#udp
${fwcmd} add 02000 allow udp from { me or ${inet} } to 192.xxx.xxx.xxx 25 keep-state
${fwcmd} add 02000 allow udp from { me or ${inet} } to 192.xxx.xxx.xxx 993 keep-state

#icmp
${fwcmd} add 03000 deny icmp from any to { me or ${inet} } icmptypes 3
${fwcmd} add 03100 deny icmp from any to { me or ${inet} } icmptypes 4
${fwcmd} add 03200 deny icmp from { me or ${inet} } to any icmptypes 8 keep-state
${fwcmd} add 03300 deny icmp from any to { me or ${inet} } icmptypes 11

#deny the rest
${fwcmd} add 65000 deny ip from any to any

das müsste doch passen oder?

Was macht die Rule 1100 eigentlich?
 
Die ACLs werden in der "squid.conf" eingetrage. Wenn Dein privates Netz (z. B. 192.168.0.0/24) nicht "freigeschaltet" wurde, verwirft er weitergeleitete Anfragen. Was die IPFW-Regeln angehen, sollte der folgende einfache Eintrag ausreichen, um den HTTP-Traffic an den Squid weiter zu leiten:

> ipfw add fwd 127.0.0.1,8000 tcp from 192.168.0.0/24 to any 80 out via sk0

Allerdings hatte ich seinerzeit NAT über Userland-PPP machen lassen, daher habe ich mich nicht mit den NATd auseinander setzen müßen.

Meine Empfehlung ist, erst mal den Proxy zum laufen bekommen, sodass er auf Anfragen von Clients reagiert, die den Proxy z. B. im Webbrowser eingtragen haben. Danach Schritt-für-Schritt die Firewall-Regeln anpassen.

Bye, Dirk
 
mos6510 schrieb:
Die ACLs werden in der "squid.conf" eingetrage. Wenn Dein privates Netz (z. B. 192.168.0.0/24) nicht "freigeschaltet" wurde, verwirft er weitergeleitete Anfragen. Was die IPFW-Regeln angehen, sollte der folgende einfache Eintrag ausreichen, um den HTTP-Traffic an den Squid weiter zu leiten:

> ipfw add fwd 127.0.0.1,8000 tcp from 192.168.0.0/24 to any 80 out via sk0

Allerdings hatte ich seinerzeit NAT über Userland-PPP machen lassen, daher habe ich mich nicht mit den NATd auseinander setzen müßen.

Meine Empfehlung ist, erst mal den Proxy zum laufen bekommen, sodass er auf Anfragen von Clients reagiert, die den Proxy z. B. im Webbrowser eingtragen haben. Danach Schritt-für-Schritt die Firewall-Regeln anpassen.

Bye, Dirk

OK. Wie schaut es aus mit https anfragen. Die müssten ja dann auch über rule laufen (port 443) oder? funktioniert das ganze auch, wenn ich maschinen im Netz habe die ich updaten will (cvsup)?
 
onegroup schrieb:
OK. Wie schaut es aus mit https anfragen. Die müssten ja dann auch über rule laufen (port 443) oder? funktioniert das ganze auch, wenn ich maschinen im Netz habe die ich updaten will (cvsup)?

das musst du dann wieder über die firewall-regeln bzw. paketfilter regeln machen (also den clients im netz eben den port 443 explizit oder für alle freigeben).
mit https kann der squid wenig anfangen, da der inhalt bei https ja verschlüsselt ist und das kann der squid nicht cachen und die acl's haben auf den traffic auch keine einfluss (soweit ich es zumindest noch im gedächtniss habe).
für cvsup müsstest du port 5999 noch freigeben
 
[moR-pH-euS] schrieb:
das musst du dann wieder über die firewall-regeln bzw. paketfilter regeln machen (also den clients im netz eben den port 443 explizit oder für alle freigeben).
mit https kann der squid wenig anfangen, da der inhalt bei https ja verschlüsselt ist und das kann der squid nicht cachen und die acl's haben auf den traffic auch keine einfluss (soweit ich es zumindest noch im gedächtniss habe).
für cvsup müsstest du port 5999 noch freigeben


Ich habe es mal getestet.

Die rule von oben funktioniert leider nicht.

ich konnte das Problem auf

${fwcmd} add 00010 fwd 127.0.0.1,8080 tcp from any to me 80 in recv ${internnw}

eingrenzen.

Dort kommt eine ipfw fehlermeldung die ich nicht deuten kann.

Die Firewall ist dann damit komplett dicht.

Schade.

Weiss eventl jemand weiter? Ich setzte jetzt mal eine 4.10 stable auf die soll ja auch ipfw2 haben soweit ich gelesen habe.


Grüße
 
Hallo.

Also ich weiss nicht warum, aber ich habe mich nochmal von vorne daran gemacht, bin ungefaehr auf genau dasselbe herrausgekommen wie mein urspruenglicher beitrag auf diesem thread... und.... ES FUNKTIONIERT! ;-)

Komisch - I denke da hab ich irgendwie mist gebaut vor den paar monaten (vergessen fw oder squid neu zu laden etc..).

Bin jedenfalls froh das es funkioniert .. wer jetzt noch fragen dazu hat kann sich gerne an mich wenden :-)

Gruesse,
Martin
 
Hi,


kannst du deine FW rules bitte einmal post und was du im Kernel hast?

Danke!

Bei mir gehts immernoch nicht so richtig..

Gruß

S.
 
Okay, ich versuchts mal...

Kernel ist 4.10-RELEASE, GENERIC plus IPFILTER und NETGRAPH. Habs einfach aus LINT geholt, cat LINT | grep -i ipfire >> GENERIC
Glaube nicht das du netgraph brauchst.

Firewall kurzform ist:

# ich selbst darf alles:
allow tcp from 192.168.0.1 to any

# transparent proxy:
allow tcp from any to me 80
fwd 192.168.0.1,3128 tcp from 192.168.0.0/16 to any 80

# dannach nat (dsl connection auf tun0):
divert 8668 ip from any to any via tun0
allow tcp from any to any established

# Hier kommt nie ein paeckchen an, weil vorher umgeleitet:
deny tcp from 192.168.0.0/16 to any 80


Wichtig im squid.conf:

httpd_accel_host virtual
httpd_accel_uses_host_header on

Mein squid laeuft uebrigens auf port 3128 .. muss also nicht auf port 80 sein.
Geht auch nicht-transparent (wenn man auf browser am client einstellt).
Also bring squid zum laufen, dann bieg die firewall um und guck dir die access.logs vom an. Da sollte dann schon was auftauchen..

Gruesse,
Martin
 
Hi,

mhh das heisst quasi nat brauche ich immer wenn das ding als gateway läuft?

Ich habe es ja versucht mit ipfw2 und bsd 4.10 und 5.3 zum laufen zu bringen.

Wenn ich natd laufen habe forwardet er mir keine Pakete mehr. Oder muss die divert regel erst nach dem fwd aufgerufen werden?

Gruss

S.
 
Ja, natuerlich.. NAT nach dem fwd fuer den proxy. Sonst fliegen alle paeckchen zu natd und erreichen gar nicht deinen fwd.

Desshalb schreibe ich ja im kommentar:
> # dannach nat (dsl connection auf tun0):


Also theoretisch brauchste kein NAT, aber ich will nur http in den proxy jagen.
tipp mal "ipfw sh" und verursache ein bisschen traffic. In spalte 2 und 3 siehst du wieviele paeckchen/bytes in eine regel fallen. Damit kannst du es debuggen. Achte darauf das dein router rechte hat raus zu gehen (allow tcp from 192.168.0.1 to any) und (allow tcp from any to any established).

Ansonsten poste mal deine firewall (ipfw show).

Martin
 
Zurück
Oben