Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Linux] OpenVPN in network namespace starten

Pagina: 1
Acties:

Vraag


  • Jazco2nd
  • Registratie: Augustus 2002
  • Laatst online: 26-11 23:33
Al het onderstaande doe ik op Debian op een Raspberry Pi 2 verbonden met netwerkkabel.

Ik wil graag experimenteren met VPN maar wil dat VPN alleen voor 1 of bepaalde applicaties wordt gebruikt. Al het overige netwerkverkeer moet dus normaal verlopen, niet via VPN.
Na veel gegoogle en uitzoekwerk, lijkt "network namespaces" dé manier om dit op te zetten:
- je creert een aparte namespace, binnen de namespace start je OpenVPN. Vervolgens kan je binnen de namespace de applicatie starten.

De beste methode via network namespace vond ik uiteindelijk hier:
- http://www.naju.se/articles/openvpn-netns.html

maar een iets betere versie staat helemaal onderaan (april 2015) in dit vraagforum:
- http://unix.stackexchange...ic-network-namespace-only

Ik ben echter geen expert en hoezeer ik ook gewoon al die commando's domweg kan uitvoeren, wil ik ze ook graag begrijpen.

--> Ik kan prima normaal OpenVPN opstarten, simpelweg OpenVPN uitvoeren met het .ovpn bestand in het commando en vervolgens mijn credentials gebruiken.

--> Maar in deze guides wordt helemaal geen .ovpn gebruikt en ook geen login gegevens. Dat begrijp ik niet. Ik begrijp een groot deel van de commando's wel, maar mis dus dit essentiele stukje. Kan iemand mij helpen dit te begrijpen?

Alle reacties


  • Thralas
  • Registratie: December 2002
  • Laatst online: 09:10
Jazco2nd schreef op donderdag 17 maart 2016 @ 20:51:
--> Maar in deze guides wordt helemaal geen .ovpn gebruikt en ook geen login gegevens. Dat begrijp ik niet. Ik begrijp een groot deel van de commando's wel, maar mis dus dit essentiele stukje. Kan iemand mij helpen dit te begrijpen?
Dat ontbreekt omdat men enkel de essentiele configuratieopties voor OpenVPN icm. netns geeft.

En een tweede belangrijke notie is dat OpenVPN dezelfde opties accepteert in configuratiebestanden en op de command line. Je kunt de command line options uit het voorbeeld dus ook in je .ovpn file opnemen en vervolgens OpenVPN starten zoals je gewend bent.

  • Jazco2nd
  • Registratie: Augustus 2002
  • Laatst online: 26-11 23:33
Dank, dat vermoedde ik al, maakt het er niet makkelijker op.

Helaas als ik het commando uitvoer om OpenVPN het netns-up script te laten starten, gaat het al mis:
code:
1
2
3
4
~$ sudo openvpn --ifconfig-noexec --route-noexec --up netns-up --route-up netns-up --down netns-up
Options error: --up script fails with 'netns-up': Permission denied
Options error: Please correct this error.
Use --help for more information.

  • Thralas
  • Registratie: December 2002
  • Laatst online: 09:10
Is het script wel executable?

  • Jazco2nd
  • Registratie: Augustus 2002
  • Laatst online: 26-11 23:33
Ha dat had ik kunnen weten. Ik kom al een stuk verder.

Zoals verwacht, als ik geen .ovpn in het commando zet werkt het niet:
code:
1
2
3
osmc@ChilleTV:/etc/openvpn$ sudo openvpn --ifconfig-noexec --route-noexec --up netns-up --route-up netns-up --down netns-up
Options error: You must define TUN/TAP device (--dev)
Use --help for more information.


Dus als ik --config toevoeg, krijg ik netjes de vraag voor authenticatie (dat kan ik in een tekstbestandje zetten en toevoegen aan het commando maar doe ik expres nog even niet). Maar vervolgens komt er toch een fatale fout, ondanks dat het script identiek is aan de guide en executable:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
:/etc/openvpn$ sudo openvpn --ifconfig-noexec --route-noexec --up netns-up --route-up netns-up --down netns-up --config za1.nordvpn.com.tcp443.ovpn
(..)
Tue Mar 22 00:10:56 2016 [vpn-za.nordvpn.com] Peer Connection Initiated with [AF_INET]154.127.61.142:443
Tue Mar 22 00:10:59 2016 SENT CONTROL [vpn-za.nordvpn.com]: 'PUSH_REQUEST' (status=1)
Tue Mar 22 00:10:59 2016 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1,dhcp-option DNS 78.46.223.24,dhcp-option DNS 162.242.211.137,route 10.7.7.1,topology net30,ping 5,ping-restart 30,ifconfig 10.7.7.102 10.7.7.101'
Tue Mar 22 00:10:59 2016 OPTIONS IMPORT: timers and/or timeouts modified
Tue Mar 22 00:10:59 2016 OPTIONS IMPORT: --ifconfig/up options modified
Tue Mar 22 00:10:59 2016 OPTIONS IMPORT: route options modified
Tue Mar 22 00:10:59 2016 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Tue Mar 22 00:10:59 2016 ROUTE_GATEWAY 192.168.1.254/255.255.255.0 IFACE=eth0 HWADDR=b8:27:eb:39:7e:46
Tue Mar 22 00:10:59 2016 TUN/TAP device tun0 opened
Tue Mar 22 00:10:59 2016 TUN/TAP TX queue length set to 100
Tue Mar 22 00:10:59 2016 netns-up tun0 1500 1592 10.7.7.102 10.7.7.101 init
Tue Mar 22 00:10:59 2016 WARNING: Failed running command (--up/--down): external program exited with error status: 1
Tue Mar 22 00:10:59 2016 Exiting due to fatal error


