{{anachronistisch}}
[[Kategorie:Projekt]]

Es gibt ein ChaosVPN mit OpenVPN, BGP, ... Details unter [http://wiki.diac24.net/ wiki.diac24.net]. Interessenten bei [[Benutzer:toidinamai|toidinamai]] melden!

'''Update:''' das Projekt wird von den coolen Bremern gerade unter http://dn42.net/ wiederbelebt.

=Mitmachen=

==Vorbereitung==

# Gucken, welcher Rechner der eigene Router sein soll
# Folgende Programme sollten dort installiert sein:
#* [http://openvpn.net/ OpenVPN] zum Tunneln ('''''tun'''tap''-Support im Betriebssystem wird benötigt)
#* [http://quagga.net/ Quagga] mit ''zebra'' und ''bgpd''
# Netznummer von [[toidinamai]] (oder [[Benutzer:Astro|Astro]]) holen
#* ChaosVPN hat die Nummern ''64..127'' vom DIAC24-Projekt erhalten
#* AS-Nummer ist dann ''64600+n''
#* Eigenes Netz ist dann bspw. ''172.22.n.0/24'' (wir wollen sparsam sein)
# Ein oder zwei erste Tunnelpartner suchen (z.B. [[toidinamai]] oder in ''irc.spaceboyz.net #spaceboyz'' fragen)

==Tunneln==

Wenn zwei Teilnehmer nicht direkt verbunden sind, dann muss ein ''virtuelles Netzwerk'' über einen Tunnel hergestellt werden. Das geht zum Beispiel per ''GRE'' oder ''OpenVPN''.

===OpenVPN P2P===

====Schlüssel erzeugen====
'''Einer''' erzeugt einen OpenVPN-Schlüssel, für den Tunnel zwischen Nummer 16 und 104 bspw.:
 openvpn --genkey --secret dc16-dc104.key
Dieser muss dem Partner gegeben werden, denn beide verwenden für den Tunnel zwischen ihnen den selben Key.

====Config anlegen====
Das sind nur ungefähre Richtlinien:
<pre>mode p2p                                       # Peer-to-peer-Modus
remote shnifti.dyndns.org                      # Peer-Adresse, kann auch (Dyn)DNS sein wenn nicht statisch
lport 2399                                     # Lokaler Port
rport 2301                                     # Remote-Port
proto udp                                      # ...über UDP
dev-type tun
dev tun104                                     # Interfacename, darf unter Linux beliebig sein
tun-ipv6                                       # Wir wollen IPv6 können
comp-lzo                                       # Komprimierung
cd /usr/local/etc/openvpn                      # Hier finden wir den Key
secret dc16-dc104.key                          # Name des Keys
user nobody                                    # Unter diesen Rechten soll OpenVPN laufen
group nobody                                   # ...dito
persist-key                                    # Bei Verbindungsabbruch Key nicht vergessen
persist-tun                                    # Bei Verbindungsabbruch Interface dalassen
status /var/log/openvpn-status-dc104.log
log-append /var/log/openvpn-dc104.log
verb 1                                         # Verbosity
ifconfig 172.22.16.1 172.22.104.1              # Adresseinstellung lokal-remote *im* Tunnel
</pre>

====Config des Partners====
<pre>mode p2p					# P2P Modus
lport 2300					# Localer Port
rport 2304					# Remote Port - Astros Port
dev-type tun	
dev tun16
tun-ipv6					# IP Version 6 wird verwendet
comp-lzo					# Komprimierung
cd /etc/openvpn					# Ort des Keys
secret vpn_astro.key				# Name des Keys
user guest					# Rechte für Open Vpn
group guest					# guest
persist-key					# merkt sich den key bei Verbindungsabbruch
persist-tun					# lässt das Interface da bei Verbindungsabbruch
status /var/log/openvp0n_status_astro.log		
log-append /var/log/openvpn_astro.log
verb 1						# Verbosity
ifconfig 172.22.104.1 172.22.16.1		# Adresseneinstellung local-remote im Tunnel
</pre>

Jetzt steht die Verbindung. Nun muss noch dafür gesorgt werden, dass alle Netze allen bekannt gemacht werden...

===OpenVPN SSL-Server===

Eine Beispielkonfiguration findet sich im Artikel [[C3D2VPN/Cthulhu]].

==Dem Tunnel eine IPv6-Adresse verpassen==
Während das unter *BSD schon automatisch geschieht, muss man das unter Linux manuell tun. Wichtig ist hierbei, dass die Adresse über Monate hin relativ konstant bleibt, da sie bei beiden Peers im '''bgpd''' eingetragen werden muss.

FreeBSD:
 ifconfig tun16 inet6 fe80::dead:beef add
Linux:
 ip -6 addr add fe80::dead:beef dev tun16

'''Wichtig:''' die Peers sollten pro Tunnel ''verschiedene'' Adressen verwenden.

''fe80::''-Adressen sind im übrigen ''Link-local'', haben also nur für das jeweilige Interface Gültigkeit.

==BGP-Peering==

===zebra konfigurieren===
'''zebra''' bildet die Schnittstelle zwischen den Quagga-Routingdaemonen und dem Betriebssystem. Weiterhin kann man noch die (statische) Adresskonfiguration der Interfaces darüber machen, aber vielleicht will man das lieber von seiner Distribution gemacht haben.

====Eine minimale /usr/local/etc/quagga/zebra.conf====
<pre>hostname shniftimachine
password superstrenggeheimespasswort</pre>

====Testen====

Dann den Daemon starten:
 zebra -df /usr/local/etc/quagga/zebra.conf

Der Daemon öffnet einen Port, über den man ihn konfigurieren kann. Bei Gelegenheit wegfirewallen.
Jetzt kann getestet werden:
<pre>% telnet localhost 2601
Trying ::1...
Connected to localhost.
Escape character is '^]'.

Hello, this is Quagga (version 0.98.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.


User Access Verification

Password: 
ISP> sh
ISP> show int
ISP> show interface tun99
Interface tun99 is up, line protocol detection is disabled
  index 12 metric 1 mtu 1500 <UP,POINTOPOINT,RUNNING,MULTICAST>
  inet6 fe80::250:bfff:fe41:5e57/64 pointopoint ::
  inet 172.22.16.1/32 pointopoint 172.22.99.1
    input packets 371, bytes 59096, dropped 0, multicast packets 0
    input errors 0
    output packets 448, bytes 38804, multicast packets 4
    output errors 0
    collisions 0
ISP> </pre>

===bgpd konfigurieren===
'''bgpd''' wird uns dienen, mit unseren ''Nachbarn'' Routen auszutauschen.

====Eine minimale /usr/local/etc/quagga/bgpd.conf====
Genau wie zebra:
<pre>hostname shniftimachine-BGP
password superstrenggeheimespasswort</pre>

====Konfigurieren====

Dann den Daemon starten:
 bgpd -df /usr/local/etc/quagga/bgpd.conf

Dieser hat ebenfalls ein Telnet-Interface, diesmal auf Port '''2605'''.
<pre>% telnet ::1 2605
Trying ::1...
Connected to localhost.
Escape character is '^]'.

Hello, this is Quagga (version 0.98.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.


User Access Verification

Password: 
ISP-bgp> </pre>

====bgpd konfigurieren====
Befinden wir uns nun einmal auf der Shell des '''bgpd''', können wir loslegen.

Um Dinge zu ändern, müssen wir in den '''Enable mode''' kommen:
 enable

Jetzt kommen wir zur Konfiguration:
 configure terminal

Wir bauen unseren Router (deine Netzwerknummer '''n''' ist hier fett geschrieben, dringendst selbst anpassen!):
 router bgp 64'''704'''

Jeder Router benötigt eine eindeutige Router-ID. Dieser Anforderung kommt die IP-Adresse nach:
 bgp router-id 172.22.'''104'''.1

Jetzt unser Netzwerk, das wir von uns selbst advertisen wollen:
 network 172.22.'''104'''.0/24

Nun konfigurieren wir den Nachbarn anhand seiner IPv6-Adresse auf dem Tunnel. Zuerst die AS-Nummer vom Peer:
 neighbor fe80::cafe:babe remote-as 64'''616'''
Interface einstellen:
 neighbor fe80::cafe:babe interface '''tun16'''
Eine weitere Option für's Verhalten:
 neighbor fe80::cafe:babe soft-reconfiguration inbound
Eine Beschreibung zum Wiedererkennen (frei wählbar):
 neighbor fe80::cafe:babe description '''Astro'''

Jetzt noch IPv6 ähnlich oben anschalten:
 address-family ipv6
 network 2001:6f8:13db:doof::/64
 neighbor fe80::250:bfff:fe41:5e57 activate
 neighbor fe80::250:bfff:fe41:5e57 soft-reconfiguration inbound

====Testen====

Übersicht über '''neighbors''':
<pre>blackhole# show bgp neighbors
BGP neighbor is fe80::1337, remote AS 64708, local AS 64699, external link
 Description: nulli 
  BGP version 4, remote router ID 172.22.108.1
  BGP state = Established, up for 00:04:48
  Last read 00:00:48, hold time is 180, keepalive interval is 60 seconds
  Neighbor capabilities:
    Route refresh: advertised and received(old & new)
    Address family IPv4 Unicast: advertised and received
    Address family IPv6 Unicast: advertised and received
  Received 26 messages, 1 notifications, 0 in queue
  Sent 436 messages, 1 notifications, 0 in queue
  Route refresh request: received 1, sent 0
  Minimum time between advertisement runs is 30 seconds

 For address family: IPv4 Unicast
  Inbound soft reconfiguration allowed
  NEXT_HOP is always this router
  Community attribute sent to this neighbor(both)
  Inbound path policy configured
  Incoming update prefix filter list is *diac
  0 accepted prefixes

 For address family: IPv6 Unicast
  Inbound soft reconfiguration allowed
  Community attribute sent to this neighbor(both)
  0 accepted prefixes

  Connections established 3; dropped 2
  Last reset 00:05:07, due to BGP Notification received
Local host: fe80::2c0:26ff:fe88:3705, Local port: 63242
Foreign host: fe80::1337, Foreign port: 179
Nexthop: 172.22.99.1
Nexthop global: fe80::2c0:26ff:fe88:3705
Nexthop local: ::
BGP connection: shared network
Read thread: on  Write thread: off</pre>

Übersicht über akzeptierte IPv4-Prefixes:
<pre>blackhole# show ip bgp
BGP table version is 0, local router ID is 172.22.99.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 172.22.2.0/25    172.22.12.1                            0 64612 64624 64602 i
*> 172.22.12.0/24   172.22.12.1              0             0 64612 i
*> 172.22.13.0/24   172.22.12.1                            0 64612 64613 i
*> 172.22.16.0/23   172.22.12.1                            0 64612 64624 64616 i
*> 172.22.20.0/23   172.22.12.1                            0 64612 64624 64620 i
*> 172.22.24.0/23   172.22.12.1                            0 64612 64624 i
*> 172.22.64.0/28   172.22.12.1                            0 64612 64664 i
*> 172.22.99.0/24   0.0.0.0                  0         32768 i
[...]</pre>

Übersicht über akzeptierte IPv6-Prefixes:
<pre>blackhole# show ipv6 bgp
BGP table version is 0, local router ID is 172.22.99.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 2001:6f8:13db::/64
                    2001:6f8:13db::1
                                             0             0 64612 i
*> 2001:6f8:13db:2342::/64
                    2001:6f8:13db::1
                                                           0 64612 64664 i
*> 2001:6f8:13db:686d::/64
                    2001:6f8:13db::1
                                                           0 64612 64613 i
*> 2001:6f8:13db:686e::/64
                    2001:6f8:13db::1
                                                           0 64612 64613 i
*> 2001:6f8:13db:6f76::/64
                    2001:6f8:13db::1
                                             0             0 64612 i
*> 2001:6f8:13db:a587::/64
                    2001:6f8:13db::1
                                             0             0 64612 i
*> 2001:6f8:13db:c3d2::/64
                    ::                       0         32768 i
[...]</pre>

====Konfiguration speichern====
 write file

==Testen==

===Routen auflisten unter Linux===
====IPv4====
<pre>$ /sbin/ip r
217.160.179.1 dev eth0  scope link
172.23.32.1 dev dc32  proto kernel  scope link  src 172.22.24.1
172.22.12.1 dev dc12  proto kernel  scope link  src 172.22.24.1
172.22.16.1 via 172.22.25.1 dev sbz0  proto zebra  metric 10 equalize
172.22.20.1 dev dc20  proto kernel  scope link  src 172.22.24.1
172.22.26.2 dev dc26  proto kernel  scope link  src 172.22.24.1
172.22.2.22 dev dc2b  proto kernel  scope link  src 172.22.24.1
[...]</pre>

====IPv6====
<pre>$ /sbin/ip -6 r
2001:6f8:13db::/64 via fe80::51a9:b338:f7b7:3801 dev dc12  proto zebra  metric 1024  mtu 1460 advmss 1400
2001:6f8:13db:2342::/64 via fe80::51a9:b338:f7b7:3801 dev dc12  proto zebra  metric 1024  mtu 1460 advmss 1400
2001:6f8:13db:686d::/64 via fe80::51a9:b338:f7b7:3801 dev dc12  proto zebra  metric 1024  mtu 1460 advmss 1400
2001:6f8:13db:686e::/64 via fe80::51a9:b338:f7b7:3801 dev dc12  proto zebra  metric 1024  mtu 1460 advmss 1400
2001:6f8:13db:6f76::/64 via fe80::51a9:b338:f7b7:3801 dev dc12  proto zebra  metric 1024  mtu 1460 advmss 1400
2001:6f8:13db:a587::/64 via fe80::51a9:b338:f7b7:3801 dev dc12  proto zebra  metric 1024  mtu 1460 advmss 1400
2001:6f8:13db:c3d2::/64 via fe80::51a9:b338:f7b7:3801 dev dc12  proto zebra  metric 1024  mtu 1460 advmss 1400
[...]</pre>

===Routen auflisten unter *BSD===
<pre>%netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            213.187.72.7       UGS         0 29886839   tun0
10.0.0.1           10.0.0.2           UH          0       17 tun108
127.0.0.1          127.0.0.1          UH          2    18391    lo0
172.16/12          127.0.0.1          UG1B        0      168    lo0
172.22.2/25        172.22.12.1        UG1         0        0 vpndc1
172.22.12/24       172.22.12.1        UG1         0        0 vpndc1
[...]

Internet6:
Destination                       Gateway                       Flags      Netif Expire
::/96                             ::1                           UGRS        lo0
::1                               ::1                           UH          lo0
::ffff:0.0.0.0/96                 ::1                           UGRS        lo0
2000::/3                          vpndc12                       U1      vpndc12
2001:6f8:13db::/64                fe80::51a9:b338:f7b7:3801%vpndc12 UG1     vpndc12
2001:6f8:13db:2342::/64           fe80::51a9:b338:f7b7:3801%vpndc12 UG1     vpndc12
2001:6f8:13db:686d::/64           fe80::51a9:b338:f7b7:3801%vpndc12 UG1     vpndc12
2001:6f8:13db:686e::/64           fe80::51a9:b338:f7b7:3801%vpndc12 UG1     vpndc12
2001:6f8:13db:6f76::/64           fe80::51a9:b338:f7b7:3801%vpndc12 UG1     vpndc12
2001:6f8:13db:a587::/64           fe80::51a9:b338:f7b7:3801%vpndc12 UG1     vpndc12
2001:6f8:13db:c3d2::/64           link#1                        UC          rl0
2001:6f8:13db:c3d2::1             00:c0:26:88:37:05             UHL         lo0
[...]</pre>

===Traceroute===
====Per IPv4 zu spaceboyz.net====
<pre>% traceroute 172.22.24.1
traceroute to 172.22.24.1 (172.22.24.1), 64 hops max, 40 byte packets
 1  blackhole.hq.c3d2.de (172.22.99.1)  27.120 ms  27.658 ms  25.498 ms
 2  172.22.12.1 (172.22.12.1)  123.404 ms  117.183 ms  119.433 ms
 3  172.22.24.1 (172.22.24.1)  130.592 ms  147.204 ms  147.839 ms</pre>
====Per IPv6 zu spaceboyz.net====
<pre>% traceroute6 spaceboyz.net
traceroute6 to spaceboyz.net (2001:8d8:81:5c0::1) from 2001:6f8:13db:c3d2:290:4bff:fedc:634, 64 hops max, 12 byte packets
 1  2001:6f8:13db:c3d2::1  10.172 ms  4.405 ms  12.979 ms
 2  benkstein.net  97.529 ms  103.208 ms  98.485 ms
 3  sbz.n24.diac24.net  115.576 ms  151.346 ms  115.855 ms</pre>

==Das finale Skript==
<pre><nowiki>openvpn --config .../dc16.conf            # Tunnel starten
# evtl. vorhandene dynamische IPv6-Adressen entfernen
ifconfig tun16 inet6 fe80::dead:beef add  # statische IPv6-Adresse
zebra -df .../zebra.conf                  # Daemonen
bgpd -df .../bgpd.conf                    # starten

echo "Here we go!"
</nowiki></pre>

==Erweiterte BGP-Konfiguration==

===prefix-lists===
Wir filtern eingehende Routen, damit uns nicht jeder Peer den eigenen Traffic umleiten kann (je einmal in der ''router''- und in der ''address-family''-Konfiguration):
 neighbor fe80::f00 prefix-list vpn-in in

Diese Listen müssen auch noch angelegt werden, das geschieht in direkt im ''configure terminal''. Beispielkonfiguration:
<pre><nowiki>ip prefix-list vpn-in seq 10 permit 172.16.0.0/12 ge 16
ip prefix-list vpn-in seq 100 deny 0.0.0.0/0 le 32

ipv6 prefix-list vpn-in seq 10 permit 2000::/3 ge 16
ipv6 prefix-list vpn-in seq 100 deny ::/0 le 128
</nowiki></pre>

===peer-groups===
Bei vielen neighbors kann man sich einige Zeilen durch ''peer-groups'' (könnte man auch "Templates" nennen) sparen. Beispiel:
 neighbor diac peer-group
 neighbor diac soft-reconfiguration inbound
 neighbor diac prefix-list diac-in in
 neighbor diac prefix-list diac-out out
 neighbor hq peer-group
 neighbor hq soft-reconfiguration inbound
 neighbor hq prefix-list diac-in in
 neighbor hq prefix-list diac-out out
 neighbor fe80::ac14:6e01 remote-as 64794
 neighbor fe80::ac14:6e01 peer-group diac
 neighbor fe80::ac14:6e01 interface tun195
 neighbor fe80::dead:beef remote-as 64714
 neighbor fe80::dead:beef peer-group diac
 neighbor fe80::dead:beef interface tun114
 neighbor fe80::20f:66ff:fec8:6964 remote-as 64699
 neighbor fe80::20f:66ff:fec8:6964 peer-group hq
 neighbor fe80::20f:66ff:fec8:6964 interface rl0
 neighbor fe80::280:48ff:fec2:f2b5 remote-as 64699
 neighbor fe80::280:48ff:fec2:f2b5 peer-group hq
 neighbor fe80::280:48ff:fec2:f2b5 interface rl0
 
 address-family ipv6
 neighbor diac activate
 neighbor diac soft-reconfiguration inbound
 neighbor diac prefix-list diac-in in
 neighbor diac prefix-list diac-out out
 neighbor hq activate
 neighbor hq soft-reconfiguration inbound
 neighbor hq prefix-list diac-in in
 neighbor hq prefix-list diac-out out
 neighbor fe80::ac14:6e01 peer-group diac
 neighbor fe80::dead:beef peer-group diac
 neighbor fe80::20f:66ff:fec8:6964 peer-group hq
 neighbor fe80::280:48ff:fec2:f2b5 peer-group hq
