pfSense auf der Soekris net4801

Dies ist eigentlich nur eine Notiz an mich, für den Fall, daß ich es mal wieder brauchen sollte.

Wenn die pfSense nach der Installation auf der CF-Karte auf der Soekris nur noch Meldungen wie READ_DMA timed out ausspuckt, muß man DMA deaktivieren. Einfach in der /boot/loader.conf folgende Zeile einfügen:

hw.ata.ata_dma="0"

 


Danach bootet die pfSense auch wieder.

 

cpu0: Geode(TM) Integrated Processor by National Semi (“Geode by NSC” 586-class) 267 MHz

Dies ist das erste, was der OpenBSD-Kernel auf meiner Soekris-Box von sich gibt. Ich habe endlich Zeit gefunden, ein System auf die Kiste zu installieren. Es gibt zwar schon ein paar fertige Distributionen für die Soekris-Geräte, doch ich wollte was eigenes bauen. Nachdem das ganze mit der CF-Karte sich als etwas umständlich erwies, habe ich einfach eine 2.5”-Festplatte in das Gerät eingebaut. Somit habe ich schon mal ein funktionsfähiges System.

Wer es ganz genau wissen möchte…

OpenBSD 3.6-current (GENERIC) #1: Sun Feb 13 01:09:00 CET 2005
root@horus.shadowrun.not:/usr/src/sys/arch/i386/compile/GENERIC
cpu0: Geode(TM) Integrated Processor by National Semi (“Geode by NSC” 586-class) 267 MHz
cpu0: FPU,TSC,MSR,CX8,CMOV,MMX
cpu0: TSC disabled
real mem = 133799936 (130664K)
avail mem = 115752960 (113040K)
using 1658 buffers containing 6791168 bytes (6632K) of memory
mainbus0 (root)
bios0 at mainbus0: AT/286+(00) BIOS, date 20/40/21, BIOS32 rev. 0 @ 0xf7840
pcibios0 at bios0: rev 2.0 @ 0xf0000/0x10000
pcibios0: pcibios_get_intr_routing – function not supported
pcibios0: PCI IRQ Routing information unavailable.
pcibios0: PCI bus #0 is the last bus
bios0: ROM list: 0xc8000/0x9000
cpu0 at mainbus0
pci0 at mainbus0 bus 0: configuration mode 1 (bios)
pchb0 at pci0 dev 0 function 0 “Cyrix GXm PCI” rev 0x00
sis0 at pci0 dev 6 function 0 “NS DP83815 10/100” rev 0x00: DP83816A, irq 10, address 00:00:24:c3:5c:84
nsphyter0 at sis0 phy 0: DP83815 10/100 PHY, rev. 1
sis1 at pci0 dev 7 function 0 “NS DP83815 10/100” rev 0x00: DP83816A, irq 10, address 00:00:24:c3:5c:85
nsphyter1 at sis1 phy 0: DP83815 10/100 PHY, rev. 1
sis2 at pci0 dev 8 function 0 “NS DP83815 10/100” rev 0x00: DP83816A, irq 10, address 00:00:24:c3:5c:86
nsphyter2 at sis2 phy 0: DP83815 10/100 PHY, rev. 1
hifn0 at pci0 dev 10 function 0 “Hifn 7955/7954” rev 0x00: LZS 3DES ARC4 MD5 SHA1 RNG AES PK, 32KB dram, irq 11
gscpcib0 at pci0 dev 18 function 0 “NS SC1100 ISA” rev 0x00
gpio0 at gscpcib0: 64 pins
“NS SC1100 SMI/ACPI” rev 0x00 at pci0 dev 18 function 1 not configured
pciide0 at pci0 dev 18 function 2 “NS SCx200 IDE” rev 0x01: DMA, channel 0 wired to compatibility, channel 1 wired to compatibility
wd0 at pciide0 channel 0 drive 0:
wd0: 16-sector PIO, LBA48, 19077MB, 39070080 sectors
wd1 at pciide0 channel 0 drive 1:
wd1: 1-sector PIO, LBA, 124MB, 254464 sectors
wd0(pciide0:0:0): using PIO mode 4, Ultra-DMA mode 2
wd1(pciide0:0:1): using PIO mode 4
geodesc0 at pci0 dev 18 function 5 “NS SC1100 X-Bus” rev 0x00: iid 6 revision 3 wdstatus 0
ohci0 at pci0 dev 19 function 0 “Compaq USB OpenHost” rev 0x08: irq 5, version 1.0, legacy support
usb0 at ohci0: USB revision 1.0
uhub0 at usb0
uhub0: Compaq OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 3 ports with 3 removable, self powered
isa0 at gscpcib0
isadma0 at isa0
pckbc0 at isa0 port 0x60/5
pckbd0 at pckbc0 (kbd slot)
pckbc0: using irq 1 for kbd slot
wskbd0 at pckbd0 (mux 1 ignored for console): console keyboard
pcppi0 at isa0 port 0x61
midi0 at pcppi0: spkr0 at pcppi0
sysbeep0 at pcppi0
nsclpcsio0 at isa0 port 0x2e/2: NSC PC87366 rev 9: GPIO VLM TMS
gpio1 at nsclpcsio0: 29 pins
gscsio0 at isa0 port 0x15c/2: SC1100 SIO rev 1:
npx0 at isa0 port 0xf0/16: using exception 16
pccom0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
pccom0: console
pccom1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
biomask f3e5 netmask ffe5 ttymask ffe7
pctr: no performance counters in CPU
dkcsum: wd0 matched BIOS disk 80
dkcsum: wd1 matched BIOS disk 81
root on wd0a
rootdev=0x0 rrootdev=0x300 rawdev=0x302

