Forum Linux.débutant N'utiliser un vpn que pour une application

Posté par  . Licence CC By‑SA.
Étiquettes :
1
19
juin
2013

Bonjour,

Je vais bientôt avoir un serveur et j'aimerais pouvoir me servir d'un vpn (open vpn) pour une seule et unique application, et non pour tout le trafic.

Je peux tester ça sur mon raspberry pi avant de le faire sur le serveur.

Je tourne sous debian et quand j'aurais le serveur je mettrais debian v6 ou v7.

Je n'ai que peu de connaissance en réseau, mais un avec bon tuto bien guidée pour iptables ou autre je devrais m'en sortir.

Merci d'avance et bonne journée

  • # vpn, et table de routage

    Posté par  . Évalué à 3.

    en fait avec openvpn, la plupart du temps, tout le trafic est envoyé dans le VPN.

    et la plupart du temps, j'ai un script qui :
    - desactive la route par defaut vers le vpn,
    - reactive la route par defaut vers ma passerelle
    - active les routes qui me sont utiles vers le vpn

    le script contient des commandes à base de ip route ou route
    dans les deux cas man ip route ou man route devrait t'aider.

    • [^] # Re: vpn, et table de routage

      Posté par  . Évalué à 2. Dernière modification le 19 juin 2013 à 16:11.

      en fait avec openvpn, la plupart du temps, tout le trafic est envoyé dans le VPN.

      Je ne suis pas d'accord avec ça.
      Pour faire simple openVpn te rajoute une carte réseau qui permet d’accéder à la machine distante.

      Ensuite tu peux lui dire d'ajouter automatiquement la route vers un sous réseau.
      Par exemple pour accéder depuis le boulot au sous réseau de mon domicile j'ai la ligne suivante dans mon fichier de server.conf :

      push "route 192.168.0.0 255.255.255.0"
      
      

      Tu peu également transmettre la passerelle de ta machine distante pour qu'il passe la cette passerelle pour aller vers l’extérieur. Dans ce cas tout le trafic vers l'exterieur passera par ton VPN. C'est utile pour by passer un proxy d'entreprise mais ça te pourri les temps de réponse (surtout si tu passe par ta petite freebox comme moi).
      Pour cela on met cette ligne dans le server.conf :

      push "redirect-gateway def1 bypass-dhcp"
      
      

      Mais ce n'est en aucun cas ce qui est fait la plupart du temps justement car tout le trafic passera par ce "tuyau" alors que c'est inutile.
      En général on ne met pas cette directive car on cherche juste a avoir accès a une machine/un sous réseau et pas a passer tout le traffic dans le VPN.

      et la plupart du temps, j'ai un script qui :
      - desactive la route par defaut vers le vpn,
      - reactive la route par defaut vers ma passerelle
      - active les routes qui me sont utiles vers le vpn

      le script contient des commandes à base de ip route ou route
      dans les deux cas man ip route ou man route devrait t'aider.

      Perso je ne fais pas de script complémentaire tout est fait par la conf du serveur VPN et uniquement par celle-ci.

      Pour ce qui est de la question initiale pour utiliser openVPN pour une seule appli je crois que c'est impossible, OpenVPN "change" le réseau pour tout le système pas pour un programme uniquement (c'est peut-être possible mais j'ai jamais vu avec openVPN).

      • [^] # Re: vpn, et table de routage

        Posté par  . Évalué à 0. Dernière modification le 19 juin 2013 à 16:33.

        Paramètre --route-noexec pour ignorer les routes envoyées par le serveur, exécution automatique d'un script qui effectue le PBR (voir mon premier message) au démarrage du client OpenVPN et le tour est joué ;)

        • [^] # Re: vpn, et table de routage

          Posté par  . Évalué à 2.

          Pourquoi le faire un script sur le client quand la conf serveur le fait très bien ?
          Si ta conf coté serveur et bien fait , il t'envoie tout ce que tu a besoin et tu n'a rien a faire et ce peu importe le client.
          Après si tu as un besoin spécifique que l'outils ne comble pas je veux bien faire un script supplementaire mais en général c'est inutile.

          Bref je suis d'accord avec toi un script supplémentaire coté client ça marche, mais personnellement je ne trouve pas ça des plus pratique/propre.

          • [^] # Re: vpn, et table de routage

            Posté par  . Évalué à 2.

            je suis d'accord avec toi,
            sauf que meme en m'y connaissant un peu quand meme, j'ai jamais reussi à faire faire ce que je voulais à openvpn-server

            et c'est pour cela que ca se terminer en script pour faire sauter la route par defaut (ou en route-noexec coté client) et en route add … pour mettre correctement mes routes.

            apres j'ai jamais dis que c'etait "propre" ;)

          • [^] # Re: vpn, et table de routage

            Posté par  . Évalué à 0.

            Pourquoi le faire un script sur le client quand la conf serveur le fait très bien ?
            Si ta conf coté serveur et bien fait , il t'envoie tout ce que tu a besoin et tu n'a rien a faire et ce peu importe le client.

            Je ne suis absolument pas un expert en OpenVPN, est-ce qu'il est possible pour le serveur de pousser des règles iptables, d'instancier une nouvelle table de routage sur le client et d'appliquer une règle de routage ? Ça serait en effet bien plus souple.

  • # PBR

    Posté par  . Évalué à 5.

    Je dirais que tu peux utiliser du "Policy-based routing".

    En gros

    1) Tu identifies le trafic de ton application avec iptables et tu lui appliques une MARK
    2) Tu crées une table de routage spécifique qui contient la route vers ta gateway OpenVPN (commande 'ip')
    3) Tu crées une règle qui associe le trafic identifié au point 1 avec la table de routage du point 2 (commande 'ip')

    Essaye "linux pbr" dans google, tu devrais trouver ton bonheur ;)

  • # ipsec

    Posté par  (site web personnel) . Évalué à 1.

    Avec ipsec tu peux spécifier un port et un adresse.

    Mes 2cts.

    Système - Réseau - Sécurité Open Source

  • # Merci pour toutes vos réponses

    Posté par  . Évalué à 0.

    J'ai lu ailleurs qu'on pouvait mettre route-nopull dans le fichier de configuration openvpn pour ne pas utiliser les routes fournies.

    Ainsi je pourrais faire du Policy-based routing comme le dit chaispaquichui.

    Mais une fois ces modifications faites pour associer le trafic à la table de routage créée,ces modifications sont elles conservées après un reboot du serveur ?

    Si non comment faire, à part un script au lancement d'open vpn ?

    Merci et bonne soirée :)

  • # essai de script

    Posté par  . Évalué à 0.

    Re-Bonjour,

    J'ai tenté en m'inspirant des exemples du net de faire un script comme certains me le conseillaient ici.
    Mais cela ne fonctionne pas.

    Voilà mon script d'up

       #!/bin/bash
    
        TUNDEV=$1
        TUNIP=$4
        # Ici on met le réseau du VPN, pour le connaitre veuillez vous connecter au VPN avec la 
        # configuration fournie sans le "route-nopull" et faire un ifconfig sur l'interface tun créée
        # Faites pareil pour la gateway avec un `route`
        VPNNET="10.7.0.10/24" 
        VPNGW="10.7.0.9"
    
        EXTIF=eth0
        VPNNAME=vpntorrent
        MARK=100 # spécifique a ce VPN, vous choisissez, mettez en un différent par vpn
        # On commence par nettoyer au cas ou OpenVPN aurait violemment redémarré dans le passé
        echo "- Flushing iptables"
        iptables -t mangle -D OUTPUT -o $EXTIF -m owner --uid-owner $VPNNAME -j MARK --set-mark $MARK
        iptables -t nat -D POSTROUTING -m mark --mark $MARK -j MASQUERADE
        iptables -t nat -D POSTROUTING -m mark --mark $MARK -j SNAT --to-source $TUNIP
        echo "- Flushing iproutes"
        ip route flush table $VPNNAME
        ip rule del fwmark $MARK
        echo "- Flushing rp_filter"
        for f in all $TUNDEV
        do echo 1 > /proc/sys/net/ipv4/conf/$f/rp_filter ; done
    
        echo "+ adding iptables"
        # On marque tous les paquets appartenant au group $VPNNAME
        iptables -t mangle -A OUTPUT -o $EXTIF -m owner --gid-owner $VPNNAME -j MARK --set-mark $MARK
        iptables -t nat -A POSTROUTING -m mark --mark $MARK -j MASQUERADE
        # L'IP source des paquets doit etre changée vu que l'on va les faire passer par l'interface VPN                               tun
        iptables -t nat -A POSTROUTING -m mark --mark $MARK -j SNAT --to-source $TUNIP
    
        echo "+ adding iproutes"
        echo " + net ${NET} on main table"
        ip route add $VPNNET dev $TUNDEV proto kernel scope link src $TUNIP
        echo " + net ${NET} on ${VPNNAME} table"
        ip route add $VPNNET dev $TUNDEV proto kernel scope link src $TUNIP table ${VPNNAME}
        echo " + gw"
        ip route add default via $VPNGW dev $TUNDEV table ${VPNNAME}
        ip rule add fwmark $MARK table ${VPNNAME}
        ip route flush cache table ${VPNNAME}
        ip route flush cache
    
        echo "+ adding rp_filter" # ca c'est la commande magique
        for f in all $TUNDEV
        do echo 0 > /proc/sys/net/ipv4/conf/$f/rp_filter ; done
    
        echo "+ adding dns" # On utilise les DNS de google qui ont une meilleure latence quelque soit     la position du serveur VPN
        echo "nameserver 8.8.8.8
        nameserver 8.8.4.4
        nameserver 213.186.33.99
        " > /etc/resolv.conf
    
    

    Celui de down

    #!/bin/bash
    
        TUNDEV=$1
        TUNIP=$4
        VPNNET="10.7.0.10/16"
        VPNGW="10.7.0.9"
        EXTIF=eth0
        VPNNAME=vpntorrent
        MARK=100 # spécifique au vpn, meme que pour le up
    
        echo "- Flushing iptables"
        iptables -t mangle -D OUTPUT -o $EXTIF -m owner --gid-owner $VPNNAME -j MARK --set-mark $MARK
        iptables -t nat -D POSTROUTING -m mark --mark $MARK -j MASQUERADE
        iptables -t nat -D POSTROUTING -m mark --mark $MARK -j SNAT --to-source $TUNIP
        echo "- Flushing iproutes"
        ip route flush table $VPNNAME
        ip rule del fwmark $MARK
        echo "- Flushing rp_filter"
        for f in all $TUNDEV
        do echo 1 > /proc/sys/net/ipv4/conf/$f/rp_filter ; done
    
        echo "+ flushing dns"
        echo "nameserve ksxxxxx.kimsufi.com # votre nameserver habituel, au choix
        " > /etc/resolv.conf
    
    

    Et ma conf openvpn :

       client
        dev tun
        proto udp
        remote nl2.mullvad.net 53
        resolv-retry infinite
        nobind
        persist-key
        persist-tun
        comp-lzo
        verb 3
        remote-cert-tls server
        ping-restart 60
        ping 10
        ca master.mullvad.net.crt
        cert mullvad.crt
        key mullvad.key
        route-noexec
        script-security 2
        up /usr/local/vpn/vpntorrent-up
        down /usr/local/vpn/vpntorrent-down
        persist-key
        persist-tun
    
    

    NB : il y avait ça comme script dans la conf par défaut de mon provider vpn

        # Parses DHCP options from openvpn to update resolv.conf
            up /etc/openvpn/update-resolv-conf
            down /etc/openvpn/update-resolv-conf
    
    

    Merci d'avance pour votre aide
    Et bonne fin de journée :)

  • # problème trouvé, mais solution ?

    Posté par  . Évalué à 0.

    Je pense avoir trouvé le problème dans mon script ci-dessus
    Au début on déclare l'ip et le gateway du vpn.
    Mais ces derniers changent tout le temps, donc ça marche pas…

    Est-ce qu'il existe une commande pour router le trafic sur l'interface réseau du vpn (tun0) plutôt que sur une ip ?

    MERCI

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.