WWW-Server

Beim Webserver gibt es sehr viel Optimierungspotential.
Wir werden hier erst mal apache mit einer übersichtlichen und einfach zu erweiternden Konfiguration erstellen und danach suExec mit FastCGI einsetzten um die Sicherheit auch bei mehreren Benutzern auf dem System (sog. „ISP Hosting Setup“) zu gewährleisten.
Damit dann die User ihre Daten auch hochladen können, wird ein FTP-Server (proftpd) installiert.

Danach werden wir noch einen MySQL-Datenbankserver erstellen.
Continue reading WWW-Server

Mailserver

Mailserver gehören im allgemein zu den lästigsten Pflichten eines sysadmins – Man ist einfach froh, wenn er läuft und man möglichst nichts daran herum schrauben muss.

Wie auch immer, wir werden hier einen Hosting-Tauglichen Mailserver mit postfix, dovecot, mysql, amavisd-new, clamav und spamassassin auf der Basis von CentOS/RHEL aufsetzen.

Als Sahnehäubchen werden wir zuletzt noch mailgraph installieren um eine Grafische Auswertung über die versendeten Mails zu bekommen.
Continue reading Mailserver

Einen OpenWRT router installieren

Seit einigen Jahren, genauer gesagt seit Linksys den legendären WRT54GL-Router herausgebracht hat, ist es möglich auf immer mehr billigen WLAN-Routern „OpenWRT“, als Linux zu installieren. – Diese Mini-Linux Distribution reicht in den meisten Anwendungsfällen um das PC-/Server basierte Gateway zu ersetzen.

Wir setzen hier eine default Konfiguration mit dem, immer noch populärsten Linksys WRT54GL auf.

Vergleich gegenüber eines Server-Gateways

Vorteile

  • Leise
  • Weniger Stromverbrauch
  • Platzsparender

Nachteile

  • Stark eingeschränkter Speicherplatz und RAM
  • Weniger flexibel

Voraussetzungen

  • PC
  • Linksys WRT54GL-Router

Hinweise zur verwendeten OpenWRT-Version

Leider ändert das OpenWRT-Projekt bei fast jedem neuen release die Konfigurationsmethoden wieder radikal; d.H., was in Version 7.09 galt, gilt nicht mehr für Version 8.09, usw.

Hinweis
Dieses Tutorial bezieht sich deshalb ausdrücklich auf die Version 8.09!
Achtung
Die neueren Kamikaze-Version (8.09) scheint ein Rückschritt zur Vorherigen Version (7.09) zu sein: Nebst der komplizierteren Konfiguration (z.B. die SUSE-Typische Konfiguration: „/etc/hosts“ is autogenerated, use „/etc/hosts.local“ instead…) ist OpenWRTso aufgeblasen, dass viele Pakete, wie z.B. OpenVPN (ohne Hacks) keinen Platz mehr finden! – Ich würde deshalb einigen Leuten (die, die keine Lust am lange rumbasteln und rumgoogeln haben) empfehlen die Version: 7.09 zu installieren!

Ich beschreibe hier die Version 8.09, schlicht aus dem Grund weil ich schon zu viel Zeit mit Basteln investiert hatte und nicht nochmals von vorne mit einem reflash von 7.09 beginnen wollte. 😉

You have been warned…

Installation von OpenWRT

Zuerst schliessen wir den Router über einen der Ethernet-Ports direkt am PC an, dieser sollte auf DHCP eingestellt sein.

Dann wählen wir die URL: http://192.168.1.1/ an (Benutzername/Passwort: admin/admin) und klicken und durch zu -> Administration -> Firmware Upgrade

Hinweis
Es ist ganz wichtig, zuerst die Kernel 2.4 Version zu installieren, um danach die NVRAM-Variablen „boot_wait“ und „boot_time“ zu setzen (geht in den 2.6-er Versionen nicht)!
Derzeit ist die 2.4-er Kernel Version auch besser, da auf Kernel 2.6. Wireless noch immer nicht richtig läuft.

Nun laden wir das folgende Firmware-Image herunter: http://downloads.openwrt.org/kamikaze/8.09.2/brcm-2.4/openwrt-wrt54g-squashfs.bin
Dieses installieren wir nun auf dem Router wie ein Standard Firmware-Upgrade.

Nach ca. 2 Minuten rebootet der Router und wir können uns per telnet auf: 192.168.1.1 verbinden und konfigurieren.

NVRAM-Variablen setzen

(Hinweis: Dies muss nur bei der ersten OpenWRT Installation gemacht werden)

Gleich nach dem ersten Login muss folgendes ausgeführt werden:

nvram set boot_wait=on
nvram set boot_time=10
nvram commit && reboot

Konfiguration

IP ändern

Als erstes kann man die LAN-IP nach eigenen belieben setzen, wenn der Standard 192.168.1.1 nicht gefällt.
Dies lässt sich ganz einfach in der Datei: /etc/config/network machen:

#### VLAN configuration
config switch eth0
        option vlan0    "0 1 2 3 5*"
        option vlan1    "4 5"
 
 
#### Loopback configuration
config interface loopback
        option ifname   "lo"
        option proto    static
        option ipaddr   127.0.0.1
        option netmask  255.0.0.0
 
 
#### LAN configuration
config interface lan
        option type     bridge
        option ifname   "eth0.0"
        option proto    static
        option ipaddr   10.2.1.1
        option netmask  255.255.255.0
 
 
#### WAN configuration
config interface        wan
        option ifname   "eth0.1"
        option proto    dhcp

SSH auf dem Internet-Interface

Dies werden wohl die meisten benötigen, da man so den Router später auch remote administrieren kann:

passwd

schaltet SSH ein- und telnet aus.

Nun geben wir unter /etc/firewall.user folgendes ein:

#========================== Rulesets ==========================================
### Open ports to WAN
## -- This allows port 22 to be answered by (dropbear on) the router
iptables -t nat -A prerouting_wan -p tcp --dport 22 -j ACCEPT
iptables        -A input_wan      -p tcp --dport 22 -j ACCEPT

Nach einem: /etc/init.d/firewall restart sollte man sich dann auf die öffentliche IP einloggen können.

Zugriff einschränken
Da der router quasi das „Tor zum Internet“ ist, sollte man diesen nicht einfach so per SSH login Weltweit verfügbar machen, sondern auf das interne Netzwerk einschränken; remote kann dann immer noch per VPN zugegriffen werden.

Dazu ändert man die obige Regel bei einem 10-er Netzwerk wie folgt ab (bei einer andere Netzadresse muss man das natürlich anpassen!):

### Open ports to WAN
## -- This allows port 22 to be answered by (dropbear on) the router
iptables -t nat -A prerouting_wan -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT
iptables        -A input_wan      -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT

Dazu kann man intern immer darauf zugreifen, selbst wenn eine VPN-Verbindung mal ausfallen sollte und remote nur noch per VPN.

Zeit- und Zeitzone einstellen

Zuerst in <I>/etc/config/system</I> den Parameter „option timezone“ auf Mitteleuropäische Zeit (CEST) einstellen:

option timezone CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00

Und danach mittels:

date -s YYYY-MM-DD hh:mm[:ss]

die Zeit richtig Einstellen.

Wireless aktivieren

Unter /etc/config/wireless:

option disabled 1

entfernen.

Mit:

option encryption psk
        option key        "passwort"

Kann man nun noch die Verschlüsselung aktivieren.

Wer noch kein Passwort hat, mit:

pwgen --secret 13 1

kann man sich eins generieren lassen.

Firewall-Bug reparieren

Standardmässig blockt OpenWRT 8.09 ICMP- (ping) requests; dies ist unschön und führt zu nur sehr mühsam zu identifizierenden Netzwerk-Problemen.
Deshalb sollte in /etc/config/firewall folgendes eingefügt werden:

# Bugfix: Allow ICMP (<a href="https://dev.openwrt.org/ticket/4546)" target="blank">https://dev.openwrt.org/ticket/4546)</a>
config rule
        option proto ICMP
        option target ACCEPT

Paketliste aktualisieren:

opkg update
Hinweis
Dies muss in jeder shell session _immer_ einmal gemacht werden, sonst findet opkg die Pakete nicht!

QoS-Scripts

Die QoS-Funktionalität wird zwar nicht unbedingt gebraucht, ist aber trotzdem ganz Nett für einen Router:

ipkg install qos-scripts
/etc/init.d/qos start
/etc/init.d/qos enable

DynDNS

DynDNS ist sehr nützlich wenn sich die öffentliche IP-Adresse ab- und zu ändert, wie das bei den meisten Providern der Fall ist.

Dazu muss zuerst bei einem DynDNS-Anbieter ein Account erstellt werden (z.B. unter dyndns.org ), dann in OpenWRT die ddns-scripts installieren:

opkg install ddns-scripts

und unter /etc/config/ddns die Daten eintragen; diese Konfiguration sollte selbsterklärend sein… 😉

Zur initialisierung muss nun einmal folgendes gemacht werden:

sh
. /usr/lib/ddns/dynamic_dns_functions.sh # note the leading period
start_daemon_for_all_ddns_sections
exit

Ab jetzt wird sich die IP immer mit der DynDNS-URL synchronisieren, sobald diese ändert.

ntpclient

Um automatische Zeit updates empfangen zu können, installieren wir den ntpclient:

opkg install ntpclient

openvpn

Um den OpenWRT router als Client für eine VPN-Verbindung einzurichten ist folgendes zu tun:

opkg update
opkg install openvpn
mkdir /etc/openvpn/
Hinweis
Sollte beim client eine Meldung wegen ungenügendem Speicherplatz kommen, kann man folgendes probieren:

