Openvpn, pas d'acces internet

Bonjour

Je viens d’installer un server vpn sur ma debian, tout fonctionne bien, je peux m’y connecter et même avoir accès à mon partage samba.

Le seule problème c’est que je n’arrive pas à me connecter à internet par le vpn. J’ai suivis ce tuto: https://debian-facile.org/doc:reseau:openvpn

voici mon server.conf:

Serveur TCP/443

mode server
proto tcp
port 443
dev tun

Cléet certificats

ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
tls-auth ta.key 0
cipher AES-256-CBC

Réau

server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
keepalive 10 120

Sérite

user nobody
group nogroup
chroot /etc/openvpn/jail
persist-key
persist-tun
comp-lzo

Log

verb 3
mute 20
status openvpn-status.log
log-append /var/log/openvpn.log

Mon iptables-save:

Generated by iptables-save v1.4.21 on Sun Dec 4 20:04:10 2016

*filter
:INPUT DROP [164:15154]
:FORWARD DROP [122:10135]
:OUTPUT DROP [1:73]
:fail2ban-apache - [0:0]
:fail2ban-apache-modsecurity - [0:0]
:fail2ban-apache-multiport - [0:0]
:fail2ban-apache-nohome - [0:0]
:fail2ban-apache-noscript - [0:0]
:fail2ban-apache-overflows - [0:0]
:fail2ban-dovecot - [0:0]
:fail2ban-mysqld-auth - [0:0]
:fail2ban-php-url-fopen - [0:0]
:fail2ban-postfix - [0:0]
:fail2ban-recidive - [0:0]
:fail2ban-sasl - [0:0]
:fail2ban-ssh - [0:0]
-A INPUT -p tcp -j fail2ban-recidive
-A INPUT -p tcp -m multiport --dports 3306 -j fail2ban-mysqld-auth
-A INPUT -p tcp -m multiport --dports 25,465,587,143,220,993,110,995 -j fail2ban-dovecot
-A INPUT -p tcp -m multiport --dports 25,465,587,143,220,993,110,995 -j fail2ban-sasl
-A INPUT -p tcp -m multiport --dports 25,465,587 -j fail2ban-postfix
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-php-url-fopen
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-nohome
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-modsecurity
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-overflows
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-noscript
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-multiport
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache
-A INPUT -p tcp -m multiport --dports 61000 -j fail2ban-ssh
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 61000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8008 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20:21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 587 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A INPUT -p udp -m udp --dport 137 -j ACCEPT
-A INPUT -p udp -m udp --dport 138 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 139 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 445 -j ACCEPT
-A INPUT -p udp -m udp --dport 445 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT
-A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT
-A FORWARD -p udp -m limit --limit 1/sec -j ACCEPT
-A FORWARD -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT
-A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK RST -m limit --limit 1/sec -j ACCEPT
-A FORWARD -i tun0 -o eth0 -j ACCEPT
-A FORWARD -i tun0 -o eth0 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 61000 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 123 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 8008 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 8008 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 20:21 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 587 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 110 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 995 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 137 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 138 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 139 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 445 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 445 -j ACCEPT
-A fail2ban-apache -j RETURN
-A fail2ban-apache-modsecurity -j RETURN
-A fail2ban-apache-multiport -j RETURN
-A fail2ban-apache-nohome -j RETURN
-A fail2ban-apache-noscript -j RETURN
-A fail2ban-apache-overflows -j RETURN
-A fail2ban-dovecot -j RETURN
-A fail2ban-mysqld-auth -j RETURN
-A fail2ban-php-url-fopen -j RETURN
-A fail2ban-postfix -j RETURN
-A fail2ban-recidive -j RETURN
-A fail2ban-sasl -j RETURN
-A fail2ban-ssh -j RETURN
COMMIT

Completed on Sun Dec 4 20:04:10 2016

Auriez vous une idée?

Merci pour votre temps!

Les règles iptables de la chaîne FORWARD sont aberrantes.
Je ne vois pas de MASQUERADE/SNAT.
Vérifier aussi si la fonction routeur est activée (ip_forward=1).

Bonsoir

Aberrantes cad? J’en aient testé plusieurs pour voir si changeais quelque chose.
Qu’est ce que MASQUERADE/SNAT stp?

net.ipv4.ip_forward = 1 est bien activé dans /etc/sysctl.conf.

Re, j’ai chercher des postes à ce sujet et je suis tomber sur ça et celà fonctionne.

Allow TUN interface connections to OpenVPN server

iptables -A INPUT -i tun+ -j ACCEPT

Allow TUN interface connections to be forwarded through other interfaces

iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT

Mais je ne comprends pas tout, est ce que quelqu’un pourrais m’expliquer en détails les chaines et ce que ça à changé à mon problème svp?

Merci

iptables -A INPUT -i tun+ -j ACCEPT
Inutile.

iptables -A FORWARD -i tun+ -j ACCEPT
Accepte tous les paquets entrant par une interface tun comme tun0 ("+" est un caractère générique “joker”) et ressortant par n’importe quelle interface.

iptables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Superflue car plus restrictive que la précédente.

iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
Accepte les paquets appartenant ou liés à une connexion existante entrant par eth0 et ressortant par une interface tun.

Pas eu besoin d’une règle SNAT ou MASQUERADE ? Etonnant.

Si en fait je l’avais déjà ajoutée:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Donc en fait si je rajoute juste:

iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

ça doit fonctionner?

J’avoue que j’ai du mal à comprendre le cheminement :slight_smile:
En gros le server vpn est comme une carte réseau qui va donner une ip sur le réseau local du server vpn.
Après il faut router les données vers la carte réseau physique pour avoir accès au réseau local du server debian. Puis les router pour que l’on puisse naviguer sur internet depuis le client vpn?

A quel moment interviennent les règles iptables précédentes?

MASQUERADE
Une passerelle (gateway) transforme les paquets sortants passant par elle pour donner l’illusion qu’ils sortent de la passerelle elle-même par un port alloué dynamiquement ; lorsque la passerelle recoit une réponse sur ce port, elle utilise une table de correspondance entre le port et les machines du réseau privé qu’elle gère pour lui faire suivre le paquet.

Pourquoi doit on donner l’illusion à la passerelles?

Merci de prendre du temps pour faire mon éducation!

up :slight_smile:

Eh ! on n’est pas aux pièces…

  1. Oui, avec ces trois règles ça doit fonctionner à peu près, modulo les éventuels messages d’erreur ICMP émis par le serveur/routeur qu’il faut autoriser dans OUTPUT si ce n’est pas déjà le cas (un routeur ne fait pas que retransmettre des paquets d’une interface vers une autre, il envoie aussi des messages de signalisation ICMP dans certains conditions, c’est là-dessus que se basent les outils comme traceroute pour afficher tous les routeurs traversés en chemin).

  2. Le serveur VPN fonctionne comme un routeur. Mais cela n’a rien à voir avec le fait que ce soit un serveur VPN. Un routeur, c’est une machine qui interconnecte plusieurs réseaux et dont le travail consiste à retransmettre les paquets d’un réseau à l’autre. Ici, le serveur interconnecte deux réseaux (voire plus) : le réseau local (LAN) et le(s) VPN. Sous Linux, c’est le paramètre du noyau ip_forward qui active la fonction routeur. Sans cela, ce serait juste une machine connectée à plusieurs réseaux, capable de communiquer avec chacun d’entre eux mais incapable de les faire communiquer entre eux.

Mais le routage, ce n’est pas magique. Il ne suffit pas qu’il y ait un routeur entre des réseaux pour que les machines de réseaux différents puissent communiquer les unes avec les autres. Chaque machine doit “savoir” qu’il y a un routeur dans son réseau et quels réseaux sont joignable par son intermédiaire. Ce savoir est contenu dans sa table de routage. Lorsqu’il établit un VPN, le client a de nouvelles routes car il est connecté à un nouveau réseau (le VPN), au bout duquel se trouve éventuellement un routeur et encore d’autres réseaux derrnière.

  1. Cela nous amène à la dernière question : à quoi sert la MASQUERADE, et plus généralement la NAT ?

Originellement, l’internet est basé sur le paradigme que chaque machine ou chaque interface connectée a une adresse qui est routable globalement sur tout le réseau, ce qu’on appelle aujourd’hui une adresse “publique” (ou “globale” en IPv6). Mais il y a bien longtemps que ce n’est plus vrai, car il n’y a plus assez d’adresses IPv4 publiques pour toutes les machines connectées à l’internet. La plupart des machines connectées aux box haut débit des FAI (qui sont des routeurs) ont des adresses dites “privées” dans trois plages : 10.0.0.0/8, 172.16.0.0/12, et la plus connue 192.168.0.0/16. Ces adresses ont l’inconvénient de ne pas être routées sur l’internet. Cela veut dire que si un routeur de l’internet reçoit un paquet destiné à une de ces adresses, il ne saura pas où l’envoyer.

Alors, quand une machine d’un réseau privé derrière une box envoie un paquet à une adresse extérieure via la box, celle-ci remplace l’adresse source privée du paquet par sa propre adresse (publique) et mémorise les caractéristiques du paquet et de la transformation effectuée. Ainsi le destinataire du paquet pourra envoyer un paquet en réponse à l’adresse de la box qui est routable sur l’internet ; la box le reconnaîtra comme une réponse au paquet envoyé, appliquera la transformation inverse et fera suivre le paquet à la machine destinataire qui ne se sera rendu compte de rien. Oui enfin, ça c’est quand ça marche bien, ce qui n’est pas toujours le cas.

Or ton VPN utilise des adresses privées. Avec la MASQUERADE, le serveur VPN fait pour ses clients ce que fait une box pour les machines de son réseau.

Un grand merci! J’aurais appris beaucoup de choses grâce à vous!