• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Transparenter Proxy Firewall-Problem

froemken

Member
Hallo zusammen,

wir besitzen in der Firma seit längerem einen lauffähigen von mir eingerichteten SQUID-Proxyserver, den ich jetzt in einen transparenten Proxy umwandeln möchte. Dazu habe ich ein Testsystem aufgebaut mit SuSe 9.3 die absolute Standardinstallation vom SQUID durchgeführt "./configure --prefix=/usr/local/squid" und unsere aktuelle Konfiguration in das Testsystem eingebunden. Kleine Anpassungen (z.B. IP-Adresse) und Proxy läuft.

Umwandlung
Den berühmten Vierzeiler eingefügt:
Code:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

Für den Test hab ich http_port 3128 eingetragen (ohne IP-Adresse). squid.conf = Fertig. Squid gestartet kein Thema. Solange ich mit Hilfe von iptables diesen Port auch offen hatte, hat der Squid auch prima funktioniert, solange ich im Browser den Proxy manuel eingetragen habe.

Nun die berühmte Zeile
Code:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
eingefügt und meine damaligen Zeilen für den Port 3128 auskommentiert. Nochmal vom Proxyserver versucht eine Verbindung ins Internet zu bekommen = Klappt.

Netzwerk
Ca. 20 Clients sollen auf den Proxy zugreifen. Der Proxy hat nur eine Netzwerkkarte eth0 und befindet sich in 192.168.0.0/24. Als DNS-Server ist unser Gateway-Router eingetragen über den dann auch die Internet-Verbindung aufgebaut wird.

Authentifizierung ist ausgeschaltet, weil würd sowieso nicht klappen laut den Suchergebnissen, die ich unter google gefunden habe. Ich habe in den IPTABLES auch schon --ip-destination ausprobiert.

Ausgabe tcpdump:
Code:
11:16:10.114930 IP no43.ebsnet.rdrmshc > linuxstefan.ebsnet.ndl-aas: S 3675708063:3675708063(0) win 65535 <mss 1460,nop,nop,sackOK>
11:16:13.171339 IP no43.ebsnet.rdrmshc > linuxstefan.ebsnet.ndl-aas: S 3675708063:3675708063(0) win 65535 <mss 1460,nop,nop,sackOK>
11:16:19.186881 IP no43.ebsnet.rdrmshc > linuxstefan.ebsnet.ndl-aas: S 3675708063:3675708063(0) win 65535 <mss 1460,nop,nop,sackOK>
11:16:21.578200 arp who-has 192.168.0.214 tell no43.ebsnet
11:16:21.658101 arp who-has no43.ebsnet tell 192.168.0.214
11:16:31.230852 IP no43.ebsnet.dab-sti-c > linuxstefan.ebsnet.ndl-aas: S 2063045512:2063045512(0) win 65535 <mss 1460,nop,nop,sackOK>
11:16:34.280440 IP no43.ebsnet.dab-sti-c > linuxstefan.ebsnet.ndl-aas: S 2063045512:2063045512(0) win 65535 <mss 1460,nop,nop,sackOK>
11:16:40.295986 IP no43.ebsnet.dab-sti-c > linuxstefan.ebsnet.ndl-aas: S 2063045512:2063045512(0) win 65535 <mss 1460,nop,nop,sackOK>
11:16:52.341348 IP no43.ebsnet.imgames > linuxstefan.ebsnet.ndl-aas: S 3397786791:3397786791(0) win 65535 <mss 1460,nop,nop,sackOK>

Keine Ahnung wo der Fehler ist. Muss ich den Port 80 explizit auch noch öffnen, damit der Proxy Anfragen vom Netz überhaupt annehmen kann? Eigentlich ja nicht, weil sich da ja schon die NET-Regel drum kümert, oder?

Stefan
 
OP
froemken

froemken

Member
Ähm...hab ich doch schon geschrieben?!?!

Für den Test hab ich http_port 3128 eingetragen (ohne IP-Adresse).

In meiner damaligen squid.conf hatte ich immer:
http_port 192.168.0.251:3128
stehen.

Poste sie jetzt mal komplett:
Code:
# http_port 192.168.0.251:3128
http_port 3128
cache_mem 32 MB
cache_swap_low 90
cache_swap_high 95
maximum_object_size 4096 KB
minimum_object_size 4 KB
ipcache_size 1024
ipcache_low 90
ipcache_high 95
# Bis 2 GB ist UFS OK
cache_dir ufs /usr/local/squid/var/cache 100 16 256
ftp_user info@ebs-inkjet.de
ftp_passive on
ftp_list_width 45
request_header_max_size 3 KB
quick_abort_min 0 KB
quick_abort_max 0 KB
quick_abort_pct 100
negative_ttl 5 second
negative_dns_ttl 5 second
connect_timeout 60 seconds
half_closed_clients off
shutdown_lifetime 10 second

acl localhost src 127.0.0.1/255.255.255.255
acl all src 0.0.0.0/0.0.0.0
acl allow_els src 192.168.0.0/255.255.255.0
acl allow_shg src 192.168.1.0/255.255.255.0

http_access allow localhost
http_access allow allow_els
http_access allow allow_shg
http_access deny all

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

forwarded_for off

header_access From deny all
header_access Referer deny all
header_access Server deny all
## User-Agent macht auf einigen Seiten Fehler t.wasser
#header_access User-Agent deny all
header_access Link deny all
header_access Via deny all
header_access X-Forwarded-For deny all

Und hier noch mein FireWall-Script:
Code:
IPTABLES="/usr/sbin/iptables"
INTERFACE_INT="eth0"
LOCAL_NET="192.168.0.0/24"
LOCAL_IP="192.168.0.114"
DNS_SERVER="192.168.0.242"
INTERNET="0/0"
PORTS_HIGH="1024:65535"

$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -X
echo "Firewall Basiskonfiguration initialisiert"

$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A INPUT -i lo -j ACCEPT
echo "Lokale Prozesse freigeschaltet"

$IPTABLES -A INPUT -s $LOCAL_NET -d $LOCAL_IP -p tcp --sport $PORTS_HIGH --dport ssh -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -s $LOCAL_IP -d $LOCAL_NET -p tcp --sport ssh --dport $PORTS_HIGH -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "SSH vom LAN auf LOCALHOST freigeschaltet"

$IPTABLES -A OUTPUT -s $LOCAL_IP -d $LOCAL_NET -p tcp --sport $PORTS_HIGH --dport ssh -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -s $LOCAL_NET -d $LOCAL_IP -p tcp --sport ssh --dport $PORTS_HIGH -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "SSH auf Netzwerkrechner erlaubt"

$IPTABLES -A INPUT -s $INTERNET -d $LOCAL_IP -p tcp --sport http --dport $PORTS_HIGH -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -s $LOCAL_IP -d $INTERNET -p tcp --sport $PORTS_HIGH --dport http -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
##### HTTP vom LAN erlauben
# $IPTABLES -A INPUT -s $LOCAL_NET -d $LOCAL_IP -p tcp --sport $PORTS_HIGH --dport http -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# $IPTABLES -A OUTPUT -s $LOCAL_IP -d $LOCAL_NET -p tcp --sport http --dport $PORTS_HIGH -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "HTTP freigeschaltet"

$IPTABLES -A INPUT -p tcp --sport 20 --dport $PORTS_HIGH -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --sport $PORTS_HIGH --dport 20 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp --sport 21 --syn --dport $PORTS_HIGH -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --sport $PORTS_HIGH --dport 21 --syn -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
echo "FTP freigeschaltet"

$IPTABLES -A OUTPUT -s $LOCAL_IP -d $DNS_SERVER -p udp --sport $PORTS_HIGH --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -s $DNS_SERVER -d $LOCAL_IP -p udp --sport 53 --dport $PORTS_HIGH -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "DNS-Anfragen erlaubt"

##### Proxy-Cache
#$IPTABLES -A INPUT -s $LOCAL_NET -d $LOCAL_IP -p tcp --sport $PORTS_HIGH --dport 3128 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$IPTABLES -A OUTPUT -s $LOCAL_IP -d $LOCAL_NET -p tcp --sport 3128 --dport $PORTS_HIGH -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --sport $PORTS_HIGH --dport 80 -j DNAT --to-destination $LOCAL_IP:3128
#$IPTABLES -A FORWARD -i eth0 -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 3128 -j ACCEPT
echo "Proxy-Anfragen erlaubt"

$IPTABLES -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type redirect -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type redirect -j ACCEPT
echo "ICMP-Anfragen sind erlaubt"

$IPTABLES -A INPUT -j DROP
$IPTABLES -A FORWARD -j DROP
$IPTABLES -A OUTPUT -j DROP

Ich will das nicht mit der Suse-Firewall machen. iptables find ich einfach portabler für andere Systeme. globals anpassen = Fertig.

Stefan[/quote]
 

stka

Guru
Wäre es nicht Sinnvoll, auf der Firewall, eine Regel zu erstellen, die dem Proxy erlaubt Port 80 zu nutzen? Im Momenet leitest du alle ALLE Anfrage an den Port 80 immer auf $LOCAL_IP:3128, also auch die des Proxys.
 
OP
froemken

froemken

Member
Der Hintergedanke sind diese "blöden" Windows-Updates. Die scheinen sich nicht zu installieren, solange ich den Verkehr über den Proxy laufen lasse. Fehlermeldung bis hin zu einfach weißen Webseiten ohne Aufbau.
Klar kann ich den Proxy jetzt auch einfach an den 80er klatschen, aber ist dass die Lösung für mein Problem. Wie werden denn große Netzwerke aufgebaut? Wo verbirgt sich der Proxy?

Das mit den --to-ports habe ich geändert und das Script neu ausgeführt. Ich hab schon echt geglaubt, dass es daran lag. War dem aber leider nicht so...

Stefan
 

Frankie777

Advanced Hacker
stka hat schon Recht.
Du leitest ALLE Pakete um.

mache eine Selektion z.B. nach Ursprung
-s $LOCAL_NET
Dann werden die localhost Pakete nicht verbogen und squid kann Anfragen an Port 80 stellen.
 
OP
froemken

froemken

Member
Nur zum Verständnis...meine Einstellungen für die Firewall schauen jetzt so aus:
Code:
$IPTABLES -t nat -A PREROUTING -s $LOCAL_NET -i eth0 -p tcp --sport $PORTS_HIGH --dport 80 -j REDIRECT --to-ports 3128

Klappt noch nicht...

Stefan
 

oc2pus

Ultimate Guru
LOCAL_NET enthält doch auch den Proxy-Rechner ... also wird das so nicht gelöst :)

definiere:
SQUID-BOX=<ip-ders-squid-rechners>
und verwende in dem iptables Befehl: -s !$SQUID-BOX
 

Frankie777

Advanced Hacker
Es kann nicht an dieser Regel liegen.

iptables -A PREROUTING -t nat -i $I_INT -p TCP --dport 80 -s $LOCAL_NET -j REDIRECT --to-ports 8080 funktiniert bei mir immer.
$LOCAL_NET ist z.B. 192.168.2.0/24. Der lokale Prozess kommt aber nicht mit einer LAN IP daher.

Edit:
PS: Da Du in dem Prerouting Befehl auch nach Schnitstelle filterst hätte der Befehl von Anfang an funktionieren müssen.

Ich sehe Du machst Output Filterung, ich würde da mal nach dem Fehler suchen oder noch mal Ethereal anwerfen und schauen ob die Pakete auch wieder zu den LAN-Clients zurückgehen.
 
OP
froemken

froemken

Member
Welche OUTPUT-Table meinst du? FTP, DNS, HTTP, rein -- raus? Was sind denn so die minimum Einstellungen, die ich per IPTABLE machen muss. Ein Einzeiler wie es überall in den Manuals steht scheint es ja nicht zu sein. Hab sogar in ip_forward ne 1 gesetzt auch wenn ich glaube, dass das überhaupt keinen Sinn macht, da ich keine 2te Netzwerkkarte habe.
Laut der englischen Anleitung hier, soll noch was mit dem Kernel gemacht werden. Allerdings habe ich bisher gehofft, dass wäre schon einkompiliert. Naja...zumindest habe ich das noch nicht überprüft. Warum auch...es hieß ja, wenn keine Fehlermeldungen erscheinen ist alles OK. Ich hab keine Fehlermeldungen...allerhöhchstens am Client mit "Verbindungsfehler", "Zeitüberschreitung", "der Server antwortet nicht" blablabla.
Auch hatte ich gedacht, die Funktionalität des Transparenten Proxyies müsste speziell mit einkompiliert werden, aber nach 6-7 Posts, ist da keiner drauf eingegangen. Geh also davon aus, dass dies kein Problem darstellen sollte.

Werd Morgen weiter dran arbeiten.
Danke an alle, die mich bis hierher begleitet haben.

Stefan
 
Oben