IT-Service GmbH 


rigel.ulm.go-itservice.de

IBM Thinkpad T40 mit Debian Squeeze

Vorbereitung

Den guten alten T40 hatte ich vor polaris als Laptop verwendet und die letzten Jahre nur mehr sporadisch. Nun kommt er als Server und Firewall wieder zum Einsatz.
Als Festplatte verwendete ich eine 32GB SSD. Beim T40 passt im Gegensatz zum X40 eine ganz normale 2,5" Platte.

Linux installieren:

Booten von der Debian Squeeze 6.0.1 Netboot CD, wobei ich das DVD Laufwerk beim Booten als temporäres Bootmedium wählte.
Der übliche Installationsdialog mit Land/Tastaturbelegung ec. Partitionierung folgt. Das Netzwerk stellte ich manuell ein, ich habe den Rechner erstmal mit der IP .2 versehen, später wird er dann als Ersatz für den alten rigel als Server und Firewall auf .1 umgestellt...
	Konfiguration:  manuell (auswahl)
	IP Adresse:     192.168.80.2
	Netmask:        255.255.255.0
	Gateway:        192.168.80.1
	DNS:            192.168.80.1
	Rechnername:    rigel
	Domäne:         ulm.go-itservice.de
Resthardwareerkennung, Partitionierung
	Festplatte:	manuell
	31,0 GB 	sda1 	/	ext3
	 1,0 GB 	swap
Änderungen schreiben, Partitionierung erfolgt. Als Zielverwendung wählte ich:
webserver
notebook
Anschliessend wird das Grundsystem installiert, was etwas dauert, da alles über DSL heruntergeladen werden muss. Zuletzt wird der neue GRUB Bootloader im MBR installiert, die CD ausgeworfen und um Neustart gebeten ...

nach dem neu booten und anmelden an der Konsole, aptitude starten, nicht installierte Pakete auswählen, am besten über "Suche":
	+ bind9
	+ catdoc (wegen xls2csv)
	+ cryptsetup
	+ debconf-utils
	+ dhcp3 server
	+ hdparm
	+ imagemagix
	+ iptables
	+ ldap-utils
	+ lynx
	+ mcrypt	
	+ mysql-client (= mysql-client-5.1 + mysql-common)
	+ mysql-server  (= mysql-server-5.1 + mysql-common)
	+ ntpdate
	+ perlmodule  (unter nicht-installiert -> perl, siehe "Allgemeines zu squeeze")
	+ php5 (incl diverser Module , siehe "Allgemeines zu squeeze")
	+ phpldapadmin
	+ phpmyadmin
	+ rsh-redone-client
	+ rsync
	+ samba
	+ slapd
	+ squid
	+ squidguard
	+ ssh
	+ sysutils	(wegen dos2unix)
Installieren, anschliessend wird einiges zur Konfiguration gefragt. Die Daten vom alten rigel Lenny habe ich in den Unterordner /OLD kopiert.
# cat /OLD/etc/passwd >> /etc/passwd
# cat /OLD/etc/shadow >> /etc/shadow
# cat /OLD/etc/groups >> /etc/groups
# vi etc/passwd
..
alle doppelten,allgemeinen User und Gruppen löschenl, dabei Vorsicht!

Serverdienste einrichten

