Blog

Transparenter Squid Proxy

Transparenter Squid Proxy auf Ubuntu 8.04.1 Server

Im Internet kursieren verschiedene Anleitungen, wie man einen transparenten Squid Proxy aufsetzt. Leider sind einige veraltet, beziehen sich auf den alten Squid oder sonst etwas älteres. Ich habe mir vorgenommen eine aktuelle Anleitung zu schreiben, die auf dem Ubuntu Server 8.04.1 (Hardy Heron) basiert.

Der Server braucht mindestens 2 Netzwerkkarten, bevorzugt Inten PRO-1000. Ich nehme an, das lokale Netz ist 192.168.0.0/24, der Router hat die IP 192.168.0.1 und unser Proxy bekommt die IP 192.168.0.2 und die Nameserver haben die IPs 193.101.111.20 sowie 193.101.111.10.

Zuerst ist eine Ubuntu-Installation vorzunehmen. Diese wird normal gemacht, aber am Ende wird nur noch der SSH-Server installiert.

Nach der Installation installieren wir einige Pakete:

# apt-cache search squid | grep -e "^squid " -e "^sqcwa " -e "^squid-prefetch " -e "^bridge-utils "
squid - Internet object cache (WWW proxy cache)
sqcwa - Workaround for Squid not caching some pages
squid-prefetch - Simple page-prefetch for Squid web proxy
bridge-utils - Utilities for configuring the Linux ethernet bridge
# apt-get install squid sqcwa squid-prefetch bridge-utils

In /etc/squid/squid.conf suchen wir die folgende Zeilen:

http_port 3128
#acl our_networks src 192.168.1.0/24 192.168.2.0/24
#http_access allow our_networks

und ändern es in:

http_port 3128 transparent
acl our_networks src 192.168.0.0/24
http_access allow our_networks

Danach ersetzen wir den Inhalt von /etc/network/interfaces durch:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto br0
iface br0 inet static
pre-up brctl addbr br0
pre-up brctl addif br0 eth0
pre-up brctl addif br0 eth1
pre-up ifconfig eth0 0.0.0.0
pre-up ifconfig eth1 0.0.0.0
post-down brctl delbr br0
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.1
bridge_fd 0
bridge_hello 0
bridge_stp off

Dann noch DNS in /etc/resolv.conf:

nameserver 193.101.111.20
nameserver 193.101.111.10

Vor dem Ende kommt noch die magische iptables-Regel in die /etc/rc.local:

/sbin/iptables -t nat -A PREROUTING -i br0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Sollten wir irgendwann einen Paketfilter auf iptables-Basis haben so fügen wir diese Regel dort ein.

Am Ende shutdown. Jetzt stellen wir den Proxy neben dem Router, schliessen eine Netzwerkkarte an den Router direkt und die andere an das Netzwerk. Welche wohin ist vollkommen egal.

Das Ganze ist natürlich beliebig ausbaufähig…

Einschalten, fertig ;)

Das böse ICMP

“ICMP ist Böse.” Warum eigentlich?

Frühertm, als das Internet noch aus wenigen (einigen Tausenden) Nodes bestand gab es ein großes Problem, das Ping of Death. Packete, die eine bestimmte größe hatten brachten den IP-Stack mancher Betriebssysteme zum Absturz. Dies wurde auch ausgenutzt.

Heute verrichtet ICMP verschiedene nutzliche Sachen. Es unterrichtet die beiden Seiten einer TCP-Übertragung darüber, dass eine Leitung voll ist oder eine Anwendung nicht schnell genug die Daten verarbeitet, ein Router schickt eine Nachricht, dass ein Host nicht erreichbar ist usw… also im Prinzip nichts böses.

Im Prinzip, also in der Theorie. In der Praxis kann man schon böses damit anstellen. Wenn man nur bischen kriminelle Energie hat ;)

ICMP lebt auf Layer 4 im OSI-Schichtmodell, neben UDP, TCP usw. Es hat die Protokollnummer 1. Nebenbei: TCP hat 6 und UDP 17.

