Günther Obermaiers Webseite



rigel.ulm.go-itservice.de

Via Board mit Debian 5.0 Lenny
Eins vorneweg: Diese Anleitung ist nicht wirklich exakt, da die eigentliche Installation als Kopie eines alten Servers, Umbau in andere Hardware und anschliessendem Update auf Lenny erfolgte. Auch habe ich den Rechner ursprünglich im 192.168.80.0 Netz betrieben und in dann erst als Gateway zwischen 192.168.70.0 und 192.168.80.0 konfiguriert. Mit etwas Linurroutine sollt es aber zu schaffen sein.

Hardware:

  • Via Board
  • HD 100 GB (2,5 ") als 1.Master
  • zur Installation: DVD ueber USB
Bootreihenfolge im BIOS: CDROM - HD0
Netzwerk erstmal ausstecken (wegen DHCP)

Linux installieren:

Mit Debian NetBoot DVD
	Language:	German<enter>
	Land:		Deutschland
	Tastatur:	deutsch<
dann startet Hardwareerkennung und die DVD wird durchsucht... (dauert ca 1 Minute) Debian installer wird geladen, Hardwareerkennung (Netzwerk), ich habe den Rechner erstmal mit der IP .13 versehen, später dann als Firewall und Gateway auf .1 umgestellt...
	Konfiguration:	manuell (auswahl)
	IP Adresse:	192.168.80.13
	Netmask:	255.255.255.0
	Gateway:	192.168.80.1
	DNS:		192.168.80.10
	Rechnername	rigel
	Domäne:	ulm.go-itservice.de
Resthardwareerkennung
	Festplatte:	manuell
	(Cursor auf Partition,  ...)
			Bootflag setzen, Grössen auswählen, Mountpoint /
	10,0 GB 	hda1 	ext2
	1,0 GB 		swap
änderungen schreiben, Partitionierung erfolgt. Anschliessend wird das Grundsystem installiert (dauert ca 10 Minuten auf der alten Miniplatte) und der Bootloader:
	Bootloader	MBR 
Die installation wird beendet, DVD ausgeworfen und um Neustart gebeten:
	Neustart 	<weiter>
nach erfolgtem Neustart
	Konfiguration	
	Uhrzeit:	GMT
	Zeitzone:	Berlin
	Rootpasswort:	****	(und Bestätigung)
	User:		Guenther Obermaier
	Account:	go
	Passwort:	****	(und Bestätigung)
	apt Zugriff:	cdrom	(vorher DVD 1 einlegen)
die Durchsuchung dauert ...
aptitude starten:
# aptitude
nicht installierte Pakete auswählen, am besten über "Suche":
	+ apache2-mpm-prefork 
	+ bind9
	+ catdoc (wegen xls2csv)
	+ cryptsetup
	+ debconf-utils
	+ dhcp3 server
	+ hdparm
	+ libapache2-mod-php4
	+ imagemagix
	+ iptables
	+ ldap-utils
	+ lynx
	+ mcrypt	
	+ mysql-client (= mysql-client-5.0 + mysql-common)
	+ mysql-server  (= mysql-server-5.0 + mysql-common)
	+ ntpdate
	+ ntp-server
	+ perlmodule	(unter nicht-installiert -> perl, siehe Allgemein zu "Lenny")
	+ php5		(incl diverser Module siehe Allgemein zu "Lenny")
	+ phpldapadmin
	+ phpmyadmin
	+ rsh-redone-client
	+ rsync
	+ samba
	+ slapd
	+ squid
	+ squidguard
	+ ssh
	+ sysutils	(wegen dos2unix)
	+ usbmount
Pakete ausschliessen ist bei rigel wegen der grossen Systempartition nicht nötig.
Installieren, anschliessend wird einiges zur Konfiguration gefragt:
	PHPldaproot:	o=go-itservice,c=de
	PHPldapadm:	cn=admin,o=go-itservice,c=de	
	PHPldapstore:	config
	PHPldappaswd:
folgende User werden eingerichtet:
	User go   (UID 801,GID 200)  /home/go
	User uw   (UID 899,GID 200)  /home/uw
	User gast (UID 898,GID 200)  /home/common
User einrichten und /home/name übergeben:
# chown -R username:obi /home/username
# chmod 700 /home/username
# chown -R gast:obi /home/common
# chmod 770 /home/common

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. security.debian.org via base-config zu apt Quellen sgrX1 hinzufügen
dhcp3 in /etc/dhcpd/dhcpd.conf einrichten
Startskripte Datei obi1 & obi2 in /etc/init.d erstellen, die mounten Netzlaufwerk ec Apache2konfigurieren:
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.
goweb installieren: Dateien nach /home/go/httpd spielen (sollte von altem Rechner her noch tun) im data/tools Ordner bei jeder installierten Seite das Skript
>./bootstrap -U go -P passwd site 
aufrufen, dann die vorher mit table2csv exportierten Daten wieder mit ./csv2table all site einspielen. Das Bootstrap Skript erzeugt die DB und sorgt für den grant.

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"
Regeldaten nach /var/lib/squidguard/db/ entpacken. Diese sind kein Bestandteil von squidguard und müssen extra heruntergeladen werden.
Rechte anpassen

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
#
# OBI, 2002
# 
EXT_IF="eth3"
INT_IF="eth4"
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 -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
iptables -A INPUT -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 

# 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 80 -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 3128 -m state --state NEW -j ACCEPT

# Allow some traffic to firewall from intern
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 443 -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 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://192.168.80.1:80/images/pixel_C0C0C0.gif
	log blocked.log
}

dest obi {
	domainlist	obi/domains
	urllist		obi/urls
	redirect 302:http://192.168.80.1:80/images/pixel_C0C0C0.gif
	log blocked.log
}

acl {
	default {
		pass !adv all
	}
}