Sendmail für den Hausgebrauch

Ich habe bei mir Zuhause einen eigenen kleinen Mailserver stehen, der sich um die Abwicklung der Mails aus meinem ganzen Netzwerk kümmert. Als der alte Server erste Anzeichen seines baldigen ablebens von sich gab, beschloß ich einen neuen Server aufzusetzten. Als Basis habe ich diesmal FreeBSD 5.3(BETA4) genommen. (Der alte Server lief noch mit FreeBSD 4.5-STABLE)

Vorarbeit

Das bei FreeBSD mitgelieferte Sendmail hat einen kleinen Schönheitsfehler. Es ist ohne SASL kompiliert. Es gibt zwei Wege, diesen Umstand zu beheben. Man installiert aus den Ports Sendmail mit SASL oder linkt das mitgelieferte Sendmail gegen SASL. Ich habe mich für letzteres entschieden. Dafür habe ich zuerst Cyrus-SASL2 installiert. Danach habe ich diese drei Zeilen zur /etc/make.conf hinzugefügt:

SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2
SENDMAIL_LDFLAGS=-L/usr/local/lib
SENDMAIL_LDADD=-lsasl2

Nach einem (langwierigen) make buildworld war nun das Sendmail gegen SASL gelinkt. Dies habe ich einfach mit sendmail -d0.1 < /dev/null überprüft. Die Ausgabe von Sendmail sollte dann so aussehen:

Version 8.13.1
 Compiled with: DNSMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7
                NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS PIPELINING SASLv2
                SCANF STARTTLS TCPWRAPPERS USERDB XDEBUG

Damit wäre alles vorbereitet. Ich versende meine Mails in der Regel über GMX. Sendmail wird also die Mails über den SMTP-Server von GMX versenden. Der Server von GMX läßt mich Emails nur dann abliefern, wenn er sich sicher ist, daß ich es auch wirklich bin. Hierzu bietet GMX zwei Alternativen. SMTP-after-POP und SMTP-AUTH. Ich habe mich für letzteres entschieden. SMTP-AUTH funktioniert nur mit SASL, deshalb war die kleine Vorarbeit nötig.

Konfiguration mit m4

Nun muß man Sendmail noch zu verstehen geben, was es tun soll. Dies ist der Inhalt meiner /etc/mail/anubis.shadowrun.not.mc (Das Makefile benutzt als Dateinamen automatisch $(hostname).mc):

divert(0)
VERSIONID(`$Id: anubis.shadowrun.not.mc,v 1.2 2004/09/19 22:47:42 fastjack Exp fastjack $‘)
OSTYPE(freebsd5)
DOMAIN(generic)
FEATURE(access_db, `hash -o -T /etc/mail/access’)
FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable’)
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable’)
define(`confCW_FILE’, `-o /etc/mail/local-host-names’)
define(`SMART_HOST’, `mail.gmx.net’)
MASQUERADE_AS(`gmx.net’)
FEATURE(`local_no_masquerade’)
MASQUERADE_DOMAIN(`shadowrun.not’)
FEATURE(`masquerade_entire_domain’)
FEATURE(`masquerade_envelope’)
dnl Process login names through the genericstable
FEATURE(`genericstable’)
GENERICS_DOMAIN(`shadowrun.not’)
FEATURE(`generics_entire_domain’)
FEATURE(`authinfo’)
FEATURE(`relay_hosts_only’)
dnl The group needs to be mail in order to read the sasldb2 file
define(`confRUN_AS_USER’,`root:mail’)
define(`confDONT_BLAME_SENDMAIL’,`GroupReadableSASLDBFile’)
dnl Enable for both IPv4 and IPv6 (optional)
DAEMON_OPTIONS(`Name=IPv4, Family=inet’)
DAEMON_OPTIONS(`Name=IPv6, Family=inet6, Modifiers=O’)
define(`confBIND_OPTS’, `WorkAroundBrokenAAAA’)
define(`confNO_RCPT_ACTION’, `add-to-undisclosed’)
define(`confPRIVACY_FLAGS’, `authwarnings,noexpn,novrfy’)
MAILER(local)
MAILER(smtp)

