IPCop als RAM-only Proxy

Die Firewall-Lösung „IPCop“ ist „out of the box“ eine feine Sache. Problematisch wird es immer, wenn man Addons hinzufügt. Bei mir gab es da mehrere solcher Fälle, einer davon war die Sache mit dem AdvProxy-Addon und dem RAM-only Proxy.

Was ist das AdvProxy-Addon?

Tja, eigentlich schnell erklärt: Es erweitert die Standard Proxy-Funktionen des IPCop 1.4.21: Authentifizierungen, ACLs, Bandbreiten-Limitierungen, User-Agent Filter, optional URL-Filter + Update-Accelerator und noch einiges mehr.

Was ist ein RAM-only Proxy?

Ein RAM-only Proxy läuft, wie der Name schon sagt, nur im RAM. Da der IPCop den weit verbreiteten Squid als Proxy benutzt, müssen hier bestimmte Direktiven gesetzt werden, damit aus dem normalen Festplatten-Cache ein RAM-only Cache wird. Dazu muss man wissen, dass Squid auch bei der normalen HDD-Cache Variante einiges an RAM vom System benötigt (so 10-20MB je Gigabyte Cache). Wir wollen hier aber die Festplatte außen vor lassen.

Warum sollte man den Squid im IPCop RAM-only laufen lassen?

Hier gibts mehrere Gründe:

  1. Geschwindigkeitsvorteile
  2. weniger Festplattenzugriffe (interessant bei Flashspeichern, wobei es vom IPCop auch eine Flashspeicher-Variante gibt, wo der Cache in den RAM ausgelagert wird)
  3. man will eh nur kleine Dateien zwischenspeichern
  4. man hat noch einen anderen Proxy mit großen HDD-Cache Reserven vorgelagert
  5. man hat eh genug RAM (der IPCop ist allerdings eh beschränkt dank 32bit)

So legen wir los. Als erstes solltet ihr das Addon erstmal installieren (im 2er Cop wie gesagt schon integriert). Da es hierzu und auch zu anderen Fragen (z.B. Was ist ein transparenter Proxy?) ein hervorragendes Handbuch gibt, will ich das hier gar nicht weiter ausbreiten.

Als nächstes müssen die Proxy-Einstellungen entprechend gesetzt werden. Ich hab hier einfach mal unsere Settings als Beispiel gepostet:

AdvancedProxy-Settings

Den „vorgelagerten Proxy“ sollte man löschen, falls man keinen hat. Ansonsten sind hier die wichtigsten Einstellungen „Cachegröße im Arbeitsspeicher“, was wir nutzen wollen, und „Cachegröße auf der Festplatte“, welche man auch auf „0“ stellen sollte, wenn auf der Festplatte nichts gecached werden soll. Leider wird damit das komplette Caching abgeschalten, was wir ja nicht wollen. Man sieht es auch an der Systemstatus-Übersichtsseite, wo der „Web-Proxy“ immer nur bei ~8MB RAM-Auslastung bleibt. Um dieses Verhalten abzuschalten müssen wir ein paar Änderungen an der Datei advproxy.cgi im Ordner /home/httpd/cgi-bin vornehmen. Und dafür nehmen wir den IPCop 2 als Vorbild, denn hier wurde die richtige Abfrage gleich eingebaut:

Die Datei per WinSCP und einem beliebigen Editor (ich nehm immer gern Notepad2) öffnen und nach folgendem Absatz suchen (bei mir wars Zeile 3914):

if ($proxysettings{'CACHE_SIZE'} > 0)
{
print FILE <<END
maximum_object_size $proxysettings{'MAX_SIZE'} KB
minimum_object_size $proxysettings{'MIN_SIZE'} KB
END
;
} else { print FILE "cache deny all\n\n";    }

Das ändern wir in:

if (($proxysettings{'CACHE_SIZE'} > 0) || ($proxysettings{'CACHE_MEM'} > 0))
{
print FILE <<END
maximum_object_size $proxysettings{'MAX_SIZE'} KB
minimum_object_size $proxysettings{'MIN_SIZE'} KB
END
;
} else { print FILE "cache deny all\n\n";    }

Damit verhindern wir das generelle Deaktivieren des Cachings, wenn die Cachegröße=0 gesetzt wird und können mit „Cachegröße im Arbeitsspeicher = 0“ und „Cachegröße auf der Festplatte = 0“ das Caching trotzdem noch komplett deaktivieren. Weiterhin ist noch folgendes zu tun, damit die no-Cache ACLs in der Weboberfläche noch funktionieren (falls wir IPs/Domains/URLs haben, die auch nicht im RAM gecached werden sollen):

Folgenden Absatz suchen (bei mir Zeile 3093):

if ($proxysettings{'CACHE_SIZE'} > 0)
{
print FILE "\n";
if (!-z $acl_dst_nocache_dom) {
print FILE "acl no_cache_domains dstdomain \"$acl_dst_nocache_dom\"\n";
print FILE "cache deny no_cache_domains\n";
}
if (!-z $acl_dst_nocache_net) {
print FILE "acl no_cache_ipaddr dst \"$acl_dst_nocache_net\"\n";
print FILE "cache deny no_cache_ipaddr\n";
}
if (!-z $acl_dst_nocache_url) {
print FILE "acl no_cache_hosts url_regex -i \"$acl_dst_nocache_url\"\n";
print FILE "cache deny no_cache_hosts\n";
}
}

und ändern in:

if (($proxysettings{'CACHE_SIZE'} > 0) || ($proxysettings{'CACHE_MEM'} > 0))
{
print FILE "\n";
if (!-z $acl_dst_nocache_dom) {
print FILE "acl no_cache_domains dstdomain \"$acl_dst_nocache_dom\"\n";
print FILE "cache deny no_cache_domains\n";
}
if (!-z $acl_dst_nocache_net) {
print FILE "acl no_cache_ipaddr dst \"$acl_dst_nocache_net\"\n";
print FILE "cache deny no_cache_ipaddr\n";
}
if (!-z $acl_dst_nocache_url) {
print FILE "acl no_cache_hosts url_regex -i \"$acl_dst_nocache_url\"\n";
print FILE "cache deny no_cache_hosts\n";
}
}

Um die maximale RAM-Größe des Squids zu erhöhen (es wird sonst auf die Hälfte des Systems begrenzt), noch folgendes ändern:

die Zeile

$cachemem = int $1 / 2048;

zu

$cachemem = int $1 / 1536;

Wer mutig ist, kann natürlich auch 1024 als Teiler nehmen, dann sollte man aber vorsichtig mit den RAM-Angaben sein. Weist man dem Squid den vollen RAM zu, wird es arge Probleme geben. Dies sollte man auf jeden Fall vermeiden.

Als kleinen Tweak kann man jetzt noch die maximale Größe der Objekte, die im RAM gespeichert werden sollen, vorgeben, in dem wir die /var/ipcop/proxy/advanced/acls/include.acl bearbeiten und folgendes eintragen:

maximum_object_size_in_memory 12 KB

Der Standardwert ist übrigens 8KB.

Wichtig zu wissen ist noch, dass Änderungen an der Datei (advproxy.cgi) nach Updates verloren gehen!

Nach einem „Speichern und Neustart“ in der Weboberfläche sollte Squid nun als RAM-only Proxy fungieren.

Wie stelle ich den IPCop 2.xx als RAM-only Proxy ein?

Hier wurden obige Änderungen schon eingebaut, so dass über die Oberfläche die Werte „Cachegröße auf der Festplatte = 0“ und „Cachegröße im Arbeitsspeicher > 0“ gesetzt werden kann und somit nur noch im RAM gecached wird.

2 Gedanken zu „IPCop als RAM-only Proxy“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.