t73f.de

Check-in [b61777ea8b]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Format code blocks better
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1:b61777ea8be672f3491e91c1c50704fd3afaf659
User & Date: dkreuz 2016-05-09 17:36:47
Context
2016-05-09
17:39
Format code blocks better, forgot one file check-in: dc0ef8d829 user: dkreuz tags: trunk
17:36
Format code blocks better check-in: b61777ea8b user: dkreuz tags: trunk
17:09
Change fonts check-in: 79573ff486 user: dkreuz tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to assets/static/style.css.

60
61
62
63
64
65
66
67
68
69
70




71
72
73
74
75
76
77
p {
  -webkit-hyphens: auto;
  -moz-hyphens: auto;
  -ms-hyphens: auto;
  hyphens: auto;
}

pre, code {
  font-family: 'Roboto Mono', monospace;
  overflow: auto;
}





b, strong {
  font-weight: bold;
}

i, em, blockquote {
  font-style: italic;







|



>
>
>
>







60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
p {
  -webkit-hyphens: auto;
  -moz-hyphens: auto;
  -ms-hyphens: auto;
  hyphens: auto;
}

div .highlight, pre, code {
  font-family: 'Roboto Mono', monospace;
  overflow: auto;
}
div .highlight {
  border: 1px dashed #acaaa2;
  padding: 0em 1em 0em 1em;
}

b, strong {
  font-weight: bold;
}

i, em, blockquote {
  font-style: italic;

Changes to content/blog/20060505_095618_ruby_python_lisp_scheme/contents.lr.

37
38
39
40
41
42
43

44
45
46
47
48
49
50
language contructs are also syntactically first class constructs. If you have
a variable that contains a reference to a function, you can call the function
as any other function:

```scheme
(function para-1 para-2 ...) ; Scheme
```

```python
function(para1, para2, ...) # Python
```

In Lisp and Ruby, you must use specific language features (function funcall in
Lisp, method call in Ruby). You trade these necessities for easier handling in
ordinary programming. Separate name spaces in Lisp, method call without







>







37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
language contructs are also syntactically first class constructs. If you have
a variable that contains a reference to a function, you can call the function
as any other function:

```scheme
(function para-1 para-2 ...) ; Scheme
```

```python
function(para1, para2, ...) # Python
```

In Lisp and Ruby, you must use specific language features (function funcall in
Lisp, method call in Ruby). You trade these necessities for easier handling in
ordinary programming. Separate name spaces in Lisp, method call without

Changes to content/blog/20110326_120817_personal_trac_installation/contents.lr.

252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
[Favicon](http://de.wikipedia.org/wiki/Favicon) anlegen wollen, müssen Sie die
Konfigurationsdatei `PWM/conf/trac.ini` anpassen. Legen Sie vorher im
Verzeichnis `PWM/htdocs` das gewünschte Logo (z.B. unter `logo.jpg`) und das
Favicon (unter `favicon.ico`) ab. Ändern Sie in der Konfigurationdatei folgende
Abschnitte:

```ini
    [header_logo]
    alt = Logo
    src = site/logo.jpg
```

und

```ini
    [project]
    icon = site/favicon.ico
```

Fertig. Sie brauchen dazu die Instanz nicht einmal beenden und neu starten.

(Kleiner Hinweis: innerhalb von Trac wird der Pfad `site` auf das Verzeichnis
`htdocs` abgebildet.)








|
|
|





|
|







252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
[Favicon](http://de.wikipedia.org/wiki/Favicon) anlegen wollen, müssen Sie die
Konfigurationsdatei `PWM/conf/trac.ini` anpassen. Legen Sie vorher im
Verzeichnis `PWM/htdocs` das gewünschte Logo (z.B. unter `logo.jpg`) und das
Favicon (unter `favicon.ico`) ab. Ändern Sie in der Konfigurationdatei folgende
Abschnitte:

```ini
[header_logo]
alt = Logo
src = site/logo.jpg
```

und

```ini
[project]
icon = site/favicon.ico
```

Fertig. Sie brauchen dazu die Instanz nicht einmal beenden und neu starten.

(Kleiner Hinweis: innerhalb von Trac wird der Pfad `site` auf das Verzeichnis
`htdocs` abgebildet.)

Changes to content/blog/20130305_134931_calibre_server_rpi/contents.lr.

81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
...
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
...
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
...
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
...
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
...
252
253
254
255
256
257
258
259
260
261

Da ich, im Unterschied zum oben genannten Artikel, [Arch
Linux](http://archlinuxarm.org/platforms/armv6/raspberry-pi) nutze, muss ich
andere Befehle zum Installieren von Calibre angeben (ich bin als `root`
angemeldet):

```sh
    pacman -S calibre
```

Das dauert etwas länger, da Calibre jede Menge an abhängigen Paketen benötigt.
Ein Kaffee wäre jetzt angemessen.

Danach lege ich einen eigenen Nutzer für den Dienst an und gebe diesem ein
initiales Passwort.  Den Nutzer benötige ich, um die eBook-Sammlung zu
aktualisieren.

```sh
    useradd -m -g users -s /bin/bash calibre
    passwd calibre
```

Der Nutzer sollte für den SSH-Dienst autorisiert werden.  Da auf meinen System
"explizit ist besser als implizit" gilt, muss ich ihn in der Datei
`/etc/ssh/sshd_config` unter `AllowUser` eintragen.

## Erstkopie der eBook-Sammlung
................................................................................
Arch Linux muss dieser explizit installiert werden, also mit `pacman -S rsync`.

Ich öffne auf meinem Desktoprechner ein Terminal, stelle sicher, dass die
Software Calibre nicht läuft und setze folgenden Befehl ab (`192.168.0.250` sei
die IP-Adresse des Raspberry):

```sh
    rsync -az --delete -e ssh ~/Documents/Calibre/ calibre@192.168.0.250:/home/calibre/library
```

Diesen Befehl merken Sie sich oder, viel besser, sichern ihn als Alias oder
Shell-Skript.  Damit können Sie jederzeit die Daten der eBook-Sammlung
aktualisieren.

Wer nicht jedes Mal das Kennwort eingeben möchte, kann sich gern mit der
................................................................................

## Calibre testen

Als erstes teste ich, ob alles soweit läuft.  Dazu wechsle ich in den Benutzer
`calibre` und probiere aus, ob die Serverkomponente funktioniert:

```sh
    su - calibre
    calibre-server --with-library=/home/calibre/library
```

Nachdem die Serverkomponente gestartet ist (dauert ein wenig bei einer etwas
größeren eBook-Sammlung), kann ich mit meinem Web-Browser prüfen, ob alles
soweit funktioniert.  Ich rufe dazu einfach die Seite
`http://192.168.0.250:8080` auf (die IP-Adresse des RPi).  Sofern alles
geklappt hat, kann ich den Server mit einem beherzten `^C` (Ctrl-C, Strg-C)
................................................................................
Durch die Zeile `User=calibre` läuft die Serverkomponente mit den Rechten des
Benutzers `calibre`, was immer eine gute Idee ist.

Jetzt gilt es, den Dienst zu aktivieren und zu starten.  Das geht mit systemd
ganz einfach:

```sh
    systemctl enable calibre.service
    systemctl start calibre.service
```

Eigentlich wäre ich nun fertig.  Eigentlich.  Aber es gibt einen kleinen Haken.

## Den kleinen Haken beseitigen

Wenn die Serverkomponente gestartet ist und die eBook-Sammlung währenddessen
................................................................................
zugreifen, kann ich ja die Desktopversion nutzen.  Ich brauche nur noch dafür
sorgen, dass die Serverkomponente regelmäßig, z.B. um 3:14 Uhr in der Nacht,
neu gestartet wird.

Dazu gebe ich als Benutzer `root` den Befehl

```sh
    crontab -e
```

ein und erstelle mit dem voreingestellten Editor folgenden Dateiinhalt:

    14 3 * * * /usr/bin/systemctl restart calibre.service

Dies ist zugleich ein Beispiel, wie man mit systemd einen Dienst neu startet.
................................................................................

Fertig.

Für Hinweise, Anregungen, Lob und Kritik bin ich dankbar.  Mangels
[Kommentarsystem](http://www.youtube.com/watch?v=anwy2MPT5RE) gerne via Mail,
Google+, App.net oder Twitter.

Im nächsten Teil zeige ich, wie Sie den Raspberry Pi in ein kleines
Privacy-Device mittels [OpenVPN](http://openvpn.net/index.php/open-source.html)
verwandeln.







|










|
|







 







|







 







|
|







 







|
|







 







|







 







|


81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
...
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
...
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
...
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
...
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
...
252
253
254
255
256
257
258
259
260
261

Da ich, im Unterschied zum oben genannten Artikel, [Arch
Linux](http://archlinuxarm.org/platforms/armv6/raspberry-pi) nutze, muss ich
andere Befehle zum Installieren von Calibre angeben (ich bin als `root`
angemeldet):

```sh
pacman -S calibre
```

Das dauert etwas länger, da Calibre jede Menge an abhängigen Paketen benötigt.
Ein Kaffee wäre jetzt angemessen.

Danach lege ich einen eigenen Nutzer für den Dienst an und gebe diesem ein
initiales Passwort.  Den Nutzer benötige ich, um die eBook-Sammlung zu
aktualisieren.

```sh
useradd -m -g users -s /bin/bash calibre
passwd calibre
```

Der Nutzer sollte für den SSH-Dienst autorisiert werden.  Da auf meinen System
"explizit ist besser als implizit" gilt, muss ich ihn in der Datei
`/etc/ssh/sshd_config` unter `AllowUser` eintragen.

## Erstkopie der eBook-Sammlung
................................................................................
Arch Linux muss dieser explizit installiert werden, also mit `pacman -S rsync`.

Ich öffne auf meinem Desktoprechner ein Terminal, stelle sicher, dass die
Software Calibre nicht läuft und setze folgenden Befehl ab (`192.168.0.250` sei
die IP-Adresse des Raspberry):

```sh
rsync -az --delete -e ssh ~/Documents/Calibre/ calibre@192.168.0.250:/home/calibre/library
```

Diesen Befehl merken Sie sich oder, viel besser, sichern ihn als Alias oder
Shell-Skript.  Damit können Sie jederzeit die Daten der eBook-Sammlung
aktualisieren.

Wer nicht jedes Mal das Kennwort eingeben möchte, kann sich gern mit der
................................................................................

## Calibre testen

Als erstes teste ich, ob alles soweit läuft.  Dazu wechsle ich in den Benutzer
`calibre` und probiere aus, ob die Serverkomponente funktioniert:

```sh
su - calibre
calibre-server --with-library=/home/calibre/library
```

Nachdem die Serverkomponente gestartet ist (dauert ein wenig bei einer etwas
größeren eBook-Sammlung), kann ich mit meinem Web-Browser prüfen, ob alles
soweit funktioniert.  Ich rufe dazu einfach die Seite
`http://192.168.0.250:8080` auf (die IP-Adresse des RPi).  Sofern alles
geklappt hat, kann ich den Server mit einem beherzten `^C` (Ctrl-C, Strg-C)
................................................................................
Durch die Zeile `User=calibre` läuft die Serverkomponente mit den Rechten des
Benutzers `calibre`, was immer eine gute Idee ist.

Jetzt gilt es, den Dienst zu aktivieren und zu starten.  Das geht mit systemd
ganz einfach:

```sh
systemctl enable calibre.service
systemctl start calibre.service
```

Eigentlich wäre ich nun fertig.  Eigentlich.  Aber es gibt einen kleinen Haken.

## Den kleinen Haken beseitigen

Wenn die Serverkomponente gestartet ist und die eBook-Sammlung währenddessen
................................................................................
zugreifen, kann ich ja die Desktopversion nutzen.  Ich brauche nur noch dafür
sorgen, dass die Serverkomponente regelmäßig, z.B. um 3:14 Uhr in der Nacht,
neu gestartet wird.

Dazu gebe ich als Benutzer `root` den Befehl

```sh
crontab -e
```

ein und erstelle mit dem voreingestellten Editor folgenden Dateiinhalt:

    14 3 * * * /usr/bin/systemctl restart calibre.service

Dies ist zugleich ein Beispiel, wie man mit systemd einen Dienst neu startet.
................................................................................

Fertig.

Für Hinweise, Anregungen, Lob und Kritik bin ich dankbar.  Mangels
[Kommentarsystem](http://www.youtube.com/watch?v=anwy2MPT5RE) gerne via Mail,
Google+, App.net oder Twitter.

Im [nächsten Teil](../openvpn_rpi/) zeige ich, wie Sie den Raspberry Pi in ein kleines
Privacy-Device mittels [OpenVPN](http://openvpn.net/index.php/open-source.html)
verwandeln.

Changes to content/blog/20130317_205617_openvpn_rpi/contents.lr.

60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
...
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
...
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
...
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
geben.  Wie das funktioniert, hängt von der Linux-Distribution Ihres RPi ab.
Ich nutze, aus guten Gründen, [Arch Linux].  Für die folgenden Aktionen müssen
Sie als Benutzer `root` angemeldet sein.

Zuerst installieren Sie das Paket `netcfg`:

```sh
    pacman -S netcfg
```

Erstellen Sie die Datei `/etc/network.d/default`:

```sh
    cat <<EOF >/etc/network.d/default
    CONNECTION='ethernet'
    DESCRIPTION='A basic static ethernet connection using iproute'
    INTERFACE='eth0'
    IP='static'
    ADDR='192.168.100.100'
    GATEWAY='192.168.100.1'
    DNS=('8.8.8.8')
    EOF
```

Ersetzen Sie `192.168.100.1` durch die IPv4-Adresse Ihres Routers und `8.8.8.8`
durch die IPv4-Adresse Ihres DNS-Servers.  Zur Not belassen Sie `8.8.8.8`, dann
nutzen Sie Google als DNS-Server.

Unter `/etc/network.d/examples/ethernet-static` finden Sie eine Musterdatei.
Dann müssen Sie evtl. nicht so viel tippen.

Damit diese Konfiguration einen Neustart übersteht, müssen Sie die
Konfiguration aktivieren und den DHCP-Client deaktivieren:

```sh
    systemctl enable netcfg@default
    systemctl disable dhcpcd@eth0
    reboot
```

Melden Sie sich nach dem Neustart wieder beim RPi an und überprüfen Sie, ob die
Änderungen wirksam sind:

```sh
    ifconfig
```

Fertig sind die Vorbereitungen.

## Installation von OpenVPN

[OpenVPN] kann auf zwei Arten betrieben werden:
................................................................................
Der Raspberry Pi unterstützt nur den Routing-Modus, was aber nicht schlimm ist.
Wenn Sie sich über ein Mobilfunknetz ins Heimnetz einwählen wollen, spart der
Routing-Modus einiges an kostbarem Datenvolumen.

Zunächst müssen Sie ein sog. "Tunnel device" einrichten.  Das geht einfach:

```sh
    cat <<EOF >/etc/modules-load.d/tun.conf
    # Load tun.ko at boot
    tun
    EOF
```

Danach installieren Sie OpenVPN:

```sh
    pacman -S openvpn
```

Starten Sie den RPi neu, um zu überprüfen, dass alles soweit in Ordnung ist:

```sh
    reboot
```

Nach dem Neustart überprüfen Sie, ob das Tunnel device eingerichtet ist.  Wenn
Sie 

```sh
    ifconfig
```

eingeben, sollte dort ein Gerät mit Namen `tun0` erscheinen.

## OpenVPN konfigurieren

Der nächste Schritt ist das Einrichten einer Infrastruktur zur sicheren
Verschlüsselung (Public Key Infrastructure, PKI).  Aus Sicherheitsgründen
empfehle ich, dass Sie die entsprechenden Systemdateien nicht direkt verwenden,
sondern diese in einem separaten Verzeichnis verwalten.

```sh
    cp -r /usr/share/openvpn/easy-rsa /root/OpenVPN
    cd /root/OpenVPN
```

Öffnen Sie die Datei `vars` mit einem Editor Ihrer Wahl und ändern Sie die
folgenden Wert:

```sh
    export KEY_COUNTRY="DE"       # Land
    export KEY_PROVINCE="BW"      # Bundesland
    export KEY_CITY="Stadt"
    export KEY_ORG="Organisation"
    export KEY_EMAIL=mail@host.domain
    export KEY_CN=rpi-CA
    export KEY_NAME=rpi-CA
    export KEY_OU=""
    #export PKCS11_MODULE_PATH=changeme
    #export PKCS11_PIN=1234
```

Sollten Sie ein erhöhtes Sicherheitsbedürfnis haben, ändern Sie

```sh
    export KEY_SIZE=2048
```

Speichern Sie die Datei und initialisieren Sie Ihre PKI mit

```sh
    source ./vars
    ./clean-all
    ./build-ca
```

Alle Fragen, die beim letzten Befehl gestellt werden, können Sie mit einem
einfachen Druck auf die Return-Taste beantworten.  Sie haben die Fragen schon
durch Speichern der Datei `vars` beantwortet.

## Daten für den Server erstellen

Im nächsten Schritt müssen Sie die Infrastrukturdateien für den OpenVPN-Server
erstellen.  Dazu führen Sie folgenden Befehl aus:

```sh
    ./build-key-server RPi
```

Sie können `RPi` durch einen anderen Namen ersetzen.

Während die Dateien erzeugt werden, stellt Ihnen das Programm wieder einige
Fragen, die Sie fast alle mit der Return-Taste beantworten können.  Lediglich
bei der Frage, ob Sie das Zertifikat signieren möchten und ob Sie alles
................................................................................
machen Sie weiter, Sie sind ja noch nicht fertig.

Im nächsten Schritt lassen Sie einige Dateien berechnen, so dass Ihr
OpenVPN-Server mit Ihren externen Rechnern sogar in unsicheren Umgebungen
(WLAN-Hotspot) sicher Verschlüsselungsschlüssel austauschen kann:

```sh
    ./build-dh
```

Gehen Sie nun in aller Ruhe Kaffee trinken.  Wenn Sie, wie ich, oben die
`KEY_SIZE` auf den Wert `2048` gesetzt haben, braucht der Raspberry Pi mehr als
30 Minuten, um die notwendigen Daten zu berechnen.

Der nächste Befehl wird wieder schneller ausgeführt.  Er berechnet einen
individuellen Code für den OpenVPN-Server, um diesen vor Angriffen zu schützen.

```sh
    openvpn --genkey --secret /root/OpenVPN/keys/ta.key
```

Hier gilt wieder, das die Datei `ta.key` unter keinen Umständen in fremde Hände
gelangen darf.

## Daten für die externen Rechner erstellen

................................................................................
Mit "externen Rechner" bezeichne ich die Computer, mit denen Sie sich später in
Ihr Heimnetz einwählen wollen.  Aller Wahrscheinlichkeit nach wird das ein
Laptop, ein Smart Phone oder ein Tablet sein.

Für jeden Rechner führen Sie folgenden Befehl aus:

```sh
    ./build-key NAME
```

Für NAME sollten Sie Ihren jeweiligen Namen des externen Rechners angeben.
Wichtig ist, dass Sie die Namen nicht doppelt vergeben.  Ansonsten gibt es
keine Einschränkungen.

## Konfigurationsdateien zusammenführen

Jetzt erstellen Sie ein Verzeichnis, in dem Sie sämtliche Konfigurationsdateien
sammeln, bevor diese dem System bekanntgegeben werden.

```sh
    mkdir /root/OpenVPN/configurations
    cd /root/OpenVPN/configurations
    cp /usr/share/openvpn/examples/server.conf /usr/share/openvpn/examples/client.conf .
    mv server.conf RPi.conf
    mv client.conf NAME.conf
```

Passen Sie nun mit einem Editor die Server-Konfiguration `RPi.conf` an.
Ersetzen Sie folgende Werte:

```sh
    ca /etc/openvpn/ca.crt
    cert /etc/openvpn/RPi.crt
    key /etc/openvpn/RPi.key  # This file should be kept secret
    push "redirect-gateway def1 bypass-dhcp"
    tls-auth /etc/openvpn/ta.key 0 # This file is secret
    push "dhcp-option DNS 8.8.8.8"
```

Wie schon oben besprochen, ersetzen Sie `8.8.8.8` durch die IP-Adresse Ihres
DNS-Servers.  Sofern Sie `KEY_SIZE` auf `2048` gesetzt haben, müssen Sie

```sh
    dh /etc/openvpn/dh2048.pem
```

angeben.  Es kann sich lohnen (experimentieren Sie ein wenig)

```sh
    keepalive 30 360
```

zu setzen.  Dann werden in Surfpausen weniger Datenpakete übertragen, um die
sichere Verbindung aufrecht zu erhalten.

Jetzt ist es endlich an der Zeit, alle relevanten Dateien in das entsprechende
Systemverzeichnis zu kopieren:

```sh
    cp Rpi.conf /etc/openvpn
    cd /root/OpenVPN/keys
    cp ca.crt Rpi.crt Rpi.key dh2048.pem ta.key /etc/openvpn
```

Wenn Sie `KEY_SIZE` auf dem Wert `1024` belassen haben, müssen Sie `dh2048.pem`
durch `dh1024.pem` ersetzen.

Aktivieren Sie OpenVPN, damit es nach einem Neustart gestartet wird:

```sh
    systemctl enable openvpn@Rpi.service
```

## Routing konfigurieren

Im letzten Schritt müssen Sie das Routing konfigurieren, damit die IP-Pakete
immer ihr Ziel finden.

Ändern Sie in der Datei `/etc/sysctl.conf` die Zeile auf den Wert `1`:

```sh
    net.ipv4.ip_forward=1
```

In der Datei `/etc/conf.d/iptables` müssen Sie ebenfalls einen Wert auf `1`
setzen:

```sh
    IPTABLES_FORWARD=1
```

Zum Abschluss müssen Sie eine Regel zum Routing angeben, die Regeln sichern und
aktivieren, sowie den Raspberry Pi neu starten:

```sh
     iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
     iptables-save > /etc/iptables/iptables.rules
     systemctl enable iptables
     reboot
```

## Externe Rechner einrichten

Auf den Computern, mit denen Sie sich in Ihr Heimnetz einwählen wollen, müssen
Sie OpenVPN installieren.








|





|
|
|
|
|
|
|
|
|













|
|
|






|







 







|
|
|
|





|





|






|












|
|






|
|
|
|
|
|
|
|
|
|





|





|
|
|












|







 







|










|







 







|












|
|
|
|
|






|
|
|
|
|
|






|





|









|
|
|








|










|






|






|
|
|
|







60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
...
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
...
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
...
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
geben.  Wie das funktioniert, hängt von der Linux-Distribution Ihres RPi ab.
Ich nutze, aus guten Gründen, [Arch Linux].  Für die folgenden Aktionen müssen
Sie als Benutzer `root` angemeldet sein.

Zuerst installieren Sie das Paket `netcfg`:

```sh
pacman -S netcfg
```

Erstellen Sie die Datei `/etc/network.d/default`:

```sh
cat <<EOF >/etc/network.d/default
CONNECTION='ethernet'
DESCRIPTION='A basic static ethernet connection using iproute'
INTERFACE='eth0'
IP='static'
ADDR='192.168.100.100'
GATEWAY='192.168.100.1'
DNS=('8.8.8.8')
EOF
```

Ersetzen Sie `192.168.100.1` durch die IPv4-Adresse Ihres Routers und `8.8.8.8`
durch die IPv4-Adresse Ihres DNS-Servers.  Zur Not belassen Sie `8.8.8.8`, dann
nutzen Sie Google als DNS-Server.

Unter `/etc/network.d/examples/ethernet-static` finden Sie eine Musterdatei.
Dann müssen Sie evtl. nicht so viel tippen.

Damit diese Konfiguration einen Neustart übersteht, müssen Sie die
Konfiguration aktivieren und den DHCP-Client deaktivieren:

```sh
systemctl enable netcfg@default
systemctl disable dhcpcd@eth0
reboot
```

Melden Sie sich nach dem Neustart wieder beim RPi an und überprüfen Sie, ob die
Änderungen wirksam sind:

```sh
ifconfig
```

Fertig sind die Vorbereitungen.

## Installation von OpenVPN

[OpenVPN] kann auf zwei Arten betrieben werden:
................................................................................
Der Raspberry Pi unterstützt nur den Routing-Modus, was aber nicht schlimm ist.
Wenn Sie sich über ein Mobilfunknetz ins Heimnetz einwählen wollen, spart der
Routing-Modus einiges an kostbarem Datenvolumen.

Zunächst müssen Sie ein sog. "Tunnel device" einrichten.  Das geht einfach:

```sh
cat <<EOF >/etc/modules-load.d/tun.conf
# Load tun.ko at boot
tun
EOF
```

Danach installieren Sie OpenVPN:

```sh
pacman -S openvpn
```

Starten Sie den RPi neu, um zu überprüfen, dass alles soweit in Ordnung ist:

```sh
reboot
```

Nach dem Neustart überprüfen Sie, ob das Tunnel device eingerichtet ist.  Wenn
Sie 

```sh
ifconfig
```

eingeben, sollte dort ein Gerät mit Namen `tun0` erscheinen.

## OpenVPN konfigurieren

Der nächste Schritt ist das Einrichten einer Infrastruktur zur sicheren
Verschlüsselung (Public Key Infrastructure, PKI).  Aus Sicherheitsgründen
empfehle ich, dass Sie die entsprechenden Systemdateien nicht direkt verwenden,
sondern diese in einem separaten Verzeichnis verwalten.

```sh
cp -r /usr/share/openvpn/easy-rsa /root/OpenVPN
cd /root/OpenVPN
```

Öffnen Sie die Datei `vars` mit einem Editor Ihrer Wahl und ändern Sie die
folgenden Wert:

```sh
export KEY_COUNTRY="DE"       # Land
export KEY_PROVINCE="BW"      # Bundesland
export KEY_CITY="Stadt"
export KEY_ORG="Organisation"
export KEY_EMAIL=mail@host.domain
export KEY_CN=rpi-CA
export KEY_NAME=rpi-CA
export KEY_OU=""
#export PKCS11_MODULE_PATH=changeme
#export PKCS11_PIN=1234
```

Sollten Sie ein erhöhtes Sicherheitsbedürfnis haben, ändern Sie

```sh
export KEY_SIZE=2048
```

Speichern Sie die Datei und initialisieren Sie Ihre PKI mit

```sh
source ./vars
./clean-all
./build-ca
```

Alle Fragen, die beim letzten Befehl gestellt werden, können Sie mit einem
einfachen Druck auf die Return-Taste beantworten.  Sie haben die Fragen schon
durch Speichern der Datei `vars` beantwortet.

## Daten für den Server erstellen

Im nächsten Schritt müssen Sie die Infrastrukturdateien für den OpenVPN-Server
erstellen.  Dazu führen Sie folgenden Befehl aus:

```sh
./build-key-server RPi
```

Sie können `RPi` durch einen anderen Namen ersetzen.

Während die Dateien erzeugt werden, stellt Ihnen das Programm wieder einige
Fragen, die Sie fast alle mit der Return-Taste beantworten können.  Lediglich
bei der Frage, ob Sie das Zertifikat signieren möchten und ob Sie alles
................................................................................
machen Sie weiter, Sie sind ja noch nicht fertig.

Im nächsten Schritt lassen Sie einige Dateien berechnen, so dass Ihr
OpenVPN-Server mit Ihren externen Rechnern sogar in unsicheren Umgebungen
(WLAN-Hotspot) sicher Verschlüsselungsschlüssel austauschen kann:

```sh
./build-dh
```

Gehen Sie nun in aller Ruhe Kaffee trinken.  Wenn Sie, wie ich, oben die
`KEY_SIZE` auf den Wert `2048` gesetzt haben, braucht der Raspberry Pi mehr als
30 Minuten, um die notwendigen Daten zu berechnen.

Der nächste Befehl wird wieder schneller ausgeführt.  Er berechnet einen
individuellen Code für den OpenVPN-Server, um diesen vor Angriffen zu schützen.

```sh
openvpn --genkey --secret /root/OpenVPN/keys/ta.key
```

Hier gilt wieder, das die Datei `ta.key` unter keinen Umständen in fremde Hände
gelangen darf.

## Daten für die externen Rechner erstellen

................................................................................
Mit "externen Rechner" bezeichne ich die Computer, mit denen Sie sich später in
Ihr Heimnetz einwählen wollen.  Aller Wahrscheinlichkeit nach wird das ein
Laptop, ein Smart Phone oder ein Tablet sein.

Für jeden Rechner führen Sie folgenden Befehl aus:

```sh
./build-key NAME
```

Für NAME sollten Sie Ihren jeweiligen Namen des externen Rechners angeben.
Wichtig ist, dass Sie die Namen nicht doppelt vergeben.  Ansonsten gibt es
keine Einschränkungen.

## Konfigurationsdateien zusammenführen

Jetzt erstellen Sie ein Verzeichnis, in dem Sie sämtliche Konfigurationsdateien
sammeln, bevor diese dem System bekanntgegeben werden.

```sh
mkdir /root/OpenVPN/configurations
cd /root/OpenVPN/configurations
cp /usr/share/openvpn/examples/server.conf /usr/share/openvpn/examples/client.conf .
mv server.conf RPi.conf
mv client.conf NAME.conf
```

Passen Sie nun mit einem Editor die Server-Konfiguration `RPi.conf` an.
Ersetzen Sie folgende Werte:

```sh
ca /etc/openvpn/ca.crt
cert /etc/openvpn/RPi.crt
key /etc/openvpn/RPi.key  # This file should be kept secret
push "redirect-gateway def1 bypass-dhcp"
tls-auth /etc/openvpn/ta.key 0 # This file is secret
push "dhcp-option DNS 8.8.8.8"
```

Wie schon oben besprochen, ersetzen Sie `8.8.8.8` durch die IP-Adresse Ihres
DNS-Servers.  Sofern Sie `KEY_SIZE` auf `2048` gesetzt haben, müssen Sie

```sh
dh /etc/openvpn/dh2048.pem
```

angeben.  Es kann sich lohnen (experimentieren Sie ein wenig)

```sh
keepalive 30 360
```

zu setzen.  Dann werden in Surfpausen weniger Datenpakete übertragen, um die
sichere Verbindung aufrecht zu erhalten.

Jetzt ist es endlich an der Zeit, alle relevanten Dateien in das entsprechende
Systemverzeichnis zu kopieren:

```sh
cp Rpi.conf /etc/openvpn
cd /root/OpenVPN/keys
cp ca.crt Rpi.crt Rpi.key dh2048.pem ta.key /etc/openvpn
```

Wenn Sie `KEY_SIZE` auf dem Wert `1024` belassen haben, müssen Sie `dh2048.pem`
durch `dh1024.pem` ersetzen.

Aktivieren Sie OpenVPN, damit es nach einem Neustart gestartet wird:

```sh
systemctl enable openvpn@Rpi.service
```

## Routing konfigurieren

Im letzten Schritt müssen Sie das Routing konfigurieren, damit die IP-Pakete
immer ihr Ziel finden.

Ändern Sie in der Datei `/etc/sysctl.conf` die Zeile auf den Wert `1`:

```sh
net.ipv4.ip_forward=1
```

In der Datei `/etc/conf.d/iptables` müssen Sie ebenfalls einen Wert auf `1`
setzen:

```sh
IPTABLES_FORWARD=1
```

Zum Abschluss müssen Sie eine Regel zum Routing angeben, die Regeln sichern und
aktivieren, sowie den Raspberry Pi neu starten:

```sh
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables-save > /etc/iptables/iptables.rules
systemctl enable iptables
reboot
```

## Externe Rechner einrichten

Auf den Computern, mit denen Sie sich in Ihr Heimnetz einwählen wollen, müssen
Sie OpenVPN installieren.

Changes to content/blog/20130526_175026_rpi_radio/contents.lr.

36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162

Die Installation von MPD und MPC ist auf dem Raspberry sehr einfach (ich nutze
[Arch Linux](http://archlinuxarm.org/platforms/armv6/raspberry-pi), wer
Raspbian oder eine andere Distribution verwendet, kann das folgende einfach für
sich anpassen):

```sh
    pacman -S mpd mpc
```

MPC ist schon vollständig installiert.  Lediglich MPD muss konfiguriert werden.
Da der MPD nicht für einen bestimmten Benutzer gestartet werden soll, ist eine
systemweite Konfigurationsdatei unter `/etc/mpd.conf` anzulegen.  Ich gebe hier
nur die Abweichungen vom Standard an:

```sh
    music_directory    "/var/lib/mpd/music"
    playlist_directory "/var/lib/mpd/playlists"
    db_file            "/var/lib/mpd/mpd.db"
    pid_file           "/run/mpd/mpd.pid"
    state_file         "/var/lib/mpd/mpdstate"
    user "mpd"
    input {
      plugin "curl"
    }
    input {
      plugin "soup"
    }
    audio_output {
      type		"alsa"
      name		"ALSA"
      device  "hw:0,0"  # optional
    }
    connection_timeout      "60"
    max_connections         "10"
    max_playlist_length     "16384"
    max_command_list_size   "2048"
    max_output_buffer_size  "8192"
    playlist_plugin {
      name    "m3u"
      enabled "true"
    }
    playlist_plugin {
      name	  "pls"
      enabled	"true"
    }
```

Danach sind die relevanten Verzeichnisse anzulegen:

```sh
    mkdir -p /var/lib/mpd/music /var/lib/mpd/playlists
```

Sofern nicht vorhanden, muss der Benutzer `mpd` als Mitglied der Gruppe `audio`
hinzugefügt werden:

```sh
    useradd -d/var/lib/mpd -Gaudio -M mpd
```

Nun kann der MPD durch Eingabe des Befehls

```sh
    mpd
```

getestet werden.  Wenn alles soweit funktioniert, wird MPD unter der Steuerung
von [systemd](http://freedesktop.org/wiki/Software/systemd/) ausgeführt.  Das
hat den Vorteil, dass MPD nach einem Neustart des RPi automatisch gestartet
wird.

```sh
    systemctl activate mpd.service
    systemctl start mpd.service
```

Mit Hilfe des Music Player Clients (MPC) kann für die abzuspielenden Streams
der MPD einfach konfiguriert werden.  Für eigene Streams besteht die Aufgabe
darin, die entsprechenden URL's herauszubekommen, zu analysieren und die
"richtigen" Befehle auszuführen.  Hier ist meine Beispieldatei:

```sh
    mpc clear
    mpc load http://www.dradio.de/streaming/dradiowissen_hq_ogg.m3u
    mpc load http://www.dradio.de/streaming/dkultur_hq_ogg.m3u
    mpc load http://www.dradio.de/streaming/dlf_hq_ogg.m3u
    mpc load http://www.ndr.de/resources/metadaten/audio/m3u/ndr2.m3u
    mpc load http://mp3-live.swr3.de/swr3_m.m3u
    mpc load http://live.radio-ton.de/live128.m3u
    mpc load http://streams.br-online.de/bayern3_2.m3u
    mpc del 8
    mpc add http://edge.live.mp3.mdn.newmedia.nacamar.net/klassikradio128/livestream.mp3
    mpc add http://edge.live.mp3.mdn.newmedia.nacamar.net/klassikradiolounge128/livestream.mp3
    mpc add http://edge.live.mp3.mdn.newmedia.nacamar.net/klassikradiomovie128/livestream.mp3
    mpc add http://edge.live.mp3.mdn.newmedia.nacamar.net/klassikradioopera128/livestream.mp3
```

Die meisten Sender liefern ihr Programm per Playlist aus, die aber nur einen
Stream enthält.  Daher der Befehl `mpc load`.  Bayern 3 hat in seine Playlist
zwei Streams mit gleichem Inhalt, aber unterschiedlicher Kodierung aufgenommen.
Ich lösche einen davon.  Sofern das Programm direkt als MP3 ausgeliefert wird,
muss der Befehl `mpc add` genommen werden.

Jetzt muss nur noch der Raspberry Pi angeschlossen werden und mit

```sh
    mpc play 1
```

wird das erste Programm gestartet.  Ich höre DRadio Wissen.  Mit

```sh
    mpc stop
```

wird das Abspielen beendet und

```sh
    mpc current
```

zeigt den aktuellen Stream an.

Einige Besitzer des RPi scheinen Probleme mit dem Audioausgang zu haben.  Ich
kann diese nicht nachvollziehen.  Eine Möglichkeit ist in diesem Fall, auf
einen USB-Soundstick zu wechseln.  Dafür wäre die Konfigurationsdatei







|








|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|





|






|





|








|
|








|
|
|
|
|
|
|
|
|
|
|
|
|











|





|





|







36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162

Die Installation von MPD und MPC ist auf dem Raspberry sehr einfach (ich nutze
[Arch Linux](http://archlinuxarm.org/platforms/armv6/raspberry-pi), wer
Raspbian oder eine andere Distribution verwendet, kann das folgende einfach für
sich anpassen):

```sh
pacman -S mpd mpc
```

MPC ist schon vollständig installiert.  Lediglich MPD muss konfiguriert werden.
Da der MPD nicht für einen bestimmten Benutzer gestartet werden soll, ist eine
systemweite Konfigurationsdatei unter `/etc/mpd.conf` anzulegen.  Ich gebe hier
nur die Abweichungen vom Standard an:

```sh
music_directory    "/var/lib/mpd/music"
playlist_directory "/var/lib/mpd/playlists"
db_file            "/var/lib/mpd/mpd.db"
pid_file           "/run/mpd/mpd.pid"
state_file         "/var/lib/mpd/mpdstate"
user "mpd"
input {
  plugin "curl"
}
input {
  plugin "soup"
}
audio_output {
  type		"alsa"
  name		"ALSA"
  device  "hw:0,0"  # optional
}
connection_timeout      "60"
max_connections         "10"
max_playlist_length     "16384"
max_command_list_size   "2048"
max_output_buffer_size  "8192"
playlist_plugin {
  name    "m3u"
  enabled "true"
}
playlist_plugin {
  name	  "pls"
  enabled	"true"
}
```

Danach sind die relevanten Verzeichnisse anzulegen:

```sh
mkdir -p /var/lib/mpd/music /var/lib/mpd/playlists
```

Sofern nicht vorhanden, muss der Benutzer `mpd` als Mitglied der Gruppe `audio`
hinzugefügt werden:

```sh
useradd -d/var/lib/mpd -Gaudio -M mpd
```

Nun kann der MPD durch Eingabe des Befehls

```sh
mpd
```

getestet werden.  Wenn alles soweit funktioniert, wird MPD unter der Steuerung
von [systemd](http://freedesktop.org/wiki/Software/systemd/) ausgeführt.  Das
hat den Vorteil, dass MPD nach einem Neustart des RPi automatisch gestartet
wird.

```sh
systemctl activate mpd.service
systemctl start mpd.service
```

Mit Hilfe des Music Player Clients (MPC) kann für die abzuspielenden Streams
der MPD einfach konfiguriert werden.  Für eigene Streams besteht die Aufgabe
darin, die entsprechenden URL's herauszubekommen, zu analysieren und die
"richtigen" Befehle auszuführen.  Hier ist meine Beispieldatei:

```sh
mpc clear
mpc load http://www.dradio.de/streaming/dradiowissen_hq_ogg.m3u
mpc load http://www.dradio.de/streaming/dkultur_hq_ogg.m3u
mpc load http://www.dradio.de/streaming/dlf_hq_ogg.m3u
mpc load http://www.ndr.de/resources/metadaten/audio/m3u/ndr2.m3u
mpc load http://mp3-live.swr3.de/swr3_m.m3u
mpc load http://live.radio-ton.de/live128.m3u
mpc load http://streams.br-online.de/bayern3_2.m3u
mpc del 8
mpc add http://edge.live.mp3.mdn.newmedia.nacamar.net/klassikradio128/livestream.mp3
mpc add http://edge.live.mp3.mdn.newmedia.nacamar.net/klassikradiolounge128/livestream.mp3
mpc add http://edge.live.mp3.mdn.newmedia.nacamar.net/klassikradiomovie128/livestream.mp3
mpc add http://edge.live.mp3.mdn.newmedia.nacamar.net/klassikradioopera128/livestream.mp3
```

Die meisten Sender liefern ihr Programm per Playlist aus, die aber nur einen
Stream enthält.  Daher der Befehl `mpc load`.  Bayern 3 hat in seine Playlist
zwei Streams mit gleichem Inhalt, aber unterschiedlicher Kodierung aufgenommen.
Ich lösche einen davon.  Sofern das Programm direkt als MP3 ausgeliefert wird,
muss der Befehl `mpc add` genommen werden.

Jetzt muss nur noch der Raspberry Pi angeschlossen werden und mit

```sh
mpc play 1
```

wird das erste Programm gestartet.  Ich höre DRadio Wissen.  Mit

```sh
mpc stop
```

wird das Abspielen beendet und

```sh
mpc current
```

zeigt den aktuellen Stream an.

Einige Besitzer des RPi scheinen Probleme mit dem Audioausgang zu haben.  Ich
kann diese nicht nachvollziehen.  Eine Möglichkeit ist in diesem Fall, auf
einen USB-Soundstick zu wechseln.  Dafür wäre die Konfigurationsdatei

Changes to content/blog/20160410_180700_heilbronn/contents.lr.

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
categories: privates
---
tags: heilbronn, leben
---
body:

Immer, wenn ich sage, dass ich die ersten 40&nbsp;Jahre meines Lebens in
Hamburg verbracht habe, werde ich gefragt, warum ich denn nun ausgerechnet in
Heilbronn lebe.

Ja, Heilbronn ist Provinz. Von manchen wird Heilbronn auch das "Bielefeld des
Südens" genannt. Im Unterschied zu Bielefeld ist Heilbronn eine der wenigen
Großstädte, in denen aktuell nicht einmal ein Intercity der Bahn hält.
Andere sprechen auch gerne von "Heilbronx", in der Abkürzung HNX, wohl um
auf eine multikulturelle Prägung und/oder sozialen Brennpunkt hinzuweisen.
Heilbronn wird von vielen als hässliche Stadt bezeichnet. In weiten Teilen der







|
|







5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
categories: privates
---
tags: heilbronn, leben
---
body:

Immer, wenn ich sage, dass ich die ersten 40&nbsp;Jahre meines Lebens in
Hamburg verbracht habe, werde ich gefragt, warum ich ausgerechnet in Heilbronn
lebe.

Ja, Heilbronn ist Provinz. Von manchen wird Heilbronn auch das "Bielefeld des
Südens" genannt. Im Unterschied zu Bielefeld ist Heilbronn eine der wenigen
Großstädte, in denen aktuell nicht einmal ein Intercity der Bahn hält.
Andere sprechen auch gerne von "Heilbronx", in der Abkürzung HNX, wohl um
auf eine multikulturelle Prägung und/oder sozialen Brennpunkt hinzuweisen.
Heilbronn wird von vielen als hässliche Stadt bezeichnet. In weiten Teilen der