Zusätzliche Konfigurationsdateien

Während mein Login auf allen meinen Rechnern „fastjack“ ist, habe ich bei GMX einen anderen Namen. Das Umschreiben des Benutzernamens übernimmt die genericstable. Der Hostname wird vom Masquerading geändert. In der /etc/mail/genericstable steht bei mir folgendes:

fastjack        mmaciaszek

Nun muß sich Sendmail beim Abliefern der Mails bei GMX noch authentifizieren. Hierzu steht in meiner /etc/mail/authinfo diese Zeile:

AuthInfo:mail.gmx.net “U:123456” “P:sehrgeheim” “M:CRAM-MD5”

Die „123456“ steht für meine GMX-Kundennummer und „sehrgeheim“ ist stellvertretend für mein Paßwort bei GMX. (Beides habe ich natürlich hier geändert)

Fehlen jetzt noch die Hosts, für die Sendmail Emails relayen soll. Ich habe hier bewußt auf SMTP-AUTH innerhalb des Netzwerkes verzichtet, da einige Hosts (z.B.: die NeXTSTEP-Maschine) ein altes Sendmail ohne SASL und SMTP-AUTH fahren. Diese Hosts stehen in der /etc/mail/relay-domains. Pro Zeile sollte ein Host stehen. Meine /etc/mail/relay-domains sieht so aus:

renraku.shadowrun.not
nexus.shadowrun.not
fuchi.shadowrun.not
sprawl.shadowrun.not

Dies wären alle Einstellungen, die nötig sind. Die genericstable und authinfo habe ich dann mit makemap(8) in eine entsprechende Map umgewandelt. Dies geht mit makemap hash genericstable < genericstable (für die authinfo muß man entsprechend die Namen ändern). Da sich in der /etc/mail/authinfo das Paßwort für den SMTP-Server befindet, sollte es nach Möglichkeit nur für root lesbar sein.

Die sendmail.cf habe erzeugt man dann mit make cf und make install in /etc/mail/. Ein beherztes make restart startet Sendmail mit der neuen Konfiguration neu. Nun liefert Sendmail nicht-lokale Mails über GMX aus.

Troubleshooting

Falls etwas schiefgegangen ist und es nicht wie gewünscht klappt, sind hier ein paar Tips zum „Debugging“. Falls das Masquerading/Generics nicht wie erwartet funktioniert, kann man Sendmail anweisen eine Email-Adresse durch seine Regeln zu schicken. Dazu muß man Sendmail mit sendmail -bt im sogenannten „Rule-testing mode“ starten. Da das Umschreiben der Absenderadresse getestet werden soll, muß man dies Sendmail mitteilen. Dies geschieht mit /tryflags HS. Nun können beliebige Absender-Adressen getestet werden. z.B: /try smtp fastjack. Sendmail wird nun genau beschreiben, wie es den Absender umschreiben würde, wenn die Mail über SMTP verschickt würde.

Falls der Fehler weniger genau einzugrenzen ist, kann man Sendmail beim SMTP-Dialog über die Schulter schauen. Dazu muß man Sendmail mit sendmail -Am -v -t starten. Danach erwartet Sendmail, daß man ihm eine Mail incl. Headern zu futtern gibt und mit Strg-D abschließt. Vorausgesetzt der Empfänger der Mail ist über SMTP erreichbar (also nicht lokal), wird Sendmail nun versuchen, diese Mail zuzustellen und gibt dabei die gesamte SMTP-Konversation auf dem Bildschirm aus. Damit sollte man den kniffeligeren Fehlern auf die Spur kommen können.

Eine ähnliche Anleitung für NetBSD hat tecneeq auf Newbie-Net geschrieben.

OpenBSD 3.5

Genau 6 Monate nach der letzten Version von OpenBSD haben die Entwickler rund um Theo DeRaadt am 1. Mai die Version 3.5 freigegeben.

Die Liste der Neuerungen liest sich lang. Das wohl hervorstechendste Merkmal von 3.5 dürfe wohl CARP sein. CARP ermöglicht es redundante Paketfilter aufzubauen, die übernehmen können, ohne den Datenfluß durch sie hindurch abreißen zu lassen.

