Potsdam-VPN

Aus Freifunk Potsdam | Wiki
Version vom 10. Juli 2017, 13:13 Uhr von Seth0r (Diskussion | Beiträge) (Client konfiguration eingefügt)
Zur Navigation springen Zur Suche springen

Das Potsdam-VPN ist ein Intra-City-VPN, das dazu dient, Inseln zusammenzuführen.

Client einrichten

Zertifikat beantragen

Es gibt noch kein automatisiertes Verfahren, vorerst eine Mail mit Routernamen an sven.reissland@freifunk-potsdam.de.

Potsdam-VPN auf Router einrichten

  • Unter Services/OpenVPN eine neue "Client configuration for an ethernet bridge VPN" namens "pdmvpn" anlegen.

VPN anlegen

  • auf "Switch to advanced configuration" klicken
  • unter Networking folgende Einstellungen vornehmen. Einige Felder müssen zuerst hinzugefügt werden.
    • port: 1195
    • dev: pdmvpn
    • devtype: tap
    • comp_lzo: no
  • unter VPN folgende Einstellungen vornehmen.
    • remote: vpn.freifunk-potsdam.de
  • unter Cryptography folgende Einstellungen vornehmen. Einige Felder müssen zuerst hinzugefügt werden.
    • cipher: none
    • ca: ca.crt hochladen
    • cert: $client$.crt hochladen
    • key: $client$.key hochladen
  • Speichern & Anwenden
  • unter Services/OpenVPN das pdmvpn aktivieren und starten.
  • Unter Networking/Interfaces ein neues Interface names PDMVPN anlegen.
    • Protocoll ist Unmanaged oder Ignoriert
    • als Device das soeben eingerichtete device "pdmvpn" auswählen.
  • das neue Interface der Firewallgruppe Freifunk hinzufügen
  • unter Services/OLSR IPv4 das PDMVPN Interface hinzufügen
    • Modus: ether

Server aufsetzen

Keys generieren

Easy-RSA config

  • vim vars
export EASY_RSA="`pwd`"
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"

export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`

export KEY_DIR="$EASY_RSA/keys"

# Issue rm -rf warning
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR

export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"

export KEY_SIZE=2048

export CA_EXPIRE=10950

export KEY_EXPIRE=3660

export KEY_COUNTRY="DE"
export KEY_PROVINCE="BRB"
export KEY_CITY="Potsdam"
export KEY_ORG="Freifunk Potsdam e.V."
export KEY_EMAIL="info@freifunk-potsdam.de"
export KEY_CN=
export KEY_NAME=

CA Zertifikat, CA Key und DH Parameter erzeugen

. vars
./build-ca
./build-dh

Server Zertifikat und Server Key erzeugen

. vars
./build-key-server $server name$

client Zertifikat und Client Key erzeugen

. vars
./build-key $client name$

OpenVPN einrichten

  • apt-get install openvpn
  • kopieren von ca.crt, dh2048.pem, $server$.crt, $server$.key nach /etc/openvpn/freifunk-potsdam/
  • vim /etc/openvpn/pdmvpn.conf
port 1195
mode server
proto udp
dev tap0

ca /etc/openvpn/freifunk-potsdam/ca.crt
cert /etc/openvpn/freifunk-potsdam/$server$.crt
key /etc/openvpn/freifunk-potsdam/$server$.key
dh /etc/openvpn/freifunk-potsdam/dh2048.pem

server 172.22.25X.0 255.255.255.0

client-config-dir /etc/openvpn/ccd

topology subnet

keepalive 60 240

comp-lzo no
cipher none

user nobody
group nogroup

persist-key
persist-tun

log         /var/log/openvpn-pdmvpn-1195.log
log-append  /var/log/openvpn-pdmvpn-1195.log

verb 3
  • OpenVPN starten / aktivieren

SystemD

systemctl start openvpn@pdmvpn.service
systemctl enable openvpn@pdmvpn.service

SysVinit

/etc/init.d/openvpn start pdmvpn

N2N für Server-zu-Server Kommunikation

mit N2N bilden wir ein P2P-VPN zwischen den verschiedenen Servern

  • apt-get install n2n
  • eine Supernode wird benötigt, um eine initiale Verbindung zum P2P-VPN herzustellen (monitor.freifunk-potsdam.de)
supernode -l 7654
  • Verbindung zum P2P-VPN herstellen
N2N_KEY="***key***" edge -b -r -p 7655 -f -d n2n0 -c pdmvpn -u 99 -g 99 -m CA:FF:EE:BA:BE:0X -a 172.22.250.X -l vpn.freifunk-potsdam.de:7654

OLSR kompilieren und installieren

  1. apt-get install git build-essential bison flex libgps-dev
  2. git clone -b drophna_plugin https://github.com/seth0r/olsrd.git
  3. cd olsrd/
  4. make && make libs && make install && make libs_install
  5. cd lib/drophna/
  6. make && make install
  7. vim /etc/olsrd/olsrd.conf
RtTable         111
RtTableDefault  112

#RtTableTunnel   113
#RtTableTunnelPriority 100000
SmartGateway no
SmartGatewayUplink "none"

DebugLevel      0

Interface "tap0"
{
   Mode    "ether"
   Ip4Broadcast                255.255.255.255
   LinkQualityMult             default 0.25

   HelloInterval               3.0
   HelloValidityTime           125.0
   TcInterval                  2.0
   TcValidityTime              500.0
   MidInterval                 25.0
   MidValidityTime             500.0
   HnaInterval                 10.0
   HnaValidityTime             125.0
}

Interface "n2n0"
{
   Mode    "ether"
   Ip4Broadcast                255.255.255.255
   LinkQualityMult             default 1.0

   HelloInterval               3.0
   HelloValidityTime           125.0
   TcInterval                  2.0
   TcValidityTime              500.0
   MidInterval                 25.0
   MidValidityTime             500.0
   HnaInterval                 10.0
   HnaValidityTime             125.0
}

Hna4
{
   172.22.250.0    255.255.255.0
   172.22.25X.0    255.255.255.0
}

LinkQualityFishEye 1
LinkQualityAlgorithm "etx_ffeth"
IpVersion       4
ClearScreen     yes
AllowNoInt      yes
Willingness     3
UseHysteresis   no
LinkQualityLevel        2
Pollrate        0.1
TcRedundancy    2
MprCoverage     5

LoadPlugin "olsrd_jsoninfo.so.1.1"
{
       PlParam "Port" "8080"
}

LoadPlugin "olsrd_nameservice.so.0.4"
{
   PlParam "name" "pdmvpnX"
   PlParam "suffix" ".olsr"
   PlParam "hosts-file" "/tmp/hosts.olsr"
}

LoadPlugin "olsrd_drophna.so.0.0.0"
{
}

Routing und Firewall

  • apt-get install iproute iptables-persistent
  • vim /etc/iproute2/rt_tables
110     pdmvpn
111     olsr
112     olsr-default
113     olsr-tunnel
  • Forwarding aktivieren (wird nach Neustart aktiv)
    vim /etc/sysctl.conf
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.tcp_syncookies=1
net.ipv4.ip_forward=1
  • iptables chains anlegen
iptabels -N INFF
iptables -N FF
  • iptables rules einrichten
iptables -A INPUT -i tap0 -j INFF
iptables -A INPUT -i n2n0 -j INFF

iptables -A INFF -p udp -m udp --dport 698 -j ACCEPT
iptables -A INFF -p icmp -j ACCEPT
iptables -A INFF -j LOG
iptables -A INFF -j DROP

iptables -A FORWARD -i tap0 -j FF
iptables -A FORWARD -i n2n0 -j FF
iptables -A FF -o tap0 -j ACCEPT
iptables -A FF -o n2n0 -j ACCEPT

iptables -A INPUT -p udp -m udp --dport 1195 -j ACCEPT
#iptables -A INPUT -p udp -m udp --dport 7654 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 7655 -j ACCEPT
  • iptables speichern
iptables-save > /etc/iptables/rules.v4

Autostart script

#!/bin/bash

ip rule del prio 32000
ip rule del prio 100000

#killall supernode 2> /dev/null
#supernode -l 7654 > /var/log/supernode.log 2>&1 &

killall edge 2> /dev/null
N2N_KEY="***key***" edge -b -r -p 7655 -f -d n2n0 -c pdmvpn -u 99 -g 99 -m CA:FF:EE:BA:BE:0X -a 172.22.250.X -l monitor.freifunk-potsdam.de:7654

for dev in tap0 n2n0; do
    for prio in 1000 2000 3000 4000 5000; do
        ip rule del iif $dev prio $prio
    done
    ip rule add iif $dev prio 1000 table olsr
    ip rule add iif $dev prio 2000 table olsr-tunnel
    ip rule add iif $dev prio 3000 table olsr-default
    ip rule add iif $dev prio 4000 table pdmvpn
    ip rule add iif $dev prio 5000 unreachable
done

ip rule add prio 32000 table olsr

ip route flush table pdmvpn
ip route add 172.22.25X.0/24 dev tap0 table pdmvpn
ip route add 172.22.250.0/24 dev n2n0 table pdmvpn

killall olsrd 2> /dev/null
/usr/local/sbin/olsrd -f /etc/olsrd/olsrd.conf