edit: dit gebeurd dus nadat VPN al is geinitialiseerd.

[ Voor 33% gewijzigd door Jazco2nd op 22-03-2016 00:11 ]


  • Thralas
  • Registratie: December 2002
  • Laatst online: 09:10
Dat krijg je ervan als je blind copy paste.

De EOF uit de Stack Exchange post was onderdeel van het cat-commando dat men gebruikte om het script weg te schrijven. Die hoort dus niet op regel 26 van je netns-up script terecht te komen.

  • Jazco2nd
  • Registratie: Augustus 2002
  • Laatst online: 26-11 23:33
Bovenstaande gebeurd ook zonder EOF.
De eerste keer maakte ik het script met het commando, daarna bij alle volgende pogingen heb ik inderdaad slordig gecopypaste.

Maar met het correcte script is de output dus zoals hierboven, fatale error.

  • Thralas
  • Registratie: December 2002
  • Laatst online: 09:10
Dan zou ik onder de 'up' case in het script regels uitcommenten tot het wel werkt. Of de hele sequence met de hand inkloppen nadat je OpenVPN heb gestart (zonder up-script) om te zien of het dan wel werkt.

  • Jazco2nd
  • Registratie: Augustus 2002
  • Laatst online: 26-11 23:33
Ik ben toch een beetje verbaasd dat "network namespace" nog zo exotisch is. Iedereen met bijvoorbeeld torrent clients of scrapers heeft hier direct baat bij, zeker als het op je Raspberry Pi draait waar ook Kodi of een fileserver of sync oplossing op zit (OwnCloud, SyncThing etc). Voor die dingen en Kodi wil je juist dat ze standaard niet over de VPN verbinding gaan.

Dit is het script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/sh
case $script_type in
        up)
                ip netns add vpn
                ip netns exec vpn ip link set dev lo up
                mkdir -p /etc/netns/vpn
                echo "nameserver 8.8.8.8" > /etc/netns/vpn/resolv.conf
                ip link set dev "$1" up netns vpn mtu "$2"
                ip netns exec vpn ip addr add dev "$1" \
                        "$4/${ifconfig_netmask:-30}" \
                        ${ifconfig_broadcast:+broadcast "$ifconfig_broadcast"}
                test -n "$ifconfig_ipv6_local" && \
          ip netns exec vpn ip addr add dev "$1" \
                        "$ifconfig_ipv6_local"/112
                ;;
        route-up)
                ip netns exec vpn ip route add default via "$route_vpn_gateway"
                test -n "$ifconfig_ipv6_remote" && \
          ip netns exec vpn ip route add default via \
                        "$ifconfig_ipv6_remote"
                ;;
        down)
                ip netns delete vpn
                ;;
esac

Ik heb elk commando uitgevoerd en ontdekte dat bij dit commando iets mis is:
code:
1
ip link set dev "$1" up netns vpn mtu "$2"

Ik krijg namelijk "command usage" te zien met alle opties en parameters. Ik ben gaan spelen met wat zaken maar dit commando is boven mijn linux kennis pet. Ik heb het inmiddels ook op stackexchange.com en openvpn forum gevraagd, tot mijn verbazing geen of nauwelijks reacties.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# sudo ip link set dev "$1" up netns vpn mtu "$2"
Usage: ip link add [link DEV] [ name ] NAME
                   [ txqueuelen PACKETS ]
                   [ address LLADDR ]
                   [ broadcast LLADDR ]
                   [ mtu MTU ] [index IDX ]
                   [ numtxqueues QUEUE_COUNT ]
                   [ numrxqueues QUEUE_COUNT ]
                   type TYPE [ ARGS ]
       ip link delete DEV type TYPE [ ARGS ]

       ip link set { dev DEVICE | group DEVGROUP } [ { up | down } ]
                          [ arp { on | off } ]
                          [ dynamic { on | off } ]
                          [ multicast { on | off } ]
                          [ allmulticast { on | off } ]
                          [ promisc { on | off } ]
                          [ trailers { on | off } ]
                          [ txqueuelen PACKETS ]
                          [ name NEWNAME ]
                          [ address LLADDR ]
                          [ broadcast LLADDR ]
                          [ mtu MTU ]
                          [ netns PID ]
                          [ netns NAME ]
                          [ alias NAME ]
                          [ vf NUM [ mac LLADDR ]
                                   [ vlan VLANID [ qos VLAN-QOS ] ]
                                   [ rate TXRATE ] ]
                                   [ spoofchk { on | off} ] ]
                                   [ state { auto | enable | disable} ] ]
                          [ master DEVICE ]
                          [ nomaster ]
       ip link show [ DEVICE | group GROUP ] [up]

TYPE := { vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
          bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan |
          gre | gretap | ip6gre | ip6gretap | vti | nlmon }

[ Voor 33% gewijzigd door Jazco2nd op 29-03-2016 17:35 ]


  • Thralas
  • Registratie: December 2002
  • Laatst online: 09:10
$* is een positioneel argument dat je aan het script meegeeft - of in geval van dit script, welke OpenVPN aan het script meegeeft:

code:
1
2
   For --dev tun execute as:
    cmd tun_dev tun_mtu link_mtu ifconfig_local_ip ifconfig_remote_ip [ init | restart ]


cmd is het script zelf, dus dan is $1 het tun device wat OpenVPN aanmaakt en $2 de mtu ervan.

Waarschijnlijk wil je dus iets als 'tun0' voor $1 invullen, en $2 de mtu (zie ifconfig tun0).

  • Jazco2nd
  • Registratie: Augustus 2002
  • Laatst online: 26-11 23:33
Het is duidelijk boven mijn pet. Ik begrijp dat tun voor tunnel staat en het lijkt me logisch dat ik dan eerst het device tun0 aanmaak, maar dat wordt niet gedaan in het script. Het commando is "set" en niet "add".
ifconfig tun0 zegt dan ook "device not found". Logisch als ik het nooit heb aangemaakt. Ik snap niet waarom vervolgens in de volgende stap wel een device wordt aangemaakt (ook $1 dus tun0). Hoe kan je eerst iets instellen en daarna pas aanmaken?

Ik heb het idee dat het script zoo incompleet is dat ik er niks aan heb. Maar ik snap niet dat het wel door de maker zo op zijn site is gezet. Misschien moet ik het maar laten voor wat het is. Ik heb wel de maker een mailtje gestuurd maar verwacht geen antwoord, hij is heel lang niet actief geweest.

  • Thralas
  • Registratie: December 2002
  • Laatst online: 09:10
Jazco2nd schreef op dinsdag 29 maart 2016 @ 18:15:
Het is duidelijk boven mijn pet. Ik begrijp dat tun voor tunnel staat en het lijkt me logisch dat ik dan eerst het device tun0 aanmaak, maar dat wordt niet gedaan in het script.
Omdat OpenVPN het device aanmaakt, en daarna het script aanroept.
Het commando is "set" en niet "add".
ifconfig tun0 zegt dan ook "device not found". Logisch als ik het nooit heb aangemaakt.
Eerst OpenVPN starten zonder up-script.
Ik snap niet waarom vervolgens in de volgende stap wel een device wordt aangemaakt (ook $1 dus tun0). Hoe kan je eerst iets instellen en daarna pas aanmaken?
Je interpreteert het verkeerd. Dat is een 'addr add', ofwel, het toevoegen van een adres aan een bestaand(!) device. Dat zou goed moeten gaan als OpenVPN tunX al aangemaakt heeft.
Ik heb het idee dat het script zoo incompleet is dat ik er niks aan heb. Maar ik snap niet dat het wel door de maker zo op zijn site is gezet.
Of het is simpelweg incompatible met je bestaande OpenVPN config.

  • Jazco2nd
  • Registratie: Augustus 2002
  • Laatst online: 26-11 23:33
OK ik heb dus het OpenVPN commando uitgevoerd door alle -up en -down weg te halen waarin het script werd genoemd. Nu kan ik de commando's t/m ip link set dev uitvoeren (mtu vervangen voor 1500).

Maar.. dan het meest ingewikkelde commando, ik heb nog nooit zoiets gezien met \ erin. Ik heb het op meerdere manieren geprobeerd maar krijg altijd de error:

code:
1
2
3
4
root@ChilleTV:/# ip netns exec vpn ip addr add dev tun0 \
>                         "$4/${ifconfig_netmask:-30}" \
>                         ${ifconfig_broadcast:+broadcast "$ifconfig_broadcast"}
Error: an inet prefix is expected rather than "/30".


Hier zit echter ook weer een variabele $4. Ik gokte op eth0, veth en tun0.. zonder succes.