PostgreSQL auf OpenBSD

Für die Installation von Movable Type auf OpenBSD brauchte ich eine Datenbank. Die Wahl fiel auf PostgreSQL. Hier ist was ich tat, um PostgreSQL nach meinen Vorstellungen zu konfigurieren.

Diese Anleitung ist an einigen Stellen OpenBSD-spezifisch. Bei Linux muß logrotate statt newsyslog benutzt werden.

Zuerst muß man den Quelltext herunterladen und an geeigneter Stelle extrahieren. Den Quelltext kompilieren und die fertigen Programme zu installieren funktioniert mit dem üblichen GNU-Dreisatz: (die letzte Zeile sollte man als root aufrufen)

./configure—prefix=/usr/local—with-perl—with-openssl=/usr
make
make install

Damit hat man schon mal alle nötigen Programme installiert. PostgreSQL braucht aber noch einige Vorarbeit, um zu funktionieren. PostgreSQL möchte unter einem eigenen Benutzer laufen. Die folgenden Zeilen legen diesen Benutzer samt passender Gruppe an. (natürlich als root)

groupadd -g 164 pgsql
useradd -c “PostgreSQL Admin User” -d /var/pgsql -g 164 -u 164 -s /bin/sh pgsql

Nun fehlt noch das Datenbankverzeichnis, in dem PostgreSQL seine Daten ablegt. Dieses Verzeichnis sollte dem PostgreSQL-Benutzer gehören.

mkdir /var/pgsql
chown pgsql:pgsql /var/pgsql
chmod 755 /var/pgsql

Jetzt muß die Datenbank initialisiert werden. Da alle Dateien im Datenbankverzeichnis dem PostgreSQL-Benutzer gehören sollten, sollte dies als der PostgreSQL-Benutzer geschehen.

su pgsql
/usr/local/bin/initdb -D /var/pgsql/data

Damit ist die Datenbank im Grunde fertig und kann benutzt werden. Es fehlen aber noch einige Kleinigkeiten, damit das alles rund läuft.

Zuerst soll PostgreSQL beim Booten gestartet werden. Die nächsten Zeilen sollten an passender Stelle in die /etc/rc.local aufgenommen werden: (wieder als root)

if [ -x /usr/local/bin/pg_ctl ]; then
        su -l pgsql -c “/usr/local/bin/pg_ctl start \
                -D /var/pgsql/data -l /var/pgsql/logfile”
        echo -n ‘ postgresql’
fi

Natürlich soll PostgreSQL beim Herunterfahren von OpenBSD sauber beendet werden, um inkonsistenzen in der Datenbank zu verhindern. Dies erledigen diese Zeilen in der /etc/rc.shutdown:

if [ -f /var/pgsql/data/postmaster.pid ]; then
        su -l pgsql -c “/usr/local/bin/pg_ctl stop \
                -D /var/pgsql/data”
        echo -n ‘ postgresql’
fi

PostgreSQL soll über syslogd(8) loggen. Das macht es einfacher, auf einem zentralen Logging-Host zu loggen. Hier müssen in der /var/pgsql/data/postgresql.conf 3 Zeilen angepasst werden. Die Zeilen stehen schon in der Datei drin, sind jedoch auskommentiert.

syslog = 2                      # range 0-2; 0=stdout; 1=both; 2=syslog
syslog_facility = ‘LOCAL0’
syslog_ident = ‘postgres’

Selbverständlich muß der syslogd(8) auch wissen, was er mit den Daten anfangen soll. Darum kümmert sich diese Zeile in der /etc/syslog.conf:

local0.*                                                /var/log/pgsql

Bevor der syslogd(8) nun restarted wird, damit er anfangen kann zu loggen, sollte noch ein leeres Logfile angelegt werden, da der syslogd(8) dies in der Regel nicht tut. Mit touch /var/log/pgsql entsteht ein leeres Logfile an. Schicke ein SIGHUP an syslogd(8) um ihn zu restarten.

Die Logfiles sollten noch in regelmäßigen Abständen rotiert werden, damit das Dateisystem nicht überläuft. Bei OpenBSD kümmert sich newsyslog(8) um das Rotieren von Logfiles. Eine Zeile in der /etc/newsyslog.conf erledigt dies:

/var/log/pgsql                          640  7    *    168   Z

Damit ist PostgreSQL nun bereit zum Einsatz. Um den Server nun endlich zu starten, kann der gleiche Code benutzt werden, wie er auch in der /etc/rc.local steht. Viel Spaß mit PostgreSQL.