Gästblogg: Att sätta upp en VPN-server hemma

Här följer ett gästblogginlägg med ett lite mer avancerat tema, VPN! Även de som inte är så insatta i Linux bör kunna lyckas med detta om man bara följer stegen korrekt.

Med ett ständigt ökande antal enheter på hemmanätverket som man vill kunna komma åt även fast man inte är hemma har jag under en tid letat efter en allsidig lösning.

Att publicera en intern webserver (Apache, Domotics, etc) är ganska enkelt; portforward:a från sin router/firewall till sin webserver på insidan. Klart.

Om man vill addera lite säkerhet kan man använda HTTPS och certifikat (liknande vissa banker erbjuder) – jag har tidigare lagt upp en forumtråd om hur man kan gå tillväga: http://forum.m.nu/post23018.html

Men nu vill jag beskriva hur man kan ta steget fullt ut och sätta upp ett Virtuellt Privat Nätverk, eller en VPN-server, hemma och hur man kan koppla upp sig mot den från jobbet eller internet.

VPNexempel

Med en VPN tunnel får man hög säkerhet och nära nog en fullständig transparens på samma gång; t.ex. kan jag fjärrstyra min Sonos stereoanläggning, se strömmad data från IP-kameror, DLNA enheter, etc. precis som om jag satt uppkopplad på hemmanätet!

För den avancerade innebär detta även möjligheter att se på SVT Play från utlandet; eller varför inte låta en polare i USA sätta upp en tunnel så att du kan köra den amerikanska Netflix-versionen?

Allt detta med hjälp av en c:a 300 kronors hårdvara (Raspberry Pi) och fri mjukvara!

 

Även om det kan se halvenkelt ut i beskrivningen som nu följer kan det uppstå både ett och annat intrikat problem. Jag skall försöka svara på ev. frågor på http://forum.m.nu – men många många bra svar finns redan att hitta på Google… 🙂

För den som vill hitta mer information kan jag tipsa om följande sidor som jag tagit mycket av mina tips från:

https://wiki.debian.org/OpenVPN
https://wiki.debian.org/openvpn%20for%20server%20and%20client
https://openvpn.net/index.php/open-source/documentation/howto.html

 

Det jag nu kommer att beskriva nedan är testat på:

  • OpenVPN-server – Raspberry Pi med Rasbian ”wheezy” (3.12.28+)
  • OpenVPN-klient – Windows 7 Enterprise 64-bitar (2.3.5-I602)

Generellt: konfigurationsfiler editeras enklast med ”nano” – en editor som är inbyggd i Rasbpian. Efter 25 år med UNIX använder jag helst ”vi”-editorn.

$-prompt: kör kommandot som användaren ”pi”
#-prompt: kör kommandot som administratör-användaren ”root” (eller mha ”sudo”).