echo 'option force_space' >> /etc/opkg.conf

– Aus irgendeinem Grund funktioniert das häufig sogar.

Nun erstellen wir das config file des clients:

client
dev tun
proto udp
port 1194
comp-lzo
daemon
remote vpnserver
resolv-retry infinite
#nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client-1.crt
key /etc/openvpn/client-1.key
ns-cert-type server
verb 3

Bitte den ganzen Rest in dem File vorher weg löschen, z.B. durch: „echo > /etc/config/openvpn“)

package openvpn
config openvpn custom_config
option enable 1
option config /etc/openvpn/client-1.conf

Und auch hier noch die firewall unter /etc/firewall.user (nur der zusätzliche Teil, evtl. bestehende rules sollten beibehalten werden):

#========================== Rulesets ==========================================
### Open ports to WAN
## -- This allows port 22 to be answered by (dropbear on) the router
iptables -t nat -A prerouting_wan -p tcp --dport 22 -j ACCEPT
iptables        -A input_wan      -p tcp --dport 22 -j ACCEPT
 
### VPN
## -- VPN-Connection settings
iptables -t nat -A prerouting_rule -i eth0.1 -p udp --dport 1194 -j ACCEPT
iptables        -A input_rule      -i eth0.1 -p udp --dport 1194 -j ACCEPT
iptables        -A input_rule      -i tun0                     -j ACCEPT
iptables        -A forwarding_rule -i tun0                     -j ACCEPT
iptables        -A forwarding_rule -o tun0                     -j ACCEPT
iptables        -A output_rule     -o tun0                     -j ACCEPT

Als letztes definieren wir auf dem client noch, dass der DNS-Server des 10.1.1.0-er Netzwerks verwendet werden soll durch anfügen folgender Zeilen in /etc/config/dhcp:
Unterhalb: „config dhcp lan“

option dhcp-option=6,10.1.1.10
option domain-suffix=home.lan

und weisen den festen hosts wiederum feste IP-Adressen zu:

# pc01
00:00:00:00:00:00 10.2.1.10
# pc02
00:00:00:00:00:00 10.2.1.20
#usw.

Nun noch den Client aktivieren und neu starten:

/etc/init.d/openvpn enable
/etc/init.d/openvpn start
/etc/init.d/dnsmasq restart
/etc/init.d/firewall restart

Related Links

Related Downloads

Mit OpenVPN zwei Netzwerke verbinden

Das Gateway läuft perfekt im eigenen Netzwerk, doch nun möchte man noch ein anderes Netzwerk, z.B. das der Eltern, oder der Firma mit dem eigenen verbinden – Die Möglichkeit heutzutage auf kleinen PCs oder billig-Routern ein Linux, wie OpenWRT installieren zu können, macht dies relativ einfach möglich!

Continue reading Mit OpenVPN zwei Netzwerke verbinden

Backup aller mySQL Datenbanken

Ein komplettes Backup aller mysql-datenbanken lässt sich mit dem Befehl:

mysqldump -A -a -C -c -e --user=root --password=****** > dump.sql

durchführen.

Die Optionen bedeuten hier:

Kurze Option Lange Option Bedeutung
-A –all-databases Alle Datenbanken sichern
-a –create-options Erstellungseigenschaften der Tabelle einfügen
-C –compress Den Datenverkehr zwischen mysql Server und Client komprimieren
-c --complete-insert Die Spaltennamen in der Datei ausschreiben, also z.B.

INSERT INTO `table` VALUES
(1, 'Zeile1'),
(2, 'Zeile2'),
(3, 'Zeile3');
-e --extended-insert Mehrere Reihen in eine Abfrage kombinieren

Hier noch eine Erklärung des Unterschieds zischen –complete-insert und –extended-insert.

Tipp

Will man das Passwort nicht unbedingt an der Konsole im Klartext eingeben, kann man mit der Zeile:

mysqldump -A -a -C -c -e --user=root --password > dump.sql

auch erreichen, dass ein Abfrage-Dialog erscheint und man das Passwort ohne Anzeige eingeben kann. (Dies funktioniert natürlich NICHT in automatischen Scripts… :D)

Dies ist für automatische Sicherungen aller Datenbanken praktisch.

Eine einzelne Datenbank kann man aber auch einfach wie folgt sichern (z.B. als „Quick Backup“ vor einem Applikations-Update):

mysqldump -u BENUTZER -p DB_NAME > db.sql

Wieder eingespielt wird das Backup mit dem Befehl:

mysql < backup-file.sql

Will man hingegen nur eine bestimmte Datenbank wieder einlesen, geschieht dies mit dem Befehl:

mysql DB_NAME < backup-file.sql

Evtl. muss man natürlich auch beim Einspielen den Benutzernamen und Passwort eingeben:

mysql --user=root --password < backup-file.sql