Wie wir bei IANA (http://www.iana.org/assignments/icmp-parameters) nachlesen können gibt es einige Nachrichten, die versandt oder empfangen werden können:

Type Name Reference


0 Echo Reply [RFC792]
1 Unassigned [JBP]
2 Unassigned [JBP]
3 Destination Unreachable [RFC792]
4 Source Quench [RFC792]
5 Redirect [RFC792]
6 Alternate Host Address [JBP]
7 Unassigned [JBP]
8 Echo [RFC792]
9 Router Advertisement [RFC1256]
10 Router Solicitation [RFC1256]
11 Time Exceeded [RFC792]
12 Parameter Problem [RFC792]
13 Timestamp [RFC792]
14 Timestamp Reply [RFC792]
15 Information Request [RFC792]
16 Information Reply [RFC792]
17 Address Mask Request [RFC950]
18 Address Mask Reply [RFC950]
19 Reserved (for Security) [Solo]
20-29 Reserved (for Robustness Experiment) [ZSu]
30 Traceroute [RFC1393]
31 Datagram Conversion Error [RFC1475]
32 Mobile Host Redirect [David Johnson]
33 IPv6 Where-Are-You [Bill Simpson]
34 IPv6 I-Am-Here [Bill Simpson]
35 Mobile Registration Request [Bill Simpson]
36 Mobile Registration Reply [Bill Simpson]
37 Domain Name Request [RFC1788]
38 Domain Name Reply [RFC1788]
39 SKIP [Markson]
40 Photuris [RFC2521]
41 ICMP messages utilized by experimental [RFC4065]
   mobility protocols such as Seamoby
42-255 Reserved [JBP]

Sollte man also ICMP auf der Firewall komplett blocken?

Meine Antwort lautet NEIN. Auf keinen Fall. Eine gut eingerichtete Firewall antwortet wohl auf z.B. ICMP Echo. Nur weil eine, beispielweise, IPSEC Firewall nicht auf “ping” antwortet heisst nicht, dass man nicht rausfinden kann ob sie da ist.

ICMP-Typen die auf jeden fall durchgelassen werden sollten sind:

0,3,4,5,6,8,11,12,30

Dann funktioniert die Firewall richtig und es gibt keine merkwürdigen Probleme. Man kann aber durchaus komplett ICMP erlauben. Es ist nicht Böse! ;)

Viel wichtiger ist es z.B. FTP abzusichern, da es “Löcher” bohren kann oder aufzupassen, dass die Hosts nicht von Innen nach Aussen Verbindungen aufbauen, was z.B. bei geknackten Rechnern der Fall sein kann, der Tunneling über DNS.

Also, lass uns pingen…

MySQL: DB und Benutzer anlegen

Script für MySQL: Datenbank und Benutzer mit Passwort anlegen

Mehrfach braucht man für verschiedene Sachen eine getrennte MySQL-Datenbank mit eigenem Benutzer und mit Passwort. Dieses Script erleichtert das ganze.

#!/bin/sh

if [ "$1" != "" -a "$2" != "" -a "$3" != "" ]; then

mysql << __EOF__
create database $1 CHARACTER SET utf8;
quit
__EOF__

mysql << __EOF__
use mysql;
insert into user (User, Host, Password) values ('$2', 'localhost', PASSWORD('$3'));
flush privileges;
__EOF__

mysql << __EOF__
grant all on $1.* to $2@localhost;
flush privileges;
quit
__EOF__

else

echo "No parameters given, exiting..."
echo ""
echo "Usage: $0 <database> <username> <pass>"
exit 1

fi

Voraussetzung dazu ist, dass man es vom Benutzer ‘root’ aufruft und in roots Home folgende Datei existiert

.my.cnf

sowie deren Inhalt:

[mysql]
host = localhost
user = root
pass = geheimespasswort

Dann ruft man es einfach folgendermassen auf:

./mysql-add-user-with-db dbtest1 usertest1 blahblahgeheim

und schon kann man es verwenden.