Tipps & Tricks: OpenVPN - Double VPN / Cascading

PP Lars

Staff member
Ja moin

da ja öfter mal User nach Double VPN bzw Cascading fragen hab ich das mal Probeweise für Windows hingebaut.
Für Linux sollte das so ziemlich das selbe sein, die batch datei muss durch ein shellscript ersetzt werden, aber sonst müsste das gehen. Wer Lust hat kann das ja mal testen, wenn das zuverlässig funktioniert bau ich das auch in unseren OpenVPN Client ein.



Funktionieren tut das Technisch so:
Ihr habt eine Default Route, 0.0.0.0/0 -->
Wenn OpenVPN startet erkennt es dieses Default Route, und setzt eine neue Route -->
Die sorgt dafür das die Verbindung zum OpenVPN Server immer über euren Router geht, sonst würde die ja nicht funktionieren.
Dann setzt OpenVPN 2 Routen, 0.0.0.0/1 und 128.0.0.1/1 -->
Das sind dann die "neuen" Default Routen, da sie spezifischer sind als die Route auf 0.0.0.0/0 geht danach euer Internet Traffic über die IP

Schief geht das normalerweise wenn man jetzt einen 2. Tunnel startet, da die 2. OpenVPN Verbindung dummerweise die 0.0.0.0/0 Default Route findet, anstatt die 0.0.0.0/1 Routen die der erste Tunnel erzeugt hat.
Was man machen muss ist OpenVPN die Routen nicht selber setzen lassen sondern die durch ein up/down script schicken.
So, jetzt wie man das macht:

Erstens: Startmenu -> TAP-Windows -> Utilities -> "Add a new TAP virtual ethernet adapter" 2x als Administrator ausführen um 2 zusätzlichen TAP adapter anzulegen.


Zweitens: updown.bat mit folgendem Inhalt in den OpenVPN config Order packen:
Code:
REM UP/DOWN Script for cascading VPN
REM be aware that you must add the hop number when starting openvpn!
REM start using openvpn.exe --config config.ovpn --script-security 2 --route remote_host hopnumber_0-4 --up updown.bat --down updown.bat --route-noexec

setlocal enableextensions enabledelayedexpansion

REM Dirty hack to get this values in here
set vpn_server_ip=%route_network_1%  
set hop_id_tmp=%route_netmask_1%  
for /f "tokens=4 delims=." %%G IN ("!hop_id_tmp!") DO set hop_id_tmp1=%%G
for /f "tokens=1 delims= " %%G IN ("!hop_id_tmp1!") DO set hop_id_tmp2=%%G
for /f "tokens=1 delims=    " %%G IN ("!hop_id_tmp2!") DO set hop_id=%%G


IF !script_type! == up GOTO UP
    REM IP DOWN
    if !hop_id! == 1 GOTO DOWN_1
    if !hop_id! == 2 GOTO DOWN_2
    if !hop_id! == 3 GOTO DOWN_3
    if !hop_id! == 4 GOTO DOWN_4

    :DOWN_1
        route delete 0.0.0.0 mask 128.0.0.0 
        route delete 128.0.0.0 mask 128.0.0.0   
        
    :DOWN_2
        for /l %%x in (0, 64, 223) do (
            route delete %%x.0.0.0 mask 192.0.0.0
        ) 
        
    :DOWN_3
        for /l %%x in (0, 32, 223) do (
            route delete %%x.0.0.0 mask 224.0.0.0  
        ) 
        
    :DOWN_4
        for /l %%x in (0, 16, 223) do (
            route delete %%x.0.0.0 mask 240.0.0.0  
        ) 
        GOTO DOWN_DEFAULT

    :DOWN_DEFAULT
        route delete %vpn_server_ip% mask 255.255.255.255
        route delete %ifconfig_local% mask 255.255.255.255        
   
    GOTO DONE
  
  
  
:UP
    REM IP UP
    if !hop_id! == 1 GOTO UP_1
    if !hop_id! == 2 GOTO UP_2
    if !hop_id! == 3 GOTO UP_3
    if !hop_id! == 4 GOTO UP_4
    GOTO DONE
    
    :UP_1
        call:FINDGATEWAY 0.0.0.0
        call:UP_DEFAULT
        route add 0.0.0.0 mask 128.0.0.0 %ifconfig_remote%
        route add 128.0.0.0 mask 128.0.0.0 %ifconfig_remote%  
        GOTO DONE        
    :UP_2  
        call:FINDGATEWAY 128.0.0.0
        call:UP_DEFAULT
        for /l %%x in (0, 64, 223) do (
            route add %%x.0.0.0 mask 192.0.0.0 %ifconfig_remote% 
        )
        GOTO DONE
        
    :UP_3
        call:FINDGATEWAY 192.0.0.0
        call:UP_DEFAULT
        for /l %%x in (0, 32, 223) do (
            route add %%x.0.0.0 mask 224.0.0.0 %ifconfig_remote% 
        )
        GOTO DONE
        
    :UP_4    
        call:FINDGATEWAY 224.0.0.0
        call:UP_DEFAULT
        for /l %%x in (0, 16, 223) do (
            route add %%x.0.0.0 mask 240.0.0.0 %ifconfig_remote% 
        )    
        GOTO DONE

    :UP_DEFAULT
        route add %vpn_server_ip% mask 255.255.255.255 %default_gw%  
        route add %ifconfig_local% mask 255.255.255.255 %ifconfig_remote%
        goto :eof
        
    GOTO DONE
     
:DONE


:FINDGATEWAY 
    set findmask=%~1
    route print -4 | findstr "0.0.0.0"  > hops.file
    set /a linecnt=0
    for /f "delims=" %%i in (hops.file) do (    
        for /f "tokens=1,2,3,4 delims= " %%a in ("%%i") do (
            set ip=%%a
            set netmask=%%b
            set gateway=%%c
            set network=%%d
        )
        if !ip! == 0.0.0.0 (
            if !netmask! == !findmask! (
                set str=empty
                for /f "delims=" %%a in ('echo !network! ^|findstr -r .*\..*\..*\..*') do @set str=%%a
                if NOT !str! == empty (
                    set default_gw=!gateway!
                    goto :eof
                )
            ) 
        )
    )
  goto :eof   


endlocal
endlocal

Drittens: OpenVPN Starten, 3x wenn man lust hat.
openvpn.exe --config Amsterdam2.ovpn --script-security 2 --route remote_host 1 --up updown.bat --down updown.bat --route-noexec --route-nopull
openvpn.exe --config Gigabit-Lu.ovpn --script-security 2 --route remote_host 2 --up updown.bat --down updown.bat --route-noexec --route-nopull
openvpn.exe --config Gigabit-NL.ovpn --script-security 2 --route remote_host 3 --up updown.bat --down updown.bat --route-noexec --route-nopull


Spielt da Vorsichtshalber nur mit rum wenn ihr wisst was ihr tut, das kann eure Routen durcheinander bringen und solchen Sachen.
Falls was schiefgeht als Administrator Startmenu -> TAP-Windows -> Utilities -> "Delete all TAP virtual ethernet adapters" um die TAP adapter zu löschen, und dann wieder Startmenu -> TAP-Windows -> Utilities -> "Add a new TAP virtual ethernet adapter" um einen neuen anzulegen
 
Top