7 votes

Redirection de port via OpenVPN

Voici mon scénario. J'ai trois hôtes.

1) GATEWAY exécute un serveur OpenVPN. Il a 1 IP LAN (192.168.1.10) et 1 IP OpenVPN (10.8.0.1).

2) LOCAL-CLIENT, une machine dans le même LAN que GATEWAY, avec 1 IP LAN (192.168.1.12)

3) REMOTE-SERVER, un serveur MySQL qui est un CLIENT du serveur OpenVPN. Il a 1 IP publique et 1 IP OpenVPN (10.8.0.51).

Je veux pouvoir me connecter à MySQL sur REMOTE-SERVER depuis LOCAL-CLIENT à travers le VPN.

Jusqu'à présent, j'ai activé la redirection d'IP et ajouté une redirection de port comme suit :

echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A OUTPUT -p tcp --dport 3306 -j DNAT --to 10.8.0.51

Cela fonctionne à partir de GATEWAY, je peux me connecter à MySQL en utilisant 192.168.1.10 comme hôte. Mais lorsque j'essaie à partir de LOCAL-CLIENT, j'obtiens une erreur "Connection refused" (soit en utilisant le client MySQL, soit en utilisant telnet sur le port 3306).

Qu'est-ce qui m'échappe ?

BTW, j'ai également essayé de transférer le port HTTP pour tester Apache qui tourne également sur REMOTE-SERVER et j'obtiens les mêmes résultats, ce n'est donc pas un problème MySQL.

Plus d'informations :

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.8.0.2        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.8.0.0        10.8.0.2        255.255.255.0   UG    0      0        0 tun0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth1
5.5.0.0         0.0.0.0         255.255.252.0   U     0      0        0 as0t0
5.5.4.0         0.0.0.0         255.255.252.0   U     0      0        0 as0t1
5.5.8.0         0.0.0.0         255.255.252.0   U     0      0        0 as0t2
5.5.12.0        0.0.0.0         255.255.252.0   U     0      0        0 as0t3
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth1

Voici mon iptables sur GATEWAY (AFAIK, la plupart des règles sont ajoutées par le serveur OpenVPN). Ceci après avoir appliqué les changements suggérés par @SmallClanger.

iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
AS0_ACCEPT  all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
AS0_ACCEPT  all  --  0.0.0.0/0            0.0.0.0/0           
AS0_IN_PRE  all  --  0.0.0.0/0            0.0.0.0/0           mark match 0x2000000/0x2000000 
AS0_ACCEPT  tcp  --  0.0.0.0/0            192.168.1.10        state NEW tcp dpt:915 
AS0_ACCEPT  tcp  --  0.0.0.0/0            192.168.1.10        state NEW tcp dpt:914 
AS0_ACCEPT  udp  --  0.0.0.0/0            192.168.1.10        state NEW udp dpt:917 
AS0_ACCEPT  udp  --  0.0.0.0/0            192.168.1.10        state NEW udp dpt:916 
AS0_WEBACCEPT  all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
AS0_WEBACCEPT  tcp  --  0.0.0.0/0            192.168.1.10        state NEW tcp dpt:943 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
AS0_ACCEPT  all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
AS0_IN_PRE  all  --  0.0.0.0/0            0.0.0.0/0           mark match 0x2000000/0x2000000 
AS0_OUT_S2C  all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  10.8.0.0/24          0.0.0.0/0           
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable 
ACCEPT     tcp  --  0.0.0.0/0            10.8.0.51           tcp dpt:3306 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
AS0_OUT_LOCAL  all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_ACCEPT (7 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_DNS (2 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            172.20.2.26         
DROP       all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_IN (4 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            5.5.0.1             
ACCEPT     all  --  0.0.0.0/0            10.8.0.1            
ACCEPT     all  --  0.0.0.0/0            192.168.1.0/24      
AS0_IN_POST  all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_IN_POST (1 references)
target     prot opt source               destination         
AS0_OUT    all  --  0.0.0.0/0            0.0.0.0/0           
DROP       all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_IN_PRE (2 references)
target     prot opt source               destination         
AS0_DNS    tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:53 
AS0_DNS    udp  --  0.0.0.0/0            0.0.0.0/0           state NEW udp dpt:53 
AS0_IN     all  --  0.0.0.0/0            5.5.0.0/20          
AS0_IN     all  --  0.0.0.0/0            192.168.0.0/16      
AS0_IN     all  --  0.0.0.0/0            172.16.0.0/12       
AS0_IN     all  --  0.0.0.0/0            10.0.0.0/8          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_OUT (2 references)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_OUT_LOCAL (1 references)
target     prot opt source               destination         
DROP       icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 5 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_OUT_S2C (1 references)
target     prot opt source               destination         
AS0_OUT    all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_WEBACCEPT (2 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0 

Voici le tableau NAT

iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
AS0_NAT_PRE_REL_EST  all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
AS0_DPFWD_UDP  udp  --  0.0.0.0/0            192.168.1.10        udp dpt:1194 state NEW 
AS0_DPFWD_TCP  tcp  --  0.0.0.0/0            192.168.1.10        tcp dpt:443 state NEW 
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3306 to:10.8.0.51 

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
AS0_NAT_POST_REL_EST  all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
AS0_NAT_PRE  all  --  0.0.0.0/0            0.0.0.0/0           mark match 0x2000000/0x2000000 
MASQUERADE  all  --  10.8.0.0/24          0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain AS0_DPFWD_TCP (1 references)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0           to:192.168.1.10:914 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_DPFWD_UDP (1 references)
target     prot opt source               destination         
DNAT       udp  --  0.0.0.0/0            0.0.0.0/0           to:192.168.1.10:916 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_NAT (2 references)
target     prot opt source               destination         
SNAT       all  --  0.0.0.0/0            0.0.0.0/0           to:192.168.1.10 
SNAT       all  --  0.0.0.0/0            0.0.0.0/0           to:10.8.0.1 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_NAT_POST_REL_EST (1 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_NAT_PRE (1 references)
target     prot opt source               destination         
AS0_NAT_TEST  all  --  0.0.0.0/0            5.5.0.0/20          
AS0_NAT_TEST  all  --  0.0.0.0/0            192.168.0.0/16      
AS0_NAT_TEST  all  --  0.0.0.0/0            172.16.0.0/12       
AS0_NAT_TEST  all  --  0.0.0.0/0            10.0.0.0/8          
AS0_NAT    all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_NAT_PRE_REL_EST (1 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_NAT_TEST (4 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            5.5.0.0/20          
AS0_NAT    all  --  0.0.0.0/0            0.0.0.0/0 

Editer :

En me basant sur les commentaires de @SmallClanger, j'ai réalisé que je n'avais pas besoin de faire de transfert de port ou de NAT. LOCAL-CLIENT est capable de se connecter à REMOTE-SERVER à travers l'IP de son VPN. Pour cela, comme ma passerelle VPN n'est pas la passerelle par défaut, j'ai dû ajouter cette route statique sur LOCAL-CLIENT :

ip route add 10.8.0.0/24 via 192.168.1.10 dev eth0

J'ai également dû supprimer cette règle FORWARD sur iptables qui empêchait LOCAL-CLIENT de se connecter à n'importe quel client VPN :

REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable

5voto

SmallClanger Points 8832

C'est parce que la OUTPUT n'agit que sur les paquets provenant d'un processus local. (Voir cette image utile aquí .)

Si vous remplacez (ou complétez si vous voulez toujours vous connecter depuis la passerelle) cette règle par :

iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to 10.8.0.51

Et, si vous ne l'avez pas encore fait, tenez compte du trafic :

iptables -t filter -A FORWARD -p tcp -d 10.8.0.51 --dport 3306 -j ACCEPT

Votre connexion devrait alors être établie. Puisque la passerelle fonctionne déjà, vous pouvez être sûr que MySQL écoute correctement et que son serveur accepte la connexion.

Toutefois, je me demande si vous avez réellement besoin de la NAT. Le routage à lui seul devrait gérer cela, avec l'aide de l'outil FORWARD règle. Ce routage peut être établi manuellement ou via la configuration du serveur VPN, en fonction de vos besoins. Si vous voulez regarder cette option, pouvez-vous ajouter votre configuration de serveur openvpn et la sortie de route -n à votre message ?

EDIT

Pour garantir que la connexion repasse par le VPN, vous aurez besoin d'une route vers votre réseau local à partir du serveur. Pour ajouter cette route manuellement sur le serveur MySQL :

route add -net 192.168.1.0/24 dev tun0 (si tun0 est votre interface client VPN).

Si cela fonctionne, il est préférable de l'ajouter à la configuration de votre client VPN : route 192.168.1.0/24 (Cela créera automatiquement la route lors de la connexion, quelle que soit l'interface du tunnel ou les adresses d'extrémité PPP utilisées).

Une astuce de débogage utile : tcpdump -i tun0 -qtln port 3306 sur le serveur vous montrera le trafic mysql passant par les adaptateurs VPN (client ou serveur). Vous devriez être en mesure de voir où l'établissement de la connexion ne se fait pas correctement.

SistemesEz.com

SystemesEZ est une communauté de sysadmins 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