bind konfigurieren (/etc/bind/named.conf.local, /etc/bind/named.conf.options) forwarder eintragen, local dir auf /etc/bind setzen
/etc/resolv.conf anpassen. hosts anpassen.
dhcp3 in /etc/dhcpd/dhcpd.conf einrichten
Startskripte Datei obi1 in /etc/init.d erstellen, wichtig, neues Format verwenden! dann update-rc.d obi1 start ausführen. Hierdurch wird der Link Snnobi1 korrekt in /etc/rcn.d angelegt.
Apache2 konfigurieren:
sites (nur einzelne virtual Host Abschitte) in /etc/apache2/sites-available anlegen und dann einen link aus /etc/apache2/sites-enabled auf das Konfigfile anlegen. Hier wurden beide Verzeichnisse vom alten Server kopiert
mysql Datenbanken anlegen:
Als root an der Datenbank anmelden, dann sukzessive die einzelnen Datenbanken nebst GRANTS anlegen (z.B. myulm):
> CREATE DATABASE myulm;
> GRANT ALL PRIVILEGES ON myulm.* TO USER@localhost IDENTIFIED BY 'PASSWD';
am alten Server werden die Daten exportiert und auf den neuen übertragen:
mysqldump -uUSER -pPASSWD myulm > myulm.sql
scp myulm.sql root@192.168.80.1:/tmp
am neuen einspielen:
mysql -uUSER -pPASSWD myulm < myulm.sql

Proxy squid und Zusatz squidguard installieren

Von blinkenden Werbebannern und anderen lässtigen "Ads" genervt, wollte ich diese loswerden. Meine Wahl fiel auf die Kombination squid mit squidguard, was gut funktioniert und recht leicht zu installieren ist. Schritte:
squid installieren
squidguard installieren, beide via aptitude
Die Weiterleitung Squid => squidguard einrichten oder anpassen, diese steht in der letzten Zeile der /etc/squid/squid.conf
redirect_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
Die Konfigdateien fuer SquidGuard ist hier als /etc/squid/squidGuard.conf festgelegt
In der /etc/squid/squidGuard.conf verwende ich im ersten Abschnitt das voreingestellte Thema "adv" für Werbung und ein zweites eigendefiniertes namens "obi"
Die shallalist Regeldaten holen von http://www.shallalist.de/Downloads/shallalist.tar.gz
Dieses Datei verschieben nach /var/lib/squidguard/db/. Es wird davon ausgegangen das squid unter dem User proxy läuft.
# cd /var/lib/squidguard/db/
# gunzip shallalist.tar.gz
# tar -xvf shallalist.tar
# chown -r proxy:proxy BL
# /etc/init.d/squid restart
# tail -F /var/log/squid/blocked.log
jetzt lossurfen mit rigel als Proxy. Auf den meisten Mainstreamwebseiten tauchen sofort Einträge in der blocked.log auf. Weiterer Vorteil der Werbeausblendung: Surfen ist merklich schneller und die CPU Auslastung durch den Browser oft wesentlich niedriger.

Firewall mit IP-Tables

als Gateway und Firewall verwende ich ein aus verschiedenen Quellen zusammengebautes Shellskript. Das Skript ist hier im Anhang und wird beim Booten ausgeführt

slapd, phpldapadmin, ldaptools

In den Dateien /etc/ldap/slapd.conf
suffix	"o=go-itservice, c=de"
rootdn	"cn=admin, o=go-itservice, c=de"
rootpw	***
in der /etc/ldap/ldap.conf
BASE		o=go-itservice,c=de
HOST		wega.ulm.go-itservice.de
PORT		389
SIZELIMIT	4096
Sizelimit muss wegen dem automatischen Import durch adressen2ldap (von goweb) auf einen Wert grösser als die Zeilenzahl der adressen.xls Datei gesetzt werden! in der /etc/phpldapadmin/config.php
$servers[$i]['name'] = 'wega'; 
$servers[$i]['host'] = '127.0.0.1';
$servers[$i]['base'] = 'o=go-itservice, c=de';
$servers[$i]['port'] = 389;
$servers[$i]['auth_type'] = 'config';
$servers[$i]['login_dn'] = 'cn=admin, o=go-itservice, c=de';
$servers[$i]['login_pass'] = 'PASSWD';
slapd und apache2 neu starten, voila!

ntp-server konfigurieren

in der /etc/ntp.conf folgende Zeile eintragen oder anpassen:
broadcast 192.168.80.255

Rechner als Gateway verwenden

