Encaminhamento de porta pelo OpenVPN

6

Aqui está o meu cenário. Eu tenho três hosts.

1) GATEWAY executando o OpenVPN Server. Tem 1 LAN IP (192.168.1.10) e 1 OpenVPN IP (10.8.0.1).

2) LOCAL-CLIENT, uma máquina dentro da mesma LAN do GATEWAY, com 1 LAN IP (192.168.1.12)

3) REMOTE-SERVER, um servidor MySQL que é um CLIENTE do OpenVPN Server. Tem 1 IP público e 1 IP OpenVPN (10.8.0.51).

Eu quero ser capaz de se conectar ao MySQL no REMOTE-SERVER de LOCAL-CLIENT através da VPN.

Até agora, eu habilitei o encaminhamento de IP e adicionei uma porta como esta:

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

Isso funciona do GATEWAY, eu posso conectar ao MySQL usando 192.168.1.10 como host. Mas quando eu tento do LOCAL-CLIENT eu recebo um erro "Conexão recusada" (usando o cliente MySQL ou o telnet para a porta 3306).

O que estou perdendo aqui?

BTW, também tentei encaminhar a porta HTTP para testar o Apache, que também está sendo executado no REMOTE-SERVER e obtenho os mesmos resultados, portanto, não é um problema do MySQL.

Mais informações:

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

Aqui estão meus iptables no GATEWAY (AFAIK, a maioria das regras são adicionadas pelo servidor OpenVPN). Isto é depois de aplicar as alterações sugeridas pelo @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 

Aqui está a tabela 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 

Editar:

Com base nos comentários do @ SmallClanger, percebi que não precisava fazer nenhum encaminhamento de porta ou NAT. O LOCAL-CLIENT é capaz de se conectar ao REMOTE-SERVER através do IP da sua VPN. Para isso, como meu gateway VPN não é o gateway padrão, tive que adicionar esta rota estática em LOCAL-CLIENT:

ip route add 10.8.0.0/24 via 192.168.1.10 dev eth0

Eu também tive que deletar esta regra FORWARD no iptables que estava impedindo que o LOCAL-CLIENT se conectasse a qualquer cliente VPN:

REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
    
por El Barto 18.04.2012 / 14:50

1 resposta

3

É porque a cadeia OUTPUT age apenas em pacotes originados de um processo local. (Veja esta imagem útil aqui .)

Se você substituir (ou complementar, se ainda desejar conectar-se ao formulário do gateway), essa regra será:

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

E, se você ainda não permitiu o tráfego:

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

Então sua conexão deve passar. Como ele já está funcionando no gateway, você pode ter certeza de que o MySQL está escutando corretamente e que seu servidor está aceitando a conexão.

No entanto, questiono se você realmente precisa do NAT. O roteamento sozinho deve lidar com isso, com a regra FORWARD apropriada. Esse roteamento pode ser estabelecido manualmente ou através da configuração do servidor VPN, isso depende dos seus requisitos. Se você quiser olhar para esta opção, você pode adicionar sua configuração do servidor openvpn e a saída de route -n ao seu post?

EDITAR

Para garantir as rotas de conexão de volta pela VPN, você precisará de uma rota para sua LAN a partir do servidor. Para adicionar isso manualmente no servidor MySQL:

route add -net 192.168.1.0/24 dev tun0 (se tun0 for sua interface de cliente VPN).

Se funcionar, é melhor adicionar isso à configuração do seu cliente VPN: route 192.168.1.0/24 (Isso criará automaticamente a rota na conexão, independentemente da interface do túnel ou dos endereços do ponto de extremidade PPP em uso)

Uma dica de depuração útil: tcpdump -i tun0 -qtln port 3306 no servidor mostrará o tráfego do mysql passando pelos adaptadores VPN (cliente ou servidor). Você deve poder ver onde o handshaking da conexão está dando errado.

    
por 18.04.2012 / 15:35