
Configurei uma rede OpenVPN e ela está funcionando corretamente no sentido de que posso acessar as máquinas internas/LAN do cliente remoto. No entanto, meu problema é que todo o tráfego das máquinas remotas aparece para as máquinas LAN como se viesse da máquina servidor OpenVPN, e não da máquina cliente.
Para explicar melhor, considere minha topologia de rede:
A máquina R conectou-se ao servidor OpenVPN na máquina A e recebeu o endereço IP 10.200.200.5.
A Máquina R então faz uma solicitação ao Apache em execução na Máquina B. A solicitação chega corretamente e recebo uma resposta. O problema é que a Máquina B vê a solicitação vindo de 192.168.0.10 (IP da Máquina A) e não de 10.200.200.5.
Eu gostaria do último.
Minha configuração atual
Máquina A
Este é um trecho das regras relevantes do iptables:
*nat
:PREROUTING ACCEPT [18:1080]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth0 -j MASQUERADE
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
// snip
# accept incoming VPN connections
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
# forward VPN traffic
-A FORWARD -s 10.200.200.0/25 -d 192.168.128.0/17 -i tun0 -j ACCEPT
-A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
Também habilitei o ip_forwarding:
echo 1 > /proc/sys/net/ipv4/ip_forward
.. e fiz as alterações apropriadas em /etc/sysctl.conf para torná-lo permanente.
Na configuração do OpenVPN, tenho:
server 10.200.200.0 255.255.255.128
push "route 192.168.0.0 255.255.255.0"
Máquina B
Como a Máquina A não é o gateway da Máquina B, adicionei manualmente uma rota na Máquina B da seguinte maneira:
ip route add 10.200.200.0/25 via 192.168.0.10 dev eth0
Para testar qual IP está sendo roteado, criei um pequeno script PHP chamadoshowip.php:
<?php echo "Your IP is: ", $_SERVER['REMOTE_ADDR'], "\n"; ?>
Máquina R
# wget -q -O - http://192.168.0.11/showip.php
Your IP is: 192.168.0.10
Como faço para dizer 10.200.200.5?
Atualizar
Para esclarecer, no meu caso particular, a Máquina A possui uma NIC (eth0) que atende tanto a LAN quanto a WAN.
Responder1
Respondendo à minha própria pergunta:
Como pano de fundo adicional, essas máquinas estão hospedadas no Linode. Acontece que eles usam mapas estáticos em seus switches para rotear o tráfego para nós específicos na LAN. Como os IPs de origem da VPN não fazem parte desses mapas estáticos, o tráfego não foi roteado para lugar nenhum.
Portanto, este é um problema específico do Linode, mas espero que possa ajudar outras pessoas a saber disso.
Responder2
Como você descobriu que a conexão entre a Máquina A e a Máquina B não é realmente uma Ethernet comutada e que ela só pode lidar com o tráfego usando os endereços IP atribuídos a você, você precisa encontrar outra solução.
Isto pode ser conseguido através do uso de um túnel. Existem vários tipos de túneis que podem ser usados. Uma delas é usar VPN, que pode ser a mais simples, pois a Máquina A já é um servidor VPN. Então você só precisa tornar a Máquina B um cliente VPN e adicionar entradas na tabela de roteamento para encaminhar os prefixos necessários por meio dessa conexão VPN.
Outra opção é usar um túnel GRE ou simplesmente IP sobre IP. Esses túneis e rotas associadas poderiam ser configurados estaticamente, o que lhes daria uma vantagem sobre a abordagem VPN.
Responder3
Na Máquina A você tem uma regra NAT, que faz com que ela altere o IP do cliente antes de rotear os pacotes para a Máquina B. A primeira coisa que você precisa fazer é remover essa regra NAT, de forma que os pacotes sejam encaminhados para a Máquina B sem modificações.
Esta alteração pode fazer com que as conexões parem de funcionar, caso a tabela de roteamento na Máquina B esteja incompleta. O que acontece neste caso é que os pacotes são entregues corretamente à Máquina B, mas ela não possui uma rota para devolver as respostas. Isso fará com que ele não responda ou envie as respostas para a Internet em vez de para o servidor VPN.
Na Máquina B você pode tentar adicionar uma rota com o seguinte comandoip route add 10.200.200.0/24 via 192.168.0.10