BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

PPTP VPN Server einrichten

Möchte man einen PPTP-VPN-Server zum Beispiel für Windows-Clients einrichten, kann man dazu poptop verwenden. Zuerst muss sichergestellt werden, dass der Kernel des Systems mit Tunnelsupport gebaut ist. Dies ist beim GENERIC-Kernel der Fall:

# grep tun /usr/src/sys/i386/conf/<KERNELCONFIGURATION>
device tun # Packet tunnel.

Nun muss noch das Weiterleiten von Paketen auf dem System aktiviert werden:

# sysctl net.inet.ip.forwarding=1
# echo 'gateway_enable="YES"' >> /etc/rc.conf

Danach kann poptop aus dem Portsbaum installiert werden:

# cd /usr/ports/net/poptop && make install clean

Nun kann die /usr/local/etc/pptpd.conf erstellt werden. Bei der localip ist die IP-Adresse einzutragen, welche der PPTP Server kriegt, bei der remoteip sind die IP-Adressen einzutragen, welche an die Clients verteilt werden:

debug
localip 192.168.0.1
remoteip 192.168.0.100-120

Danach können folgende Einträge in der /etc/ppp/ppp.conf gemacht werden. Bei set ifaddr wird zuerst die IP-Adresse des Servers und danach der Range der Clients angegeben:

pptp:
set dial
set login
set ifaddr 192.168.0.1 192.168.0.100-120 255.255.255.255
set log phase lcp ipcp command
set timeout 1800
enable chap
enable pap
enable mschap
enable mschapv2
enable proxy
enable mssfixup
accept dns
set dns <IP des DNS Servers>

Nun wird noch eine /etc/ppp/options mit folgendem Inhalt erstellt:

debug
proxyarp
+MSChap-V2 mppe-128 mppe-stateless

In der /etc/ppp/ppp.secret werden nun die VPN-Benutzer und deren Passwörter konfiguriert:

<Benutzername 1> <Passwort> *
<Benutzername 2> <Passwort> *
...

Da die Passwörter im Klartext gespeichert werden, werden nun noch die richtigen Rechte auf der Datei gesetzt:

# chmod 600 /etc/ppp/ppp.secret

Nun wird noch der pptpd und ARP-Proxy in der /etc/rc.conf aktiviert:

# echo 'pptpd_enable="YES"' >> /etc/rc.conf
# echo 'arpproxy_all="YES"' >> /etc/rc.conf

Danach kann der pptpd gestartet werden:

# /usr/local/etc/rc.d/pptpd start

Verwendet man die pf Firewall, müssen noch die benötigten Ports für PPTP freigeschaltet werden. Das NAT für die Clients kann gleich aktiviert werden. Folgende Regeln in die bestehende /etc/pf.conf an der richtigen Stelle einfügen:

ext_if="<Externe Netzwerkschnittstelle>"

set skip on tun0

nat on $ext_if from 192.168.0.0/24 to any -> ($ext_if)

pass in on $ext_if proto gre keep state
pass in on $ext_if proto tcp from any to any port 1723 keep state

Mehr Informationen zum pptpd findet man in der Manpage pptpd(8).

Comments (3)  Permalink

Ports-Variablen auslesen

Möchte man die gesetzten Variablen in /usr/ports/Mk/bsd.port.mk einfach auslesen, so kann das Skript portsvar.sh unter /usr/ports/Tools/scripts/ genutzt werden. Einfach die gewünschten Variablen an portsvar.sh übergeben:

# /usr/ports/Tools/scripts/portsvar.sh PORTSDIR OSVERSION
PORTSDIR = /usr/ports
OSVERSION = 602000

Auch Regex lassen sich mit Hilfe der -e Option in portsvar.sh bei der Suche nach Variablen verwenden.

# /usr/ports/Tools/scripts/portsvar.sh -e "PKG[M,D].*"
PKGDEINSTALL = ${PKGDIR}/pkg-deinstall
PKGDIR = ${MASTERDIR}
PKGMESSAGE = ${PKGDIR}/pkg-message

Standardmässig wird nur in bsd.port.mk nach Variablen gesucht. Möchte man ein anderes Makefile unter /usr/ports/Mk/ in die Suche mit aufnehmen, kann dies mit der -w Option gemacht werden. In den folgenden Beispielen wird die Standardversion vom Apache, PHP und PostgeSQL aus dem jeweiligen Makefile ausgelesen:

