web-dev-qa-db-fra.com

Désactiver l'accès Internet uniquement s'il est accessible via un VPN sous Ubuntu 17

Existe-t-il un moyen d’empêcher mon système d’utiliser l’Internet régulier et de le limiter à l’utilisation d’un VPN uniquement sous Ubuntu 17? Pour votre information, j'ai déjà configuré protonvpn via les fichiers .ovpn et je ne me connecte actuellement qu’à ce dernier en l’activant à l’aide du menu déroulant.

Je veux forcer toutes les connexions à utiliser uniquement un VPN, et si le vpn n'est pas accessible, il devrait empêcher tous les types de connexion à Internet.

Je sais que cela a quelque chose à voir avec la définition des routes sur la section IPv4, mais je ne sais pas trop quoi.

enter image description here

3

La solution consiste à utiliser iptables pour refuser tout le trafic sortant, sauf lorsque le trafic traverse le tunnel.

Si le tunnel est rompu, l'accès à Internet n'est plus possible tant que le tunnel n'est pas rétabli.

Je suppose que vous utilisez le routage basé sur TUN pour vous connecter au serveur OpenVPN et que vous utilisez l’option client OpenVPN de la passerelle de redirection.

Créez un fichier n’importe où (par exemple, /root/iptables.vpn), vous devez modifier [VPN_IP] et [ VPN_PORT] avec l'ip: port du serveur vpn

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

# Set a default DROP policy.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

# Allow basic INPUT traffic.
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT

# Allow basic OUTPUT traffic.
-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT

# Allow traffic to the OpenVPN server and via the tunnel.
-A OUTPUT -o tun+ -j ACCEPT
-A OUTPUT -p udp -m udp -d [VPN_IP] --dport [VPN_PORT] -j ACCEPT

# Reject everything else.
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j REJECT --reject-with icmp-port-unreachable
COMMIT

Une fois la connexion avec le serveur VPN établie, vous devez activer les règles:

iptables-restore < /root/iptables.vpn

Tout le trafic sera maintenant acheminé par le tunnel.

EDIT Au fur et à mesure que l'auteur écrit, il exécute la connexion en utilisant une approche semblable à celle d'un gestionnaire de réseau. Le problème est qu'il ne connaît pas l'adresse IP distante du serveur, comme il est saisi à partir d'un pool. Je pense (mais pour l'instant je n'ai pas le temps de tester cette solution) qu'une approche peut être:

  1. Modifiez le fichier créé précédemment (dans notre exemple, /root/iptables.vpn), en remplaçant [VPN_IP] par $ route_vpn_gateway et [VPN_PORT] par $ remote_port
  2. Créez un script (par exemple /etc/openvpn/route.sh):
while read line
  do eval "echo ${line}"
done < /root/iptables.vpn | /sbin/iptables-restore -v

( https://stackoverflow.com/questions/5289665/use-external-file-with-variables )

  1. Modifiez (puis rechargez) votre fichier .openvpn en ajoutant:

script-security 2

/etc/openvpn/route.sh

( Comment puis-je exécuter un script après qu'OpenVPN s'est connecté avec succès? )

Le script sera exécuté chaque fois que la connexion au vpn est établie.

Comme mentionné, je n'ai pas testé cela ...

N'oubliez pas de vider vos iptables après avoir fermé la connexion vpn

5
LilloX

Oui. Utilisez ufw.

Lorsque vous vous connectez à un réseau privé virtuel, un périphérique virtuel est créé. En supposant que votre nom Ethernet soit enp3s0 et que votre serveur VPN écoute le port 1194, utilisez ces commandes.

# Default policies
 ufw default deny incoming
 ufw default deny outgoing

 # Openvpn interface (adjust interface accordingly to your configuration)
 ufw allow in on tun0
 ufw allow out on tun0

 # Local Network (adjust ip accordingly to your configuration)
 ufw allow in on enp3s0 from 192.168.1.0/24
 ufw allow out on enp3s0 to 192.168.1.0/24

 # Openvpn (adjust port accordingly to your configuration)
 ufw allow in on enp3s0 from any port 1194
 ufw allow out on enp3s0 to any port 1194

Si vous vous connectez au serveur par nom et non par adresse IP, vous devez autoriser les fuites DNS en dehors du VPN. Ajoutez ces commamds:

 # DNS
 ufw allow in from any to any port 53
 ufw allow out from any to any port 53

Utilisez ensuite ufw enable pour activer ces règles. ufw disable si quelque chose ne va pas ou si vous voulez un accès direct.

Gracieuseté de ArchWiki.

1
Barafu Albino

Beaucoup de façons, mais cela dépend du logiciel VPN que vous utilisez.

Vous pouvez empêcher le système d'accéder au réseau lorsque vous ne l'utilisez pas sur un réseau VPN en modifiant la configuration de l'interface, soit dans /etc/network/interfaces ou (plus probablement si vous utilisez un système de bureau) à partir de NetworkManager. Ouvrez le NM, sélectionnez "configurer les réseaux" ou autre, puis éditez les options indiquant comment chaque interface obtient son adresse afin que les itinéraires statiques n'incluent pas d'itinéraire par défaut (ou ajoutent un itinéraire par défaut à blackhole). Ensuite, configurez votre VPN pour vous donner un itinéraire par défaut lorsqu’il apparaît.

Sans plus de détails sur votre configuration, c'est à peu près tout ce que je peux en dire.

1
JayEye