Port vers le client VPN?

21

J'ai rencontré un peu de puzzle et je n'ai pas eu beaucoup de chance pour trouver une solution. En ce moment, je suis (malheureusement) connecté au réseau via Verizon 3G. Ils filtrent tout le trafic entrant, il m'est donc impossible d'ouvrir des ports pour accepter des connexions.

J'ai actuellement une machine virtuelle Linux sur linode.com, et l'idée m'a traversé l'idée d'installer pptpdet d'essayer de faire un iptablestransfert de port. J'ai pptpdinstallé et ma machine domestique se connecte heureusement. Cela dit, voici quelques informations générales:

Serveur (Debian) IP WAN: xxxx sur eth0 - pptpd IP: yyy1 sur ppp0 - IP VPN client: yyy100

Pour vérifier que je ne devenais pas fou, j'ai tenté quelques connexions du serveur aux ports ouverts sur le client, et le client accepte les connexions via l'IP VPN.

Ce que je veux accomplir, c'est ceci:

Internet -> IP WAN: Port -> Transférer vers IP VPN client: Port

Ainsi, par exemple, si j'avais le port 6000 ouvert sur mon client, une personne pourrait telnet vers xxxx: 6000, et le serveur l'attraperait et le transmettrait à 192.168.3.100:6000.

J'ai essayé au moins 20 configurations différentes sur iptablesGoogle et aucune n'a encore fonctionné. Quelqu'un a-t-il des idées, ou peut-être même une approche totalement différente que je ne connaisse pas? Le but ici est d'écouter à travers une connexion horriblement pare-feu, de préférence le trafic TCP et UDP.

Vile Brigandier
la source

Réponses:

25

Vous devez faire trois choses sur votre serveur VPN (le Linode) pour que cela fonctionne:

  1. Vous devez activer le transfert IP:

    sysctl -w net.ipv4.ip_forward=1
    
  2. Configurez le NAT de destination (DNAT) pour transférer le port. Vous l'avez probablement déjà compris car il s'agit de trucs de redirection de port standard, mais pour être complet:

    iptables -t nat -A PREROUTING -d x.x.x.x -p tcp --dport 6000 -j DNAT --to-dest y.y.y.100:6000
    
  3. Configurez le NAT source (SNAT) de sorte que du point de vue de votre client VPN, la connexion provient du serveur VPN:

    iptables -t nat -A POSTROUTING -d y.y.y.100 -p tcp --dport 6000 -j SNAT --to-source y.y.y.1
    

La raison pour laquelle vous avez besoin du SNAT est parce que sinon votre client VPN enverra ses paquets de retour directement à l'hôte qui a initié la connexion (zzzz) via sa passerelle par défaut (c'est-à-dire Verizon 3G), et non via le VPN. Ainsi, l'adresse IP source sur les paquets de retour sera votre adresse Verizon 3G, et non xxxx. Cela provoque toutes sortes de problèmes, car zzzz a vraiment initié la connexion à xxxx

Dans la plupart des configurations de redirection de port, le SNAT n'est pas nécessaire car l'hôte effectuant la redirection de port est également la passerelle par défaut pour l'hôte de destination (par exemple, un routeur domestique).

Notez également que si vous souhaitez transférer le port 6000 vers un autre port (disons 7000), la règle SNAT doit correspondre sur 7000, et non sur 6000.

AGWA
la source
Bonjour AGWA, Merci pour la réponse. J'avais déjà ip_forwarding activé, et vos règles fonctionnaient parfaitement, mais pas au départ. Le problème était (dans ma noblesse iptables) que je ne savais pas que iptables -F ne vidait pas les entrées nat, et iptables -L ne les listait pas. Après avoir compris comment les répertorier correctement, j'ai remarqué plusieurs entrées contradictoires lors d'essais précédents. Après avoir rincé et essayé vos règles, cela fonctionne parfaitement. Une question rapide cependant, dans vos règles, vous spécifiez tcp. Est-ce que changer cela en "tout" fonctionnerait pour le trafic TCP / UDP?
Vile Brigandier
Vous êtes les bienvenus! (Soit dit en passant, j'aime utiliser iptables-savepour afficher mes règles iptables - bien que la sortie ne soit pas destinée à la consommation humaine, elle est toujours lisible et affiche toutes vos règles iptables.) Non, malheureusement, vous ne pouvez pas utiliser "tout" là-bas, car --dportseulement fonctionne avec des protocoles qui ont réellement des ports ("tous" inclurait par exemple ICMP, qui n'a aucune notion de ports). Vous aurez besoin de règles distinctes pour TCP et UDP.
AGWA
Merci pour l'astuce iptables-save. Tout fonctionne comme prévu pour TCP et UDP. À votre santé.
Vile Brigandier
2
Juste une mise à jour de cette réponse est qu'avec iproute2, vous pouvez réellement configurer votre client VPN pour avoir 2 passerelles et acheminer le trafic DNAT sur le VPN. Ceci est avantageux si vous ne voulez pas utiliser SNAT et que tout le trafic semble provenir du serveur vpn. thomas-krenn.com/en/wiki/Two_Default_Gateways_on_One_System comprend des informations sur la façon de configurer cela.
PressingOnAlways
Fonctionne pour moi tant que ufw est désactivé, même si j'ai autorisé 8080 en ufw, mais dès que j'active ufw, ce transfert ne fonctionne pas .. une idée?
Sudhir N
3

J'ai également eu ce problème et j'ai essayé de le résoudre pendant des heures. Voici ma solution:

  • J'en avais plus d'un VPNClientavec le même IPAddress. J'ai donc donné à chacun d'eux une statiqueIPAddress

Définissez un répertoire dans lequel les scripts clients doivent être stockés, par exemple / etc / openvpn / staticclients et créez le répertoire

mkdir /etc/openvpn/staticclients

Ajoutez ce répertoire en option à votre fichier de configuration openvpn sur le serveur:

client-config-dir /etc/openvpn/staticclients

Pour chaque client, vous devez créer un fichier. Le nom de fichier doit correspondre à l' common nameattribut spécifié sur le certificat du client. Cette commande obtient le CN du certificat des ordinateurs:

Cet exemple pousse le IPAddress10.1.134.110/10.1.134.109 vers le client avec le common name TESTCLIENT et pousse également une route supplémentaire pour le sous-réseau 10.1.135.0.

cat /etc/openvpn/staticclients/TESTCLIENT

ifconfig-push 10.1.134.110 10.1.134.109
push "route 10.1.135.0 255.255.255.0 10.1.134.62"
sysctl -w net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp --dport 28006 -j DNAT --to 10.1.134.110
Dominic Jonas
la source
2

La plupart des serveurs ont le transfert IP désactivé dans la configuration par défaut. Vous devez l'activer si vous souhaitez rediriger les connexions entrantes via votre VPN.

Essaye ça:

sysctl -w net.ipv4.ip_forward = 1

Je veux dire en plus de la configuration iptables.

Andrey Voitenkov
la source
0

Ce que vous voulez réaliser est (probablement) très possible avec pptpdou OpenVPN et iptables, cependant, vous pourriez trouver tinc un meilleur candidat pour ce cas d'utilisation. Je viens de lire ceci qui décrit comment configurer tinc pour exactement ce cas d'utilisation. C'est une alternative (potentiellement plus simple) à la pptdppartie ou OpenVPN. Ensuite, vous auriez besoin exactement des mêmes règles pour iptables.

chmac
la source