# /usr/ports/Tools/scripts/portsvar.sh -w apache -e "APACHE_[P,S].*"
APACHE_PORT = www/apache13
APACHE_SUPPORTED_VERSION = 13 20 21 22
# /usr/ports/Tools/scripts/portsvar.sh -w php -e "PHP_VER.*"
PHP_VER = 5
PHP_VERSION = 5.2.5
# /usr/ports/Tools/scripts/portsvar.sh -w database -e "DEFAULT_PGSQL.*"
DEFAULT_PGSQL_VER = 81

Alle Optionen von portsvar.sh erhält man mit der -h Option.

Related Entries:
Gespeicherte Optionen nach OptionsNG konvertieren
Ports-Subversion-Repository spiegeln
sysinstall-Ersatz für neuere FreeBSD-Versionen
Alte FreeBSD-Port Patchdateien aufsplitten
FreeBSD-Portbaum auf Fehler überprüfen
Comments (1)  Permalink

Smart Array RAID Controller Status auslesen

Auf einem Server mit einem Smart Array RAID Controller werden Änderungen am Status eines Logical Drives von FreeBSD nach /var/log/messages geschrieben. Folgendes Beispiel zeigt die Ausgabe in /var/log/messages bei einem Diskwechsel:

kernel: ciss0: *** Hot-plug drive removed: SCSI port 1 ID 0
kernel: ciss0: *** Physical drive failure: SCSI port 1 ID 0
kernel: ciss0: *** State change, logical drive 0
kernel: ciss0: logical drive 0 (pass0) changed status OK->interim recovery, spare status 0x0
...
kernel: ciss0: *** Hot-plug drive inserted: SCSI port 1 ID 0
kernel: ciss0: *** State change, logical drive 0
kernel: ciss0: logical drive 0 (pass0) changed status interim recovery->ready for recovery, spare status 0x0
kernel: ciss0: *** State change, logical drive 0
kernel: ciss0: logical drive 0 (pass0) changed status ready for recovery->recovering, spare status 0x0
...
kernel: ciss0: *** State change, logical drive 0
kernel: ciss0: logical drive 0 (pass0) changed status recovering->OK, spare status 0x0

Möchte man sich den aktuellen Status anzeigen lassen, ohne /var/log/messages auf die letzte Änderung durchsuchen zu müssen, kann man den Port sysutils/cciss_vol_status installieren. Damit cciss_vol_status kompiliert werden kann, müssen die Kernel-Sourcen auf dem System vorhanden sein:

# cd /usr/ports/sysutils/cciss_vol_status && make install clean

Nun kann der Status des Smart Array Controllers abgefragt werden:

# cciss_vol_status /dev/ciss0
/dev/ciss0: (Smart Array 5i) RAID 1 Volume 0 status: OK.

Mehr Informationen zu cciss_vol_status und eine Beschreibung aller möglichen Status findet man in der Manpage cciss_vol_status(8).

Related Entries:
Gespeicherte Optionen nach OptionsNG konvertieren
Ports-Subversion-Repository spiegeln
sysinstall-Ersatz für neuere FreeBSD-Versionen
Alte FreeBSD-Port Patchdateien aufsplitten
FreeBSD-Portbaum auf Fehler überprüfen
 Permalink

FreeBSD Jail ohne kompilieren erstellen

Möchte man eine FreeBSD Jail erstellen, aber nicht wie normalerweise die Jail mit einem make world in /usr/src kompilieren, so kann eine Jail auch mit dem Base-Distributions-Set der FreeBSD Installations CD erstellt werden. Falls für das CD-ROM Laufwerk einen entsprechender Eintrag in der /etc/fstab besteht, kann die Installations CD wie folgt gemountet werden:

# mount /cdrom

Danach kann ins Verzeichnis mit dem Base-Distribution-Set gewechselt werden. In diesem Beispiel wird die FreeBSD 7.0-BETA4 Installations CD verwendet:

# cd /cdrom/7.0-BEAT4/base

Jetzt kann mit der DESTDIR Variable der Pfad gesetzt werden, wo die Jail installiert werden soll. Zum Beispiel in der (t)csh:

# setenv DESTDIR /usr/jail/

Nun wird die Installation gestartet. Dazu muss die Kontrollfrage mit y beantwortet werden:

# ./install.sh
You are about to extract the base distribution into /usr/jail/ -
are you SURE you want to do this over your installed system (y/n) y

Nun kann die Jail ganz normal fertig konfiguriert werden. Dazu muss zuerst das devfs in die Jail gemoutet werden:

# mount -t devfs devfs /usr/jail/dev

Als Nächstes muss man ein Alias mit der Jail-IP Adresse konfigurieren:

# ifconfig <Netzwerkkarte> alias <Jail IP>/32

Danach kann die Jail das erste Mal gestartet werden:

# jail /usr/jail <Jail Hostnamen> <Jail IP> /bin/sh