Bis hierher wurde der Rechner mit der IP 192.168.80.13 als Testrechner betrieben, Nun soll er als Firewall/Proxy/Gateway zwischen den Router (bisher 192.168.80.1) und das Interne Netz geschaltet werden. Es wird also ein Transfernetz zwischen Router und Internem Netz aufgebaut. Hierzu wird die IP Adresse des Routers auf 192.168.70.1 geändert. Als Client dient das Notebook polaris, auf dem mit Skripten schnell IP-Adresse, Gateway und DNS umgestellt werden könen.
Die grundsätzlichen Änderungen sind hier beschrieben, nochmal der Vollständigkeit halber:
/etc/hosts
/etc/hostname
/etc/mailname
/etc/exim4/update-exim4.conf.conf
/etc/network/interfaces
Zusätzlich:
/root/fwmask	
/root/fwstart 
/etc/dhcp3/dhcpd.conf
/etc/mysql/my.cnf
/etc/squid/squid.conf
/etc/squid/squidGuard.conf
in der /etc/squid/squid.conf sind es 2 Stellen:
Die zum Zugriff erlaubten Adressen
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
und die IP-Adressen:Ports, auf denen squid lauschen soll
http_port 192.168.70.10:3128
http_port 192.168.70.10:8080
http_port 192.168.80.1:3128
http_port 192.168.80.1:8080
Achtung, wichtig in der /etc/default/dhcp3-server muss das Interfache (ethX) eintragen werden, auf dem der DHCP Server antwortet. Dies war durch meine Umbauaktionen nicht mehr richtig!

Skript fwstart

#!/bin/sh
# Firewallscript "fwstart" fuer Router mit 2.4 Kernel
# aus dem Internet zusammengestopselt von
#
# go@guenther-obermaier.de, 2002
# 

EXT_IF="eth2"
INT_IF="eth1"
MYNET=192.168.80.0/255.255.255.0
ALL=0.0.0.0/0.0.0.0

ICMP_RATE=50/s
ICMP_BURST=50
LOG_RATE=10/h
LOG_BURST=50


echo "Starting Firewall..."
echo 1 > /proc/sys/net/ipv4/ip_forward

#--------------#
# Prep Section #
#--------------#

##
## Temporarily block all traffic until new tables are finished
##

# Set strict filtering defaults to protect while chains are flushed
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Flush Rules
iptables -F
iptables -X 

# Insert temporary blocking rules
iptables -I INPUT 1 -j DROP
iptables -I FORWARD 1 -j DROP
iptables -I OUTPUT 1 -j DROP

#-------------------#
# Filtering Section #
#-------------------#

##
## General Policies for icmp packets
##

# Create new chain
iptables -N icmp-policy

# Allow error icmp messages
iptables -A icmp-policy -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A icmp-policy -p icmp --icmp-type source-quench -j ACCEPT
iptables -A icmp-policy -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A icmp-policy -p icmp --icmp-type parameter-problem -j ACCEPT

# Allow pings _from_ inside and privileged net
iptables -A icmp-policy -i $EXT_IF -p icmp --icmp-type echo-request -j ACCEPT
iptables -A icmp-policy -i $INT_IF -p icmp --icmp-type echo-request -j ACCEPT

# Allow pings _to_ anywhere
iptables -A icmp-policy -p icmp --icmp-type echo-reply -j ACCEPT

##
## General Policies for tcp packets
##
iptables -N tcp-policy

# Log then drop suspicious packets (just one example...)
# iptables -A tcp-policy -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit $LOG_RATE --limit-burst $LOG_BURST -j LOG --log-prefix "XMAS scan:" 
iptables -A tcp-policy -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG --log-prefix "XMAS scan:" 
iptables -A tcp-policy -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

# Allow local traffic on server
iptables -A INPUT -i lo -j ACCEPT

# Allow approved types of icmp, but limited in rate 
# iptables -A INPUT -m limit --limit $ICMP_RATE --limit-burst $ICMP_BURST -p icmp -j icmp-policy
iptables -A INPUT -p icmp -j icmp-policy
# iptables -A OUTPUT -p icmp -j icmp-policy
iptables -A INPUT -p icmp -j DROP

