Como posso conseguir o roteamento do cliente OpenVPN sem NAT no Linode

Como posso conseguir o roteamento do cliente OpenVPN sem NAT no Linode

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:

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

informação relacionada