OpenVPN

Uit V.O.C. Electronics
Ga naar: navigatie, zoeken

Prerequisites

openvpn, pref > 2.2.2-1.el6.rf.x86_64

Lokale configuratie bestanden

Gebruikte configuratie bestand: /etc/openvpn

Voorbeeld configuratie : /usr/share/doc/openvpn-2.2.2/sample-config-files


Configuraties

Default quick config


Server Configuratie

Zet een schone installatie (image) op een SD kaart. Log aan op de Pi. En dit zijn de eerste 3 stappen:

  • sudo apt-get update
  • sudo apt-get upgrade
  • passwd (Change the default password for user pi!!!!!)

Client Configuratie

Windows Client Configuratie

Mac Client Configuratie

OpenVPN server op een Raspberry Pi

Er zijn diverse How-To's te vinden op Internet hoe je een VPN omgeving moet bouwen met een RPI. Zelf heb ik er een gemaakt met: Media: Pivpn.bash
Belangrijk hierbij is dat je een 'schone' installatie van Jessie gebruikt
En niet een waar al spullen (code / etc) al op staan.

Een aantal links naar die Howtos:

Setting Up OpenVPN on a Raspberry Pi 2

PiVPN

Informatie onttrekken uit een ovpn

Een klein bash sciptje dat de CA,crt en meer uit de ovpn haalt zodat je deze los kan importeren daar waar nodig is.

Via Bash

#!/bin/bash
sed '1,/<ca>/d;/<\/ca>/,$d' client.ovpn > ca.crt
sed '1,/<cert>/d;/<\/cert>/,$d' client.ovpn > client.crt
sed '1,/<key>/d;/<\/key>/,$d' client.ovpn > client.key
sed '1,/<tls-auth>/d;/<\/tls-auth>/,$d' client.ovpn > ta.key

Hoe gebruik je het scripje

Zorg er voor dat client.ovpn aangepast wordt naar de naam van de ovpn die je wilt opsplitsen.
Of pas het scripje aan zodat het bestandsnaam wordt ingelezen als input parameter.
Je krijgt in de directory 4 bestanden erbij: ca.crt, client.crt, client.key en ta.kay.
Deze heb je nodig voor de van client.
Soms kan het ook zijn dat je deze plus de ovpn nodig hebt. (Denk aan de linux van client)
Dan moet je nog een kleine modificatie het het ovpn bestand maken nadat je het spil script hebt gebruikt.


If you fancy a mighty C program:

Using C

#include <iostream>
#include <string.h>
#include <stdio.h>
 
using namespace std;
 
int i = 0;
 
string buffer, filename, ca, cert, key, auth;
 
struct _tags { const char* first; const char* last; };
 
const char* files[] = { "ca.crt", "client.crt", "client.key", "ta.key" };
 
_tags tags[] = {
    { "<ca>", "</ca>" },
    { "<cert>", "</cert>" },
    { "<key>", "</key>" },
    { "<tls-auth>", "</tls-auth>" }
};
 
string string_between( string str, const string& from, const string& to ) {
    size_t first = str.find(from);
    size_t last = str.find(to);
    return( str.substr ( first+from.size(),last-first-to.size()));
}
 
int read_file_to_buffer( string filename )
{
    char line[12];
    FILE* pFile = fopen( filename.c_str(), "r" );
    if( pFile != NULL ) {
        while( fgets( line, sizeof( line ), pFile ) ) {
            buffer.append( line );
        }
    } else {
        return 1;
    }
    return 0;
}
 
int write_buffer_to_file( string buffer, string filename )
{
    FILE* pFile = fopen( filename.c_str(), "w" );
    if( pFile != NULL ) {
        fwrite (buffer.c_str(), sizeof(char), buffer.size(), pFile);
        fclose(pFile);
    } else {
        return 1;
    }
    return 0;
}
 
int append_found_tags_to_main( int type )
{
    FILE* pFile = fopen( filename.c_str(), "a+" );
    if( pFile != NULL ) {
        if( type == 1 ) {
            fprintf( pFile, "\nca %s\r\ncert %s\r\nkey %s\r\n",
                files[0], files[1], files[2] );
        } else {
            fprintf( pFile, "\nca %s\r\ncert %s\r\nkey %s\r\ntls-auth %s\r\n",
                files[0], files[1], files[2], files[3] );
        }
        fclose(pFile);
    }
    return 0;
}
 
int extract_tags( )
{
    while (buffer.find(tags[i].first) != std::string::npos ) {
        if( i == 0 ) {
            ca = string_between( buffer, tags[i].first, tags[i].last);
        } else if( i == 1 ) {
            cert = string_between( buffer, tags[i].first, tags[i].last);
        } else if( i == 2 ) {
            key = string_between( buffer, tags[i].first, tags[i].last);
        } else if( i == 3 ) {
            auth = string_between( buffer, tags[i].first, tags[i].last);
        } else {
            return 1;
        }
        i++;
    }
    return 0;
}
 
int write_tags( )
{
    if( !ca.empty() && !cert.empty() && !key.empty() ) {
        write_buffer_to_file( ca, files[0] );
        write_buffer_to_file( cert, files[1] );
        write_buffer_to_file( key, files[2] );
        if( !auth.empty() ) {
            write_buffer_to_file( auth, files[3] );
            append_found_tags_to_main( 0 );
        } else {
            append_found_tags_to_main( 1 );
            return 1;
        }
    } else {
        return 2;
    }
}
 
int main(int argc, char* argv[])
{
    if( argv[1] == NULL ) {
        printf("certgrabber<: You need to specify a valid filename to extract from.\r\n");
        return 1;
    } else {
        if( argv[2] != NULL && argv[3] != NULL && argv[4] != NULL && argv[5] != NULL) {
            files[0] = argv[2];
            files[1] = argv[3];
            files[2] = argv[4];
            files[2] = argv[5];
        }
        filename = argv[1];
    }
    read_file_to_buffer( argv[1] );
    if( buffer.empty()){
        printf("certgrabber<: You need to specify a valid filename to extract from.\r\n");
        return 2;
    }
    if( extract_tags() == 0 ) {
        int result = write_tags();
        if( result == 0 ) {
            printf("certgrabber<: All certificates and keys successfully extracted.\r\n");
        } else if( result == 1 ) {
            printf("certgrabber<: Unable to find a TLS auth key, but this isn't exactly an error.\r\n");
        } else if( result == 2 ) {
            printf("certgrabber<: Something went totally wrong with the certificate files.\r\n");
        }
    } else {
        printf("certgrabber<: Something went wrong while extracting the tags.\r\n");
        return 3;
    }
    return 0;
}

Compilatie & Bouwen:

Hiervoor heb je wel de g++ compiler voor nodig:

sudo apt-get install g++

En dan vanuit een terminal:

g++ -c main.cpp -o main.o \ g++ -o certgrabber main.o 

Nu vind je het programma: 'certgrabber' in de active folder.

Programma gebruikswijze:

Extract to default filenames (ca.crt, client.crt, client.key, tls-auth.key)

./certgrabber settings.ovpn

Extract to custom filenames

./certgrabber settings.ovpn ca-1.crt client-1.crt client-1.key tls-1.key

Externe Links

OpenVPN Quick Howto