Om flera rootnivåkommandon skall köras efter varandra kan man göra ”sudo su” och få en permanent root-prompt (#).

  1. Välja VPN-metod och transportsätt: routad eller bryggad, samt TCP eller UDP?
    För den som vill veta mer om de olika alternativen rekommenderar jag att läsa länkarna ovan. Den routade metoden samt UDP rekommenderas för maximal prestanda och enkelhet; jag valde tvärtom, bryggning då det möjliggör styrning av t.ex. Sonos stereon samt TCP som är ett krav ifall man har klienter placerade bakom brandvägg (t.ex. när laptopen är på jobbet).
  2. Nyinstallerad eller uppgraderad Raspbian
    Förmodligen krävs inte detta – men jag listar det för den som så önskar göra.
    Nya Raspbian-images kan man hämta på: http://www.raspberrypi.org/downloads/
    Om du har en äldre Raspbian kan du uppgradera den med:
    $ sudo apt-get update
    $ sudo apt-get upgrade
    $ sudo rpi-update
    Observera att en uppgradering kan ge oönskade effekter – t.ex. fick jag jobba lite för att få igång min 1-wire efter en uppgradering i sommar (sök på forum.m.nu så finner du lätt min tråd och den lösning jag blev tvingad till).
  3. Hämta hem programvaror
    $ sudo apt-get install openvpn bridge-utils
  4. Skapa ethernetbrygga och s.k. OpenVPN TAP-enhet
    Det finns flera alternativ här (skriptad, via /etc/network/interfaces, m.m.) jag valde den jag tyckte såg snyggast ut (hacka i /etc/network/interfaces).
    OBS: För den ovane – gör detta steg via lokalt anslutet tangentbord och monitor; går något snett här blir du med största sannolikhet ”utslängd” och kan inte längre logga in via SSH!
    Jag upptäckte möjligheten att använda en WiFi-sticka för att vid behov skapa en tillfällig ”bakdörr” in i Raspberryn… vilket kräves några gånger kan jag säga… Innehållet i /etc/network/interfaces skall sättas till följande (OBS: byt ut IP-address, nätverksmask samt default gateway i fetstil nedan för att passa ditt hemmanät; även WiFi-delen i fetstil kan utelämnas ifall du inte behöver en bakdörr):
    auto lo br0 eth0
    iface lo inet loopback
    iface br0 inet static
    address 192.168.1.127
    netmask 255.255.255.0
    gateway 192.168.1.1
    bridge_ports eth0 tap0
    pre-up openvpn --mktun --dev tap0
    post-down openvpn --rmtun --dev tap0
    allow-hotplug wlan0
    iface wlan0 inet manual
    wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
    iface default inet dhcp

    Starta om Raspberryn och verifiera att ifconfig-kommandot nu rapporterar följande fyra ethernetdevice:
    $ ifconfig
    br0
    eth0
    lo
    tap0
  5. Sätt upp en publik nyckel kryptoinfrastruktur (PKI)
    Detta är avancerat men går relativt smärtfritt med easy-rsa skriptet som medföljer OpenVPN. Notera att ”#”-prompten innebär att du skall ha gjort ”sudo su” för att köra detta kommando som ”superuser”:
    $ cd /etc/openvpn
    $ sudo su
    # mkdir /etc/openvpn/easy-rsa
    # cp -ai /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa
    # cd /etc/openvpn/easy-rsa
    # nano /etc/openvpn/easy-rsa/vars

    Redigera avsnittet där diverse namn sätts på certifikaten; i princip kan vad som helst kan anges här.
    export KEY_COUNTRY="SE"
    export KEY_PROVINCE="A"
    export KEY_CITY="Storstan"
    export KEY_ORG="MittVPN"
    export KEY_EMAIL="vaduvill@vemsomhelst"
    export KEY_CN=VPNServer
    export KEY_NAME=VPNAdmin
    export KEY_OU=VadSomHelst

    Nu skall en hel radda med skript köras som superuser – svara med standardvärden på frågorna som ställs av vissa av skripten.
    # . ./vars
    # ./clean-all
    # ./build-ca
    # ./build-key-server server
    # ./build-dh
    # ./build-key client
    # openvpn --genkey --secret keys/ta.key
  6. Skapa en server-konfigurationsfil för OpenVPN
    Börja med att kopiera och packa upp en medföljande exempelfil.
    # cd /etc/openvpn
    #
     cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
    # gunzip server.conf.gz

    Redigera filen; så här skall den se ut (med kommentarsraderna bortfiltrerade):
    Observera ”poolen” med IP-addresser som klienterna får 192.168.1.10…192.168.1.20 vilket kan behöva anpassas mot det nätverk du har hemma. Adresspoolen får inte vara upptagen av andra enheter.
    port 1194
    proto tcp
    dev tap0
    ca /etc/openvpn/easy-rsa/keys/ca.crt
    cert /etc/openvpn/easy-rsa/keys/server.crt
    key /etc/openvpn/easy-rsa/keys/server.key
    dh /etc/openvpn/easy-rsa/keys/dh1024.pem
    ifconfig-pool-persist ipp.txt
    server-bridge 192.168.1.127 255.255.255.0 192.168.1.10 192.168.1.20
    keepalive 10 120
    tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
    comp-lzo
    user nobody
    group nogroup
    persist-key
    persist-tun
    status openvpn-status.log
    verb 3
  7. Aktivera automatisk start av OpenVPN vid reboot
    Redigera filen /etc/default/openvpn och ändra raden AUTOSTART till att se ut så här:
    AUTOSTART="all"
  8. Aktivera IP-forwarding i Linux-kärnan
    Redigera filen /etc/sysctl.conf, och ta bort kommentartecknet först på raden med net.ipv4.ip_forward till att se ut så här:
    net.ipv4.ip_forward = 1

    Inställningen gäller efter omstart, men vill du slå på den direkt kör detta kommando:
    # echo 1 > /proc/sys/net/ipv4/ip_forward
  9. Starta OpenVPN server
    $ sudo service openvpn start
    [ ok ] Starting virtual private network daemon: server.

    Ta sedan en koll i /var/log/daemon.log och se om det gick bra
    ...
    Nov 19 23:46:58 rpi5 ovpn-server[5063]: Listening for incoming TCP connection on
    ...
    Nov 19 23:46:58 rpi5 ovpn-server[5063]: Initialization Sequence Completed
  10. Installera och förbered VPN klient
    Windows-klienten kan laddas ned från följande länk:
    https://openvpn.net/index.php/open-source/downloads.html
    Följande filer måste flyttas från /etc/openvpn/easy-rsa/keys på servern till C:\Program Files\OpenVPN\config på klienten (t.ex. med en USB-sticka eller psftp;tänk bara på att du handskas med hemligheter som i orätta händer gör att ditt VPN kan brukas av obehöriga!):
    – ca.crt
    – client.crt
    – client.key
    – ta.key
    Kopiera filen C:\Program Files\OpenVPN\sample-config\client.ovpn till C:\Program Files\OpenVPN\config och öppna den med t.ex. Notepad.Följande inställningar måste göras för att matcha det vi ställt in på serversidan (t.ex. bridge + TCP). De rader jag listar nedan måste justeras – övriga borde kunna lämnas med standardvärde. Semikolon (;) eller brädgård (#) kan användas för att kommentera (deaktivera) en rad.
    dev tap
    ;dev-node tap-adapterns-device-namn-i-windows*. Exempel följer:
    dev-node TAP-adapter
    proto tcp
    ;remote din-externa-ip-address-eller-hostnamn-hos-DynDNS-etc valfritt-portnummer*. Exempel följer:
    remote flyvert.telia-bredband.se 55555
    ca ca.crt
    cert client.crt
    key client.key
    tls-auth ta.key 1
    *) På en nyinstallerad OpenVPN klient brukar TAP-adaptern heta ”Local Area Connection x”; jag döpte om den under Control Panel\Network and Internet\Network Connections till TAP-adapter för att lätt hålla reda på den.
    *) Skaffa gärna en DynDNS tjänst eller liknande hos dyndns.org, noip.com, etc. för att slippa skriva in en statisk IP-adress som i princip närsomhelst kan ändras av din ISP. Personligen brukar jag inte exponera standardportnummer (80, 443, etc) på Internet för att bli kvitt de enklaste ”inbrottstjuvarna”. Här har jag valt 55555 men det går bra med i princip vad som helst som är ledigt och inom tillåtna gränser.
  11. Portforwadera den valda externa porten (tex. 55555) till din Raspberrys interna IP-address och port 1194
    Hur detta exakt går till beror på vilken router/brandvägg du har hemma. På Cisco-Linksys finns portforwardingen under Security->Apps and Gaming->Single Port Forwarding. Tänk på att bara välja det aktuella protokollet (i detta fall TCP).
  12. Koppla upp din VPN-klientdator på Internet (men inte från hemmet/VPN-serverns anslutning)
    T.ex. aktivera ”Internet Connection Sharing” i din mobiltelefon och koppla upp laptopen på Internet via den istället för via hemma WiFi:t/kopparkabeln.
  13. Gör ett anslutningsförsök!
    Starta OpenVPN-programmet (ny ikon visas i system tray). Högerklicka och välj ”Connect”.
    Går allt vägen kommer OpenVPN att slänga upp ett fönster som loggar inloggningsförfarandet, sen stängs loggen och följande bubbla poppar upp i systemfältet på VPN-klienten:
    Klient ansluten
  14. Troligen kommer du att behöva studera loggfilen (högerklick View Log) och korrigera ett och annat. Men med lite itererande borde du kunna ansluta till din nya VPN server! Eventuellt kan Windows Firewall behöva justeras, men för mig fungerade det fint ”trots” att företagets McAfee var aktivt.
  15. Fungerar allt skall du nu kunna kommunicera med ditt hemmanätverks enheter precis som om du satt hemma! 🙂

Sen kan du försöka att koppla upp dig från bakom jobbets brandvägg (det var ju trots allt det som gjorde att vi valde TCP).

Har jag förstått instruktionerna rätt kan OpenVPN köra många parallella instanser samtidigt, t.ex. kan du köra ytterligare en instans (med en egen server.conf fil, t.ex serverUDPinRoutedMode.conf) ifall du vill tillåta uppkoppling från en iPad eller iPhone (det finns OpenVPN appar till dessa och troligen även Android). Nya användare kan du enkelt skapa med easy-rsa skriptet ”build-key client”.

/flyvert

 

2 reaktioner på ”Gästblogg: Att sätta upp en VPN-server hemma”

  1. Helt underbart komplext! Själv kör jag sedan några år Windows inbyggda VPN-server som bara behövde några musklick för att komma igång. Den använder jag från iPhone, iPad och bärbar dator när jag inte är hemma.

Kommentera