Jetzt müssen noch einige Konfigurationen in der Jail vorgenommen werden:

# touch /etc/fstab
# echo 'rpcbind_enable="NO"' >> /etc/rc.conf
# echo 'network_interfaces=""' >> /etc/rc.conf
# echo 'sshd_enable="YES"' >> /etc/rc.conf
# echo 'nameserver <DNS Server IP>' >> /etc/resolv.conf
# newaliases

Danach kann noch das root-Passwort, die Zeitzone konfiguriert und Benutzer und Gruppen angelegt werden. Hat man die Jail fertig konfiguriert, verlässt man die Jail:

# exit

Als Letztes wird die Jail vollständig gestartet:

# jail /usr/jail <Jail Hostnamen> <Jail IP> /bin/sh /etc/rc

Soll die Jail bei einem Neustart automatisch gestartet werden, müssen noch die entsprechenden Einträge in der /etc/rc.conf gemacht werden. Mehr Informationen zu den Jails findet man in der Manpage jail(8).

Related Entries:
Gespeicherte Optionen nach OptionsNG konvertieren
Ports-Subversion-Repository spiegeln
sysinstall-Ersatz für neuere FreeBSD-Versionen
Alte FreeBSD-Port Patchdateien aufsplitten
FreeBSD-Portbaum auf Fehler überprüfen
 Permalink

Zugriffs- und Modifikationszeit einer Datei auslesen

Auf FreeBSD können mit stat verschiedene Details einer Datei ausgelesen werden. So kann zum Beispiel ausgelesen werden, wann zum letzten Mal auf die Datei zugegriffen wurde und wann diese zum letzten Mal verändert wurde. Auch lässt sich auslesen, wann der Inode zur Datei alloziert und wann das letzte Mal verändert wurde. Im folgenden Beispiel wird eine neue Datei erstellt und anschliessend die Zeiten der Datei ausgelesen. Dabei wird die Zeit angezeigt, wann der Inode zut Datei alloziert (birth) wurde:

# echo test > testdatei
# stat -f "birth: %SB change: %Sc modify: %Sm access: %Sa" testdatei
birth: Dec 15 14:30:22 2007 change: Dec 15 14:30:22 2007 modify: Dec 15 14:30:22 2007 access: Dec 15 14:30:22 2007

Wird nun die Datei verändert, wird die Modifikationszeit der Inodes (change) und die Modifikationzeit der Datei (modify) geändert:

# echo test2 >> testdatei
# stat -f "birth: %SB change: %Sc modify: %Sm access: %Sa" testdatei
birth: Dec 15 14:30:22 2007 change: Dec 15 14:30:44 2007 modify: Dec 15 14:30:44 2007 access: Dec 15 14:30:22 2007

Werden nun die Dateirechte verändert, so wird nur die Modifikationszeit des Inodes (change) verändert:

# chmod 600 testdatei
# stat -f "birth: %SB change: %Sc modify: %Sm access: %Sa" testdatei
birth: Dec 15 14:30:22 2007 change: Dec 15 14:31:05 2007 modify: Dec 15 14:30:44 2007 access: Dec 15 14:30:22 2007

Wird nun die Datei ausgelesen, so wird die Zugriffszeit (access) verändert:

# cat testdatei
test
test2
# stat -f "birth: %SB change: %Sc modify: %Sm access: %Sa" testdatei
birth: Dec 15 14:30:22 2007 change: Dec 15 14:31:05 2007 modify: Dec 15 14:30:44 2007 access: Dec 15 14:31:23 2007

Alle Möglichkeiten und Optionen von stat findet man in der Manpage stat(1).

 Permalink

Herausfinden welche Befehle von make ausgeführt werden

Möchte man herausfinden welche Befehle von make(1) ausgeführt werden, kann make mit der -n Option aufgerufen werden. Danach werden alle Befehle angezeigt, jedoch nicht ausgeführt. Im folgenden Beispiel wird angezeigt, was ein make clean und ein make-doclean im FreeBSD Portsbaum ausführen:

# cd /usr/ports/ports-mgmt/portsopt
# make -n clean
cd /usr/ports/ports-mgmt/portsopt && make limited-clean-depends
echo "===> Cleaning for portsopt-1.4"
cd /usr/ports/ports-mgmt/portsopt && make do-clean

# make -n do-clean
if [ -d /usr/ports/ports-mgmt/portsopt/work ]; then if [ -w /usr/ports/ports-mgmt/portsopt/work ]; then /bin/rm -rf /usr/ports/ports-mgmt/portsopt/work; else echo "===> /usr/ports/ports-mgmt/portsopt/work not writable, skipping"; fi; fi
 Permalink