Ik ben je trouwens heel dankbaar voor je hulp tot nu toe, en je enorme geduld!

[ Voor 10% gewijzigd door Jazco2nd op 29-03-2016 22:11 ]


  • woutertje
  • Registratie: Maart 2002
  • Laatst online: 11:42
Die \ is gewoon een manier om er voor te zorgen dat de volgende regel wordt gezien als onderdeel van de huidige regel, puur iets cosmetisch dus :)

De waarden van je $1, $2 enzovoorts kun je aflezen uit deze regel van de OpenVPN log:
netns-up tun0 1500 1592 10.7.7.102 10.7.7.101 init
$4 is dus het IP-adres 10.7.7.102, wat ik neem aan het IP-adres is wat aan jou is toegewezen door de VPN-server.
ip netns exec vpn ip addr add dev tun0 "$4/${ifconfig_netmask:-30}" ${ifconfig_broadcast:+broadcast "$ifconfig_broadcast"}
Wat dit doet is: het IP-adres wat aan jou is toegewezen (10.7.7.102) wordt hier toegevoegd aan netwerk-interface tun0 -binnen de vpn namespace-. Als "ifconfig_netmask" leeg is dan wordt als subnet /30 genomen (dat is de ${...:-30}). Indien er een broadcast address in "ifconfig_broadcast" staat dan wordt die er ook nog bij gezet, zo niet, dan niet (dat is de ${...:+broadcast}).

Uiteindelijk komt hier dus zoiets uit, waarbij ik er vanuit ga dat beide variabelen leeg zijn (ifconfig_netmask en ifconfig_broadcast):
ip netns exec vpn ip addr add dev tun0 10.7.7.102/30
Zelf draai ik iets vergelijkbaars, maar zonder deze up/down scripts. Ik maak eerst de namespace aan, voeg daaraan een tunnel naar mijn "default" namespace toe waarbij ik NAT toepas, daardoor kan ik het internet bereiken vanuit de namespace. Vervolgens start ik openvpn gewoon binnen deze namespace zonder verdere aanpassingen (ip netns exec VPNNS openvpn --config jeconfigfile). Daarnaast heb ik iptables nog zo geconfigureerd dat deze geen verbindingen anders dan de openvpn verbinding toelaat over het "gewone" internet, alhoewel dat niet vereist is.

[ Voor 103% gewijzigd door woutertje op 30-03-2016 09:26 ]


  • Jazco2nd
  • Registratie: Augustus 2002
  • Laatst online: 26-11 23:33
Dank voor deze uitleg. Ik was puur op zoek naar de simpelste manier met de minste impact die het makkelijkst door noobs is in te stellen op een Raspberry Pi of vergelijkbaar device met OSMC erop of ander debian based systeem.
Nu begrijp ik dat ik in het script het IP adres van de door mij gekozen VPN moet instellen, ergens logisch maar dan is het dus geen generieke oplossing meer. Ik denk dat ik het nu wel werkend kan krijgen (vanavond weer proberen), maar zocht juist een methode om OpenVPN voor 'de massa' makkelijk per app in te stellen.

  • Thralas
  • Registratie: December 2002
  • Laatst online: 09:10
woutertje schreef op woensdag 30 maart 2016 @ 09:03:
Daarnaast heb ik iptables nog zo geconfigureerd dat deze geen verbindingen anders dan de openvpn verbinding toelaat over het "gewone" internet, alhoewel dat niet vereist is.
Uit interesse - welk voordeel haal je dan uit het gebruik van een namespace?

Als het doel is 'alles over OpenVPN' ben je er ook met wat iptables rules op de host, toch?

  • woutertje
  • Registratie: Maart 2002
  • Laatst online: 11:42
Thralas schreef op woensdag 30 maart 2016 @ 17:20:
[...]


Uit interesse - welk voordeel haal je dan uit het gebruik van een namespace?

Als het doel is 'alles over OpenVPN' ben je er ook met wat iptables rules op de host, toch?
Nou alleen die processen die binnen de namespace draaien moeten over VPN. Mocht nou het openvpn proces om de een of andere reden afgebroken worden dan zouden die processen gewoon over de normale verbinding verder gaan (de veth die tussen de namespace en de default namespace hangt, met NAT aan het internet). Dat zou met iptables trouwens ook op de host kunnen inderdaad maar nu heb ik dat mooi gescheiden van de rest, kwestie van voorkeur.

  • Jazco2nd
  • Registratie: Augustus 2002
  • Laatst online: 26-11 23:33
Het is voor mij veel te ingewikkeld geworden. Simpel OpenVPN runnen is geen probleem maar zodra je het wil beperken tot 1 of twee applicaties is er eigenlijk geen aanbevolen methode en knutselt iedereen wat rond.
Pagina: 1