# Screen out malformed tcp packets
iptables -A INPUT -p tcp -j tcp-policy

# Forward packets from internal to external net
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -A FORWARD -i $INT_IF -j ACCEPT

# Allow new/established outgoing packets
iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -o "$EXT_IF" -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o "$INT_IF" -m state --state NEW,ESTABLISHED -j ACCEPT

# established incoming packets on external network and internal network 
iptables -A INPUT -i "$EXT_IF" -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i "$INT_IF" -m state --state ESTABLISHED -j ACCEPT
# ... forward them
iptables -A FORWARD -i "$EXT_IF" -m state --state ESTABLISHED -j ACCEPT

# Stop Traffic to/from some servers
iptables -A OUTPUT -d 62.109.129.145 	-j DROP # Adserver, nervt 
iptables -A OUTPUT -d 193.28.197.8	-j DROP # Adserver, nervt 

# Forward :81 to LAN-Cam .47:80
iptables -t nat -A PREROUTING -i "$EXT_IF" -p tcp --dport 81 -j DNAT --to 192.168.80.47:80
iptables -A FORWARD -d 192.168.80.47 -i "$EXT_IF" -p tcp --dport 80 -j ACCEPT

# Allow related ICMP packets from external network
iptables -A INPUT -i "$EXT_IF" -p icmp -m state --state RELATED -j ACCEPT
iptables -A INPUT -i "$INT_IF" -p icmp -m state --state RELATED -j ACCEPT

# Allow some traffic to firewall from extern
iptables -A INPUT -i "$EXT_IF" -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$EXT_IF" -p tcp --dport 53 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$EXT_IF" -p udp --dport 53 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$EXT_IF" -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$EXT_IF" -p udp --dport 123 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$EXT_IF" -p tcp --dport 389 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$EXT_IF" -p tcp --dport 563 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$EXT_IF" -p tcp --dport 3128 -m state --state NEW -j ACCEPT

# Allow some traffic to firewall from intern
iptables -A INPUT -i "$INT_IF" -p tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$INT_IF" -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$INT_IF" -p tcp --dport 53 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$INT_IF" -p udp --dport 53 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$INT_IF" -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$INT_IF" -p udp --dport 123 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$INT_IF" -p tcp --dport 389 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$INT_IF" -p tcp --dport 443 -m state --state NEW -j ACCEPT
iptables -A INPUT -i "$INT_IF" -p tcp --dport 3128 -m state --state NEW -j ACCEPT

# Anything else is logged at a reasonable rate then dropped
# iptables -A INPUT -i $EXT_IF -m limit --limit $LOG_RATE --limit-burst $LOG_BURST -j LOG --log-prefix "Blocked from external net:" 
# iptables -A INPUT -i $INT_IF -m limit --limit $LOG_RATE --limit-burst $LOG_BURST -j LOG --log-prefix "Blocked from internal net:" 
iptables -A INPUT -j DROP 

#--------------#
# Post Section #
#--------------#

# Mask all outgoing
iptables -t nat -A POSTROUTING -o $EXT_IF -j MASQUERADE

##
## Restore traffic
##

# Restore normal defaults now that rules are finished
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP


# Delete temporary blocking rules
iptables -D INPUT 1
iptables -D FORWARD 1
iptables -D OUTPUT 1

echo ".... ok"

Konfigurationsdatei /etc/squid/sqidGuard.conf

#
dbhome /var/lib/squidguard/db/BL
logdir /var/log/squid

dest adv {
	domainlist	adv/domains
	urllist		adv/urls
	redirect 302:http://myulm.go-itservice.com:80/images/pixel_C0C0C0.gif
	log blocked.log
}

dest obi {
	domainlist	obi/domains
	urllist		obi/urls
	redirect 302:http://myulm.go-itservice.com:80/images/pixel_C0C0C0.gif
	log blocked.log
}

acl {
	default {
		pass !adv all
	}
}