Aufgerufene Systemcalls eines Programms aufzeichen

Möchte man die Systemcalls aufzeichnen, welche von einem Programm aufgerufen werden, so kann man dazu truss verwenden. Damit truss eingesetzt werden kann, muss zuerst das procfs Dateisystem gemountet werden:

# mount_procfs procfs /proc

Ohne Optionen schickt truss die Ausgabe auf die Standard-Error-Ausgabe:

# truss <Befehl>

Durch das Verwenden der -d Option wird vor jedem Systemcall die Zeit angezeigt, die seit dem Aufrufen des Befehls vergangen ist, bis der Systemcall ausgeführt wurde. In folgendem Beispiel werden alle Systemcalls auf die Standard-Error Ausgabe ausgegeben, welche durch den sleep Befehl aufgerufen werden:

# truss -d sleep 1
0.000136889 mmap(0x0,3904,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 671559680 (0x28073000)
0.000414299 munmap(0x28073000,3904) = 0 (0x0)
0.000603429 __sysctl(0xbfbfe9f8,0x2,0x2806f738,0xbfbfe9f4,0x0,0x0) = 0 (0x0)
0.000799264 mmap(0x0,32768,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 671559680 (0x28073000)
0.000998731 issetugid() = 0 (0x0)
0.001246248 open("/etc/libmap.conf",O_RDONLY,0666) = 3 (0x3)
0.001419175 fstat(3,{mode=-r--r--r-- ,inode=49501,size=3055,blksize=4096}) = 0 (0x0)
0.001612775 read(3,"# /etc/libmap.conf for FreeBSD 6"...,4096) = 3055 (0xbef)
0.001860572 read(3,0x28077000,4096) = 0 (0x0)
0.002042159 close(3) = 0 (0x0)
0.002239391 open("/var/run/ld-elf.so.hints",O_RDONLY,00) = 3 (0x3)
0.002414274 read(3,"Ehnt\^A\0\0\0\M^@\0\0\0\M-+\0\0"...,128) = 128 (0x80)
0.002610388 lseek(3,0x80,SEEK_SET) = 128 (0x80)
0.002782477 read(3,"/lib:/usr/lib:/usr/lib/compat:/u"...,171) = 171 (0xab)
0.002967975 close(3) = 0 (0x0)
0.003166045 access("/lib/libc.so.6",0) = 0 (0x0)
0.003359087 open("/lib/libc.so.6",O_RDONLY,00) = 3 (0x3)
0.003532572 fstat(3,{mode=-r--r--r-- ,inode=16469,size=906276,blksize=4096}) = 0 (0x0)
0.003716395 read(3,"\^?ELF\^A\^A\^A\t\0\0\0\0\0\0\0"...,4096) = 4096 (0x1000)
0.003923404 mmap(0x0,925696,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_NOCORE,3,0x0) = 671592448 (0x2807b000)
0.004118680 mprotect(0x28140000,4096,PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
0.004304179 mprotect(0x28140000,4096,PROT_READ|PROT_EXEC) = 0 (0x0)
0.004487442 mmap(0x28141000,24576,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED,3,0xc5000) = 672403456 (0x28141000)
0.004695290 mmap(0x28147000,90112,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0) = 672428032 (0x28147000)
0.004889169 close(3) = 0 (0x0)
0.005069080 mmap(0x0,36864,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 672518144 (0x2815d000)
0.005328890 sysarch(0xa,0xbfbfeb80) = 0 (0x0)
0.005506008 mmap(0x0,176,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 672555008 (0x28166000)
0.005712738 munmap(0x28166000,176) = 0 (0x0)
0.005887341 mmap(0x0,22384,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 672555008 (0x28166000)
0.006272585 munmap(0x28166000,22384) = 0 (0x0)
0.006495519 sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
0.006731862 sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
1.006956751 nanosleep({1.000000000}) = 0 (0x0)
1.007179684 exit(0x0)
1.007179684 process exit, rval = 0

Möchte man die Ausgabe von truss in einer Datei speichern, kann die -o Option verwendet werden. Auch lassen sich die Systemcalls eines bereits laufenden Prozesses aufzeichnen, dazu muss nur die Prozess-ID mit der -p Option an truss übergeben werden. Folgendes Beispiel zeichnet die Systemcalls des laufenden portsnap Prozesses auf und speichert sie unter /tmp/portsnap.truss:

# portsnap fetch update &
[1] 20694
# truss -o /tmp/portsnap.truss -p 20694
[1] + Fertig

truss befindet sich auf FreeBSD bereits im Basissystem. Mehr Informationen zu truss findet man in der Manpage truss(1).

 Permalink
1-7/7