2 votes

Comment exclure une IP de destination spécifique du VPN ?

Je veux router une adresse IP spécifique depuis le hotspot ( wlan0 ) à Mobile Data ( rmnet_data1 ) sur Android 11, en contournant le VPN.

J'utilise mon téléphone comme un hotspot et aussi avec l'aide d'une application appelée "VPN Hotspot" je partage le VPN avec mon PC. Je veux exclure une adresse IP spécifique du VPN. J'ai essayé l'option route dans le client "OpenVPN for Android" et cela ne semble pas fonctionner correctement. Je pense que cela peut être dû à l'activation de l'option "Always On".

Puis-je y parvenir avec ip route commande ?

1 votes

ip -4 ru | grep -vE 'unreachable[ ]*$|local[ ]*$'; ip -4 r s t all | grep -vE '^unreachable |^local |^broadcast '

1voto

Irfan Latif Points 16863

Note : Les commandes données ci-dessous nécessitent un appareil enraciné.


Chaque fois que vous activez ou désactivez le VPN sur un appareil Android, la table de routage est recréée par le framework Android. Il peut y avoir une vingtaine de règles ajoutées à la table de routage lorsque le VPN est activé, puisqu'il effectue un filtrage basé sur les UIDs et les Socket Marks. Vous devez donc manipuler la table de routage en fonction des règles existantes.

POLITIQUE ET TABLES DE ROUTAGE

À partir des informations que vous avez fournies, je cite les parties pertinentes :

~# ip -4 rule
...
11000:  from all iif tun0 lookup local_network
...
17900:  from all iif wlan0 lookup tun0
18000:  from all iif wlan0 lookup rmnet_data1
...

~# ip -4 route show table all
...
192.168.18.0/24 dev wlan0 table local_network...
...
default via 21.62.249.109 dev rmnet_data1 table rmnet_data1...
21.62.249.104/29 dev rmnet_data1 table rmnet_data1...
...

~# iptables -t nat -S
...
-A POSTROUTING -j tetherctrl_nat_POSTROUTING
-A tetherctrl_nat_POSTROUTING -o tun0 -j MASQUERADE
-A tetherctrl_nat_POSTROUTING -o rmnet_data1 -j MASQUERADE
...

En termes simples, ce que disent les règles ci-dessus :

  • Tout ce qui arrive à l'interface VPN ( tun0 ) est acheminé vers l'interface du hotspot ( wlan0 ) si l'IP de destination se trouve dans le sous-réseau du hotspot ( 192.168.18.0/24 ), c'est-à-dire que les paquets n'appartiennent pas aux applications fonctionnant sur le dispositif (sockets ouverts).
  • Tout ce qui arrive à l'interface du hotspot est routé vers l'interface VPN.
  • Les paquets qui ne remplissent pas les conditions pour être acheminés par le VPN (principalement le trafic VPN lui-même, les applications exclues, ou les paquets locaux) sont acheminés vers l'interface de données mobiles ( rmnet_data1 ).
    21.62.249.109 est votre IP attribué par le transporteur et 21.62.249.104/29 est leur porte d'entrée.
  • Tous les paquets sortant par les interfaces VPN et/ou Mobile Data sont MASQUERADEd, c'est-à-dire que leur adresse IP source est changée de l'IP locale à une adresse IP routable ( 21.62.249.109 dans votre cas).

Voici donc le flux simplifié qui nous intéresse :

Hotspot -> Routing -> FORWARD -> SNAT -> Internet
Internet -> Conntrack -> Routing -> FORWARD -> Hotspot

SOLUTION

Après avoir compris comment il fonctionne, nous allons l'acheminer comme nous le souhaitons. Disons qu'un hôte sur un réseau hotspot se connecte à 1.2.3.4 par internet. Mais vous ne voulez pas envoyer ce trafic spécifique par VPN sur un appareil Android.

  • Définissez une règle dans RPDB et une table de routage pour acheminer le trafic arrivant à l'interface hotspot vers l'interface Mobile Data, s'il est destiné à 1.2.3.4 :

    ~# ip rule add iif wlan0 lookup 9000 pri 9999
    ~# ip route add 1.2.3.4 dev rmnet_data1 table 9000

    J'ai utilisé la priorité RPDB 9999 et la table 9000. Vous devrez peut-être modifier la priorité (pour que votre règle soit toujours en tête) et le numéro de la table. Vérifiez /data/misc/net/rt_tables pour les numéros de table réservés que vous ne devez pas utiliser.

  • Définissez une autre règle pour acheminer les paquets venant de 1.2.3.4 à l'interface Mobile Data vers l'interface hotspot (si l'IP de destination est dans le sous-réseau du hotspot) :

    ~# ip rule add from 1.2.3.4 iif rmnet_data1 lookup local_network pri 9999

    Notez que j'ai utilisé ici une table de routage déjà existante local_network . Vous pouvez également définir les vôtres.

  • Tous les paquets sortants par l'interface Mobile Data sont déjà MASQUERADEd comme expliqué ci-dessus, donc nous n'avons pas besoin d'ajouter un autre iptables règle. Si nécessaire, vous pouvez également utiliser SNAT à la place de MASQUERADE .

  • Assurez-vous que le transfert d'IP est activé et autorisé dans le pare-feu. En général, ce n'est pas nécessaire car le hotspot Wi-Fi le fait déjà pour vous :

    ~# echo 1 > /proc/sys/net/ipv4/ip_forward
    ~# iptables -I FORWARD -o rmnet_data1 -d 1.2.3.4 -j ACCEPT
    ~# iptables -I FORWARD -i rmnet_data1 -s 1.2.3.4 -j ACCEPT

Pour supprimer ces règles, utilisez ip rule del , ip route del y iptables -D .


NE FONCTIONNE PAS ?

Si les règles ci-dessus ne fonctionnent pas, ou si vous devez adapter les règles à une situation différente, iptables -j LOG est un bon ami pour le dépannage.

Pour référence, lisez n'importe quelle documentation ou guide Linux sur le routage IP et Netfilter. Il ne s'agit pas spécifiquement d'Android.


RELATION :

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X