www.7bf.de – Blog

September 11, 2008

Xen DomU als OpenVPN Gateway

Filed under: Linux, OpenVPN, Ubuntu, Xen — christian @ 17:01

Hi @ll,

ursprünglich schon einmal erstellt und von Madd kritisiert, hier nun die neue Variante des Howto…

Vorweg sei gesagt, dass in dieser Anleitung zwei Varianten benannt werden.
1) Anmeldung über Zertifikate
2) Anmeldung über Zertifikate und Zugangsdaten (Benutzername/Passwort)
Der Unterschied liegt lediglich in den Konfigurationsdateien von Server und Client, daher werde ich erst an der entsprechenden Stelle darauf hinweisen.

Betriebssystem
Um dieses Howto zu erstellen habe ich ein Ubuntu 8.04 Server unter Xen 3.0.3 über debootstrap installiert.

Zusätzliche Pakete
Nach dem ersten Start sollten noch die folgenden Pakete installiert werden:

  • openssh-server (nur zu administrativen Zwecken / ich habe die OpenVPN-Konfiguration darüber durchgeführt)
  • openvpn (zur Einwahl via OpenVPN… o_O )
  • openssl (zur Zertifikatserstellung benötigt)
  • iptables (für IP-Masquerading benötigt)

Erstellung der Zertifikate
Zunächst in den richtigen Ordner wechseln:

cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/

Dier muss die Datei vars editiert werden. Dabei bitte (mindestens) die folgenden Zeilen anpassen:

export KEY_COUNTRY=DE
export KEY_PROVINCE=NRW
export KEY_CITY=Paderborn
export KEY_ORG=”7bf”
export KEY_EMAIL=”c@7bf.de”

Die Werte sind natürlich entsprechend eurer Umgebung anzupassen.

Durch Eingabe der folgenden drei Kommandozeilen wird das CA-Zertifikat (für die Erstellung von Server- und Client-Zertifikat erforderlich) erstellt:

. ./vars
./clean-all
./build-ca

Bei Ausführung von ./build-ca werden einige Informationen abgefragt, welche entsprechend eurer Daten angegeben werden sollten.
Bis auf den folgenden Eintrag sollten alle Werte bereits durch eure Angaben in der Datei vars passen.

Common Name (eg, your name or your server’s hostname) [7bf CA]:servername.7bf.de

Jetzt wird das Server-Zertifikat durch Aufrufen der folgenden Kommandozeile erstellt:

./build-key-server server

An dieser Stelle werden erneut einige Abfragen erfolgen, von denen wieder einige manuell Beantwortet werden müssen:

Common Name (eg, your name or your server’s hostname) [server]:servername.7bf.de
A challenge password []:   <– MUSS NICHT ANGEGEBEN WERDEN!!
An optional company name []:7bf

Nun erstellen wir die Diffie Hellmann Parameter.
Warum dies erforderlich ist, habe ich leider noch nicht feststellen können, bin aber für jeden Hinweis dankbar :-)

Ich habe nur festgestellt, dass es ohne nicht funktioniert.

./build-dh

Als letztes Zertifikat muss noch ein Client-Zertifikat erstellt werden.
Der Einfachkeit halber nenne ich das hier einmal client1, kann aber jegliche Form von Namen haben (abgesehen von Leer- und Sonderzeichen, da kann es zu Problemen kommen).

./build-key client1

Die Angaben können mit denen des Server-Zertifikates gleichgesetzt werden, bis auf den Common Name, dieser sollte den Namen des Clients (in der Kommandozeile zur Erstellung des Zertifikates angegeben) beinhalten.

Die Zertifikate sind damit erstellt und wurden unter

/usr/share/doc/openvpn/examples/easy-rsa/2.0/keys

abgelegt.

Nun müssen diese noch auf Server- und Client-Seite verfügbar gemacht werden.

Bitte wie folgt verteilen:

ca.crt Server + alle Clients
ca.key nur an der key signing machine
dh{n}.pem Server
server.crt Server
server.key Server
client1.crt Client
client1.key Client

Der Einfachste Weg zur Verteilung ist die Ablage in /etc/openvpn/keys/, da in /etc/openvpn/ auch die Server- bzw. Client-Konfiguration abgelegt wird und damit alles zusammen ist (vereinfacht z.B. ein Backup).

Konfiguration des Servers

Exemplarisch stelle ich hier zwei Server-Konfigurationen bereit, um (wie oben bereits besagt) die Einwahl mit und ohne Zugangsdaten zu verdeutlichen. Abzulegen ist die Konfigurationsdatei nach ihrer Erstellung in /etc/openvpn/. Eine Namensvorgabe gibt es nicht, doch muss die Datei auf .conf enden und wird dann beim starten des OpenVPN-Dienstes automatisch geladen.

Die Konfiguration sieht vor, dass entweder der FQDN (Domain-Name) des Servers angegeben wird, oder eine IP-Adresse. Des weiteren wird ein privates Netzwerk angegeben, welches für die eingewählten VPN-Clients gedacht ist. Dies muss kein Netz sein, dass der Server physisch beherrscht, sondern ein anderes, da der Server ohnehin als Gateway für die Clients fungieren wird. Als DNS-Server übergebe ich zwei von der Universität Paderborn, es können aber auch andere (z.B. ein eigener sein).

Einwahl nur mit Zertifikaten (keine Benutzer-Authentifizierung erforderlich):

user nobody
group nogroup
dev tun
local fqdn_oder_ip_vom_server
port 1194
proto tcp
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
server 192.168.1.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “redirect-gateway”
push “dhcp-option DNS 131.234.137.23″
push “dhcp-option DNS 131.234.137.24″
client-to-client
keepalive 10 120
comp-lzo
persist-tun
persist-key
verb 3
log-append /var/log/openvpn.log
status /var/log/openvpn-status.log

Einwahl mit Zertifikaten und zusätzlicher Benutzer-Authentifizierung (Benutzer-Account auf dem Server):

user nobody
group nogroup
dev tun
local fqdn_oder_ip_vom_server
port 1194
proto tcp
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
server 192.168.1.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “redirect-gateway”
push “dhcp-option DNS 131.234.137.23″
push “dhcp-option DNS 131.234.137.24″
client-to-client
keepalive 10 120
comp-lzo
persist-tun
persist-key
verb 3
log-append /var/log/openvpn.log
status /var/log/openvpn-status.log
plugin /usr/lib/openvpn/openvpn-auth-pam.so common-auth
client-cert-not-required
username-as-common-name

Da es sich bei dem VPN-Netzwerk um ein virtuelles Netzwerk handelt, benötigt der Server auch eine IP-Adresse in diesem Netzwerk. Zu diesem Zweck muss das Kernel-Modul tun geladen werden.
Auf physischen Linux-Servern ist das i.d.R. kein Problem, doch in Xen DomU’s ist normalerweise kein Kernel installiert.
Daher installiert man entweder einen Kernel inkl. Module oder kopiert sich einfach die Module der Xen Dom0 (Host-System der Xen-Maschine):

scp root@xen-dom0-name:/lib/modules/$(uname -r) /lib/modules/$(uname -r)

Darauf folgende kann auch das entsprechende Modul geladen werden:

modprobe tun

Der Server soll als Gateway fungieren, daher wird noch IP-Masquerading benötigt. Dazu sind drei Kommandozeilen erforderlich:

iptables -t nat -F POSTROUTING
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE

Als Netzwerkadresse und Subnetzmaske sind hier wieder jene gefordert, die in der Server-Konfiguration verwendet wurden.

Nun kann der Server-Dienst gestartet werden:

/etc/init.d/openvpn start

Konfiguration des Clients

Auch hier stelle ich zwei Konfigurationsdateien bereit, analog zu den Server-Konfigurationen. Diese sollten ebenfalls unter /etc/openvpn/ abgelegt werden (nur eben auf dem Client). Auch hier gilt als Vorgabe lediglich die Endung .conf zu verwenden.

Einwahl nur mit Zertifikaten (keine Benutzer-Authentifizierung erforderlich):

client
dev tun
proto tcp
remote fqdn_oder_ip_vom_server 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key
comp-lzo
verb 3

Einwahl mit Zertifikaten und zusätzlicher Benutzer-Authentifizierung (Benutzer-Account auf dem Server):

client
dev tun
proto tcp
remote fqdn_oder_ip_vom_server 1194
resolv-retry infinite
nobind
persist-key
persist-tun
auth-user-pass
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key
comp-lzo
verb 3

Auch auf dem Client muss nun das Kernel-Modul tun geladen werden.
In den gängigen Distributionen sollte dies problemlos funktionieren:

modprobe tun

Damit kann die VPN-Einwahl durchgeführt werden:

openvpn /etc/openvpn/client1.conf

Ich verwende den Namen client1 hier nur exemplarisch… ihr habt die Datei selbst angelegt und wisst daher am besten, wie diese Zeile angepasst werden muss.

Bei der Benutzername- und Passwort-Abfrage sind die Daten eines Benutzer-Accounts vom Server gefordert.
Die Einwahl wird zwar auch mit dem root-Login funktionieren, ist jedoch nicht die feine Art. Daher rate ich dazu, einen Benutzer hierfür anzulegen.

Funktionstest

Wenn die Einwahl ohne Fehler funktioniert hat, dann könnt ihr dies noch überprüfen, indem ihr die Webseite http://www.wieistmeineip.de/ besucht. Diese sollte euch nun die öffentliche IP-Adresse eures VPN-Servers anzeigen.

Bei mir hat dies (abgesehen von dem Ubuntu 8.04) mit folgenden Software-Ständen funktioniert:
Linux-Server: openvpn 2.0.9-4etch1
Linux-Client: OpenVPN 2.0.9 i686-pc-linux
Windows-Client: OpenVPN-Portable 2.1_rc7 Win32-MinGW

Ich hoffe, dass ich jemandem mit diesem Howto helfen konnte… und vor allem hoffe ich, dass Madd nun zufrieden ist ;-)

Gruß,
c

Quellenangabe:
Bei meinen Recherchen nach “wie mache ich sowas” bin ich vor geraumer Zeit auf die folgende Seite gestossen, die mir auch bei diesem Howto das Leben erleichtert hat:
http://nodomain.cc/archives/2007/06/30/740-Howto-Rootserver-als-OpenVPN-Gateway-nutzen.html

September 9, 2008

Chroot-Shell /pro User unter Ubuntu 8.04 (Server)

Filed under: Linux, Scripting, ssh — christian @ 16:18

Hi @ll,

da ich endlich mal die Zeit finde, hier noch eine kleine Zusammenfassung der letzten Nacht ;-)

Madd hat in seinem Blog einen entsprechenden Beitrag[1] verfasst, der mir sinnvoll schien.
Darin wies er darauf hin, dass es bereits ein Script[2] gibt, mit dem man ein Chroot-Jail für SSH einfach erstellen und die Benutzer hineinverfrachten kann.
Er hat zwar (ursprünglich) ins Topic geschrieben, dass der Artikel unter Ubuntu 8.04 entstanden wäre, dass war aber nicht richtig… er hat es dann gestern Abend korrigiert, da er das ganze mit Debian/etch umgesetzt hatte.

Das Script hat bei mir unter Ubuntu 8.04 Server (frisch mit debootstrap gebaut) nicht funktioniert. Daraufhin folgten ein paar Modifikationen, damit es funkioniert (es werden zwar noch Fehler geschmissen, dass ist aber egal… es funktioniert trotzdem).

Dann wollte ich aber noch ein Jail pro User!

Also noch ein paar Modifikationen… :-)

Und siehe da… es funktioniert :-)
Wer es nicht glaubt, darf es gerne ausprobieren: make_chroot_jail_mod.sh

Allerdings funktioniert der Aufruf des Scriptes nicht mehr, wie vom Ur-Author vorgesehen…
Getestet ist das Script nur mit:

./make_chroot_jail_mod.sh [i]username[i]

Dabei wird in /home/jail/username ein chroot angelegt. Daraus resultiert allerdings ein Home-Dir /home/jail/username/home/username
Wenn der User sich dann per SSH anmeldet, kann er allerdings nur auf alles unterhalb /home/jail/username zugreifen.

Viel Spass beim ausprobieren :-)

Gruß,
c

P.S.
In dem Script sind alle Änderungen von mir markiert:

# CHB – 20080908 – infotext

[1]: http://blog.sauer.ms/?p=132
[2]: http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/

Update 12.12.2009
Ich habe das Script gerade (vor ein paar Minuten) unter Ubuntu 9.10 laufen lassen… es kommen keine Fehler und das Script macht genau das, was es soll.. :-)
Gruß
c

September 8, 2008

Linux Night :-D

Filed under: just.... — christian @ 20:43

Es ist schon lustig, was man an einem Abend so alles erleben kann :-)
Madd_and_Me
Thx Madd =)

Gruß,
c

Xen Disk-Image vergrößern

Filed under: Linux, Xen — christian @ 20:18

Hi @ll,

schonmal jemand das Problem gehabt, dass das Disk-Image von einem Xen-Gast zu klein geworden ist?

Einmal Google angeschmissen[1] und schon kam das hier dabei raus:

Xen DomU runterfahren und dann wie folgt

cd /xen
dd if=/dev/zero of=tmpfile bs=1024k count=512
cat tmpfile >> try.img
rm -f tmpfile
e2fsck -c try.img
resize2fs -f try.img

Und schon sind 512MB mehr Platz.

Und nach ein paar Überlegungen und einem Testlauf kann ich nun auch sagen, dass es ohne Umweg über tmpfile geht:

cd /xen
dd if=/dev/zero bs=1024k count=512 >> try.img
e2fsck -c try.img
resize2fs -f try.img

Ich gehe hier davon aus, dass das Image try.img ist, in /xen/ liegt und um 512MB erweitert werden soll.

Gruß,
c

[1]: http://www.vinacis.net/content/view/32/32/

Powered by WordPress