# Squid Proxy Priorisierung?



## nuhll (25. Juni 2014)

Hallo,
ich setze derzeit einen Squad Lan Proxy auf.

Gibt es eine Möglichkeit z.B Windows Updates/Spiele Patches usw. mit einer niedrigen Priorität laufen zu lassen so das Surfen normal möglich ist? Momentan ist es so das wenn Windows Updates gecached werden das Internet ne weile nicht oder schlecht geht... wenn ja, wie?

Wenn eine Priorisierung nicht geht, kann man die Bandbreite wenigstens beschränken?

Vielen dank für die Hilfe!


----------



## Jimini (25. Juni 2014)

Da der Proxy afaik nur die einzelnen Anfragen, nicht aber den Traffic an sich beeinflusst, wird Squid hier wohl nicht weiterhelfen. Was du brauchst, ist eine QOS-Lösung wie die hier. An Software werden glaube ich nur iptables und iproute/iproute2 benötigt.
Grundsätzlich ist es extrem schwierig, *eingehenden* Traffic zu priorisieren, da der ja schon am Router anklopft. Du kannst aber den *ausgehenden* Traffic steuern, so dass den Clients oder bestimmten Ports mehr Anteile des Upstreams zugeteilt werden.

Erläuterung: das Skript teilt ausgehenden Traffic in zwei Kategorien ein - einmal Traffic, welcher möglichst lagfrei rausgehen soll (SSH-Verbindungen, IRC-Verbindungen, Traffic der Clients) und Traffic, welcher einfach nur möglichst viel Bandbreite bekommen soll, aber nicht so latenzkritisch ist, hier alles, was von /zu der Adresse 10.0.0.1 geht. Letztendlich musst du also nur die Kriterien anpassen - Knackpunkt hierbei ist, Kriterien zu finden, mit welchen du die dicken Downloads von normalem "Surftraffic" unterscheiden kannst. Eine Möglichkeit wäre, das über Ziel-IP-Adressen zu machen, was aber natürlich etwas aufwändig ist.

MfG Jimini


----------



## nuhll (25. Juni 2014)

Kann man denn bei Squid keine Max Durchsatz angeben? Pro Domain z.B. es muss doch igendeine art Begrenzung geben!? Hab halt kein Bock das ich beim Zocken mit einmal nen 9012830923 ping hab, weißte.


----------



## Jimini (25. Juni 2014)

Schau dir mal folgende Seite zu delay pools mit Squid an, evtl. ist das das, was du suchst: Features/DelayPools - Squid Web Proxy Wiki

MfG Jimini


----------



## nuhll (25. Juni 2014)

Genau das ist es. Jetzt muss ich nur noch ne verständliche Anleitung mit Beispielen finden..


----------



## nuhll (25. Juni 2014)

Hast du denn ne Ahnung wie ich es schaffe einen DNS Server auf Debian zu installieren welcher NUR bestimmte Domains auf meinen lokalen Proxy leitet? Ich hab Bind probiert und bin an der unglaublich schwierigen Konfig gescheitert... bräuchte da was ganz einfaches für vllt 5 Domains...


----------



## Jimini (26. Juni 2014)

Meinst du, du möchtest Anfragen an bestimmte Domains über den Proxy laufen lassen und andere sollen ohne Proxy rausgehen? Das würde ich über iptables machen:

```
iptables -t nat -A PREROUTING -d www.beispiel.de -p tcp --dport 80 -j REDIRECT --to-ports 3128
```
Ich habe es nicht getestet, probiere die Regel mal aus. Die Regel deckt allerdings nur HTTP-Traffic ab, sobald SSL-Verbindungen genutzt werden, gehen die an der Regel vorbei. Aber Squid und HTTPS ist ohnehin nochmal ein eigenes Kapitel.

Es dürfte auch möglich sein, nur bestimmte Domains durch Squid zu erfassen, indem man eine entsprechende ACL anlegt. Aber ich muss gestehen, dass ich die Squid-Config immer recht kompliziert fand und daher alles, was möglich ist, über iptables mache.

An Bind würde ich mich mit dem  Problem nicht setzen, Bind ist in der Tat recht nervig zu konfigurieren.

MfG Jimini


----------



## nuhll (26. Juni 2014)

Nein. Es soll alles über den Proxy laufen, aber bestimmte Programme wie z.B: League of legends ignorieren gerne mal die Proxy Einstellungen... daher muss man die Domain der Updates auf den Lokalen Server umleiten damit das gecached wird, momentan mache ich das per Hosts, aber das ist nicht schön weil es nicht funktioniert wenn Besuch da ist...


----------



## Jimini (26. Juni 2014)

Wie leitest du den Traffic denn aktuell zum Proxy hin? Die meisten Updater laufen ja auf sehr speziellen Ports. Wenn der Proxy dann aber nur auf Port80-Traffic reagiert, ist es ja klar, dass die Updater ihre Daten am Proxy vorbei senden und empfangen.

MfG Jimini


----------



## nuhll (26. Juni 2014)

Nein, das ist quatsch. Wenn du einen Proxy einstellst dann kannst du per Proxy jeden port ansprechen.

Zum Beispiel: Mein proxy läuft auf Port 8080, trotzdem kann ich ja im Internet surfen (Port 80) .

Wenn man im Internet Explorer den Proxy einstellt dann geht schon fast alles über Proxy, aber natürlich nicht Domains wo die IP auf <korrekte IP zum Patchen>, dann gehts zwar über Proxy, wird aber nicht gecached. Daher muss ich die Domain umleiten auf den Proxy.

Ich hab das momentan so:

LANCache: 0.4 Is up! | ChurchNerd.net

SquidFaq/WindowsUpdate - Squid Web Proxy Wiki


----------



## nuhll (26. Juni 2014)

Nein, das ist quatsch. Wenn du einen Proxy einstellst dann kannst du per Proxy jeden port ansprechen.

Zum Beispiel: Mein Proxy läuft auf Port 8080, trotzdem kann ich ja im Internet surfen (Port 80) .

Wenn man im Internet Explorer den Proxy einstellt dann geht schon fast alles über Proxy, aber natürlich nicht Domains wo die IP auf <korrekte IP zum Patchen>, dann gehts zwar über Proxy, wird aber nicht gecached. Daher muss ich die Domain umleiten auf den Cache von Nginx.

Ich hab das momentan so:

LANCache: 0.4 Is up! | ChurchNerd.net

SquidFaq/WindowsUpdate - Squid Web Proxy Wiki

Problem ist nur das http://churchnerd.net/2013/11/lancache-dns-forwarder-setup/ mir nicht hilft da ich nicht noch ein Rechner Extra wegen ein paar Umleitungen hinstellen will...

Greifen denn die IP Tables bei Anfragen über Squid?

Hinzu kommen soll noch:
http://lkrms.org/caching-ios-updates-on-a-squid-proxy-server/
und AV.

Ist erstmal ne SChweine arbeit, aber wenns einmal läuft, geile Location um spontane Lan Partys zu organisieren.


----------



## Jimini (26. Juni 2014)

nuhll schrieb:


> Nein, das ist quatsch. Wenn du einen Proxy einstellst dann kannst du per Proxy jeden port ansprechen


Ja okay, ich ging jetzt von einem transparenten Proxy aus - wenn du den Proxy im Client festlegst, kannst du natürlich sonstwas einstellen. Aber dennoch reagiert der Proxy meines Wissens nicht auf jeglichen Traffic, den beispielsweise Firefox anfordert - man kann in der Squid-Config ja eine ganze Reihe von Ports / Protokollen festlegen, welche behandelt werden sollen.


> Zum Beispiel: Mein Proxy läuft auf Port 8080, trotzdem kann ich ja im Internet surfen (Port 80) .


Das sind ja zwei unterschiedliche Paar Schuhe, hierbei kommt es ja nur auf die Adressierung an. Oder verstehe ich dich falsch?


> Ich hab das momentan so:
> LANCache: 0.4 Is up! | ChurchNerd.net
> SquidFaq/WindowsUpdate - Squid Web Proxy Wiki
> Problem ist nur das LANCache: DNS Forwarder Setup | ChurchNerd.net mir nicht hilft da ich nicht noch ein Rechner Extra wegen ein paar Umleitungen hinstellen will...


Kannst du evtl. kurz skizzieren, wie dein Setup aussieht? Ich möchte ungern mehrere Howtos durchlesen deswegen 


> Greifen denn die IP Tables bei Anfragen über Squid?


Naja, die iptables greifen den Traffic ab, noch bevor er Squid erreicht. Du musst also erst den Traffic an Squid leiten, welcher vom Proxy manipuliert werden soll.


> Ist erstmal ne SChweine arbeit, aber wenns einmal läuft, geile Location um spontane Lan Partys zu organisieren.


Ich würde, wenn es irgendwie möglich ist, den Proxy transparent laufen lassen. Dann kommt niemand ohne größeren Aufwand am Proxy vorbei und du sparst dir die Konfiguration der Clients.

MfG Jimini


----------



## nuhll (27. Juni 2014)

Ziemlich einfach. 

Ich möchte bei allen Rechnern/iPhones die DNS von meinem Server eintragen.

Dieser DNS Server soll für einige Domains (wegen Caching) die IPs auf den Server umleiten.

Dort empfängt sie dann ein NGINX Reverse Proxy der eingestellt ist wie gesagt einige Patches und Updates zu Cachen.

Zusätzlich ist auf dem Server ein Squid Proxy, welcher Internetseiten sowie Windows Updates Cached. (wird manuell eingestellt)

Es geht auch so wie jetzt, das ich einfach die Hosts datei manipulier, aber wäre kewler wenns automatisch geht ...

Seh ich das richtig wenn ich einen DNS Server laufen habe und ein Client die IP von ner Domain haben will, die Iptables nicht greifen?

Wie realisiere ich einen transparenten Proxy, dafür brauch ich doch auch andere Hardware bzw. Router? Davon abgesehen geht das auch mit Squid?

Beste Möglichkeit wahrscheinlich den Rechner direkt als Zugangspunkt benutzen, dh 2 Netzwerkkarten usw...?! Dann wäre auch das bzgl. DNS gelöst.


----------



## Jimini (27. Juni 2014)

Damit die iptables-Regeln greifen, muss der entsprechende Traffic über das System laufen, auf welchem die Regeln aktiv sind - idealerweise fungiert der Rechner also als Gateway.
Mit DNS, Caching etc. haben die iptables selber erstmal nichts zu tun, sie sorgen nur dafür, dass Traffic zugelassen, verworfen oder umgeleitet wird.

Squid eignet sich hervorragend für einen transparenten Proxy, ein solches Setup (Squid arbeitet darüber hinaus noch als Adblocker) habe ich bei mir seit Jahren auf einem gewöhnlichen Rechner (welcher gleichzeitig als Router und Firewall fungiert) laufen.

Es bleibt dann aber immer noch das Problem, dass die Updates beim allerersten Download die Leitung dichtmachen, oder?

MfG Jimini


----------



## nuhll (28. Juni 2014)

Wenn das Features/DelayPools - Squid Web Proxy Wiki funktioniert, nicht.

Eine Frage. Wenn ich einen Transparenten Proxy laufen lasse, wird ja jeglicher Traffic, per IPtables z.B.,  auf den Squid (8080) geleitet. Kann man davor ne Regel "schalten" das er Anfragen aus dem Netzwerk auf Domain XYZ NICHT auf 8080 sondern auf 80 leitet, wenn ja wie sieht so eine Regel aus?


----------



## Jimini (29. Juni 2014)

nuhll schrieb:


> Wenn ich einen Transparenten Proxy laufen lasse, wird ja jeglicher Traffic, per IPtables z.B.,  auf den Squid (8080) geleitet. Kann man davor ne Regel "schalten" das er Anfragen aus dem Netzwerk auf Domain XYZ NICHT auf 8080 sondern auf 80 leitet, wenn ja wie sieht so eine Regel aus?


 Die folgende Regel leitet alle Anfragen, welche aus dem LAN nach außen auf Port 80 gehen würden (und auf $lan zuerst auf dem Router landen), auf Port 80 des Routers (hier 10.0.0.1) um:

```
iptables -t nat -A PREROUTING -i $lan -p tcp --dport 80 -j REDIRECT --to-ports 10.0.0.1:80
```
Zudem muss natürlich erlaubt sein, dass Port 80 angesprochen werden darf:

```
iptables -A INPUT -i $lan -p tcp -d 10.0.0.1 --dport 80 -j ACCEPT
```
Das gleiche kannst du dann auch nochmal für Port 443 (HTTPS) machen, allerdings wird es da dann wahrscheinlich etwas schwieriger, mit Squid zu cachen bzw. den Traffic zu manipulieren.

MfG Jimini


----------



## nuhll (29. Juni 2014)

Ne, 80 reicht mir. Wollens net übertreiben, wenn man SSL Cachen will ist das im End effekt ne Man in the Middle attack, kann man machen, aber nur mit großen aufwand und dabei hebelst du die SSL Sicherheit aus...

Nur wie leite ich nun bestimmte Domains auf einen anderen Port?


----------



## Jimini (29. Juni 2014)

Das Problem ist dann aber, dass Update-Programme, welche über HTTPS Daten herunterladen, dein komplettes Konzept aushebeln. 
Wenn du nur den Traffic, welcher an eine bestimmte Zieladresse geht, auf den lokalen Port 80 umleiten willst, fügst du bei der oberen Regel noch ein "-d 1.2.3.4" oder "-d www.beispiel.de" (ich glaube, iptables kann das auflösen) ein.

MfG Jimini


----------



## nuhll (9. Juli 2014)

Okay, alles soweit da und funktioniert. Also jedenfalls Transparent Proxy, Internet und sogar per Wlan (bin schon etwas stolz) .

Aber es war der Horror im nachhinein auf Debian eine Netzwerkkarte zu installieren. K.a. wie, aber es geht.

erstes dickes Problem mit IPtables.



> #!/bin/sh
> 
> # squid proxy's IP address (which is attached to eth0)
> SQUID_SERVER=`ifconfig eth0 | sed -ne 's/.*inet addr:\([^ ]*\).*/\1/p'`
> ...




Routing, dns und alles drum und dran funktioniert. NUR möchte ich jetzt zum cachen einzelne Domains auf einen anderen Port leiten ( nginx - 80) statt 3128 (squid proxy).

Einfache Idee? Habe wie du siehst schon was probiert, geht aber irgendwie nicht. Ich weiß auch nicht die reihenfolge. Ursprünglich ging der Nginx Proxy (als ich einfach nur per DNS drauf verwies. Seit dem Routing über Debian läufts allerdings GARNICHT mehr - egal was ich mache. *werde ich eventuell so lassen, es scheint als wenn auch squid alleine Steam etc cached...

Ich wunder mich echt wieso man über Debian Router so wenig (aktuelles) findet... unglaublich.

edit:
weiter scheint kein FTP Upload sowie bei Speedtests funktioniert der Upload auch nicht.. was ist da los!? Beim FTP Upload fängts gut an mit 190kb/s+ (von 200) geht dann auf 70... 12... 0 dann bricht ab....

edit2: 
verstehe ich http://wiki.ubuntuusers.de/Skripte/Traffic-Shaping richtig, das man zb downloads auch beschneidet wenn man die mehr Leistung gar nicht bräuchte?


----------



## Jimini (10. Juli 2014)

nuhll schrieb:


> Okay, alles soweit da und funktioniert. Also jedenfalls Transparent Proxy, Internet und sogar per Wlan (bin schon etwas stolz) .


Gratuliere! 
Ich weiß noch, was für ein erhebendes Gefühl  es war, als mein erster Selbstbau-Router hochfuhr und Tage später das  von mir geschriebene iptables-Skript endlich die Pakete routete.


> Aber es war der Horror im nachhinein auf Debian eine Netzwerkkarte zu installieren. K.a. wie, aber es geht.


Eigentlich muss man nur /etc/network/interfaces  anpassen, was (theoretisch) aber kein Problem sein sollte -  vorausgesetzt, die Karte wird unterstützt. Sofern man aber nichts  exotisches verwendet, kommt jede gängige Linux-Distribution mit der  Karte sofort klar.


> erstes dickes Problem mit IPtables.


Ich würde zunächst nur eine  minimale iptables-Konfiguration fahren und diese dann Schritt für  Schritt erweitern. Die Fehlersuche gestaltet sich sonst als extrem  aufwändig. Nimm also am besten nochmal die Umleitungen raus und suche  den Grund, wieso keine Uploads funktionieren.
Ich habe für die Fehlersuche folgenden Block ganz am Ende meines Skripts, den ich bei Bedarf entkommentiere:

```
#iptables -A INPUT -j LOG --log-prefix "DROPPED_INPUT: " --log-level=5
#iptables -A OUTPUT -j LOG --log-prefix "DROPPED_OUTPUT: " --log-level=5
#iptables -A FORWARD -j LOG --log-prefix "DROPPED_FORWARD: " --log-level=5
```
Da  der Block am Ende liegt, erfassen diese Regeln alle Pakete, welche  bisher nicht auf eine Regel passten. Deswegen liegt sicherheitshalber  noch ein 

```
iptables -A INPUT -j REJECT
iptables -A OUTPUT -j REJECT
iptables -A FORWARD -j REJECT
```
dahinter.  Aus irgendeinem Grund werden nicht erfasste Pakete nämlich bei mir  scheinbar weiter verarbeitet, trotz entsprechender Policies.
Immer  wenn ich größere Veränderungen in das Skript einarbeite, läuft nebenbei  eine Shell mit tail -f /var/log/messages, so dass ich mögliche Fehler  sofort sehen kann.


> Routing, dns und alles drum und dran funktioniert. NUR möchte ich jetzt zum cachen einzelne Domains auf einen anderen Port leiten ( nginx - 80) statt 3128 (squid proxy).
> Einfache Idee? Habe wie du siehst schon was probiert, geht aber  irgendwie nicht. Ich weiß auch nicht die reihenfolge. Ursprünglich ging  der Nginx Proxy (als ich einfach nur per DNS drauf verwies. Seit dem  Routing über Debian läufts allerdings GARNICHT mehr - egal was ich  mache. *werde ich eventuell so lassen, es scheint als wenn auch squid  alleine Steam etc cached...


Dafür musst du eigentlich nur zusätzliche Umleitungen einbauen, wie du es schon für Port 3128 gemacht hast.
Was die Reihenfolge angeht, so ist der Aufbau recht simpel:
- Definition von Variablen 
- Schreiben von Einstellungen (wie etwa _echo 1 > /proc/sys/net/ipv4/ip_forward_)
- Löschen alter Regeln
- Definieren von Policies
- Masquerading zulassen
- Pakete, welche zu einer aufgebauten Verbindung gehören, zulassen,
- Ausnahmen definieren (sprich: was soll erlaubt sein etc.)
Schau dir dazu nochmal mein Skript in meinem ersten Posting dieses Threads an.


> Ich wunder mich echt wieso man über Debian Router so wenig (aktuelles) findet... unglaublich.


Also eigentlich findet man dazu recht viel - es ist ziemlich egal, ob ein Howto von 2006 oder von 2012 ist, da die wesentliche Config sich in den letzten Jahren nicht geändert hat. Zur Not kannst du aber auch in die Wikis von Ubuntu und Gentoo schauen.


> edit:
> weiter scheint kein FTP Upload sowie bei Speedtests funktioniert der Upload auch nicht.. was ist da los!? Beim FTP Upload fängts gut an mit 190kb/s+ (von 200) geht dann auf 70... 12... 0 dann bricht ab....


Bzgl. Upload:
Was *genau* funktioniert nicht? Jeglicher Upload auf Port 20, 21 und 80, egal von welchem Client?


> edit2:
> verstehe ich Traffic-Shaping richtig, das man zb downloads auch beschneidet wenn man die mehr Leistung gar nicht bräuchte?


Downloads werden hier nicht beschnitten - es wird nur dem Traffic auf Port 80 eine höhere Priorität eingeräumt, wenn ein ausgehender FTP-Upload die Leitung dichtmacht. Eingehenden Traffic zu shapen ist alles andere als trivial und meines Wissens nur mit einigem Aufwand machbar (siehe ifb | The Linux Foundation oder Traffic shaping - Gentoo Wiki).
Entscheidend bei den Shaping-Regeln ist der "ceil"-Wert, welcher einer bestimmten Art von Traffic zugewiesen wird. Diesen Wert legt man üblicherweise auf den verfügbaren Upstream, somit bekommt der Traffic immer so viel Bandbreite wie möglich.

MfG Jimini


----------



## nuhll (10. Juli 2014)

Ich kann aus eigener Erfahrung nur sagen das e snicht egal ist von wann ein Tutorial ist. Immer wieder falsche oder nicht mehr verwendete Befehle, sehr nervig.

Leider ging es nicht per Interfaces (cant get eth1 up) blabla. Egal, geht jetzt.

"Was genau funktioniert nicht? Jeglicher Upload auf Port 20, 21 und 80, egal von welchem Client?"

Ports sind zb. ja per FTP unterschiedlich. Bei Speedtest.net wird wahrscheinlich 80 benutzt, Client ist egal. 



> [10:32:19] [L] 257 "/ftp" is the current directory
> [10:32:19] [L] PASV
> [10:32:20] [L] 227 Entering Passive Mode (46,4,81,38,235,19).
> [10:32:20] [L] Datenkanal-IP öffnen: 46.4.81.38 PORT: 60179
> ...


Irgendwann kommt dann der Abbruch weil zu lange keine Daten übertragen wurden. Lustige is per Iphone hab ich um die 50kbs upload in dem speedtest (wahrscheinlich anderes Protokoll). 2. Rechner läd den speedtest mit 0,04kb/s...

Per Alt.Binzs kann man sich auch nicht mehr verbinden...

Was ist mit den Iptables? Wird da irgendwas gefiltert etc? Ich brauch ja keine Firewall, er soll den Traffic ein fach direkt weitergeben.


----------



## Jimini (10. Juli 2014)

nuhll schrieb:


> Ports sind zb. ja per FTP unterschiedlich. Bei Speedtest.net wird wahrscheinlich 80 benutzt, Client ist egal.


Kein RFC-konformer FTP-Server wird irgendwas mit Port 80 machen. Um die Fehlerursache herauszufinden, müsstest du schauen, von welchem Traffic wir hier sprechen - welche Ports sind involviert, ist es der Localhost oder ein Client? Hilfreich hierbei sind die von mir erwähnten Logging-Regeln. _tcpdump_ kann ebenfalls helfen.


> Was ist mit den Iptables? Wird da irgendwas gefiltert etc? Ich brauch ja keine Firewall, er soll den Traffic ein fach direkt weitergeben.


Eigentlich sollten die nichts droppen oder rejecten. Ich würde aber zur Sicherheit noch entsprechende Policies oben ins Skript packen:

```
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
```
Am besten lässt du während eines Verbindungsaufbaus mal tcpdump laufen und guckst, ob da überhaupt was an- und zurückkommt.

MfG Jimini


----------

