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 - Ouvert à de nouvelles opportunités

  • # 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.