Iptables NAT com alias (apelido) de interface de rede em servidor VPS

Mais um “Precisei Postei”, agora resolvendo problemas de nat para instalar um servidor OpenVPN em um VPS.

Devido ao bloqueio do Whatsapp, muitos estão utilizando aplicativos  das  lojas de aplicativos do sistema de seus celulares. Como tenho um servidor VPS na nuvem, decidi utiliza-lo, juntamente  com o pacote (para VPN ) OpenVPN  e   fazer pass-through saindo pela rede do servidor VPS que não fica aqui no Brasil.

Para a instalação do OpenVPN utilizei o tutorial do wiki oficial do projeto Debian http://wiki.debian.org/OpenVPN, para essa distribuição. Foi a documentação mais completa e melhor  redigida que achei.

PROBLEMA:

Após a instalação e configuração do OpenVPN encontrei problemas para fazer o pass-through pela rede do VPS, mesmo ele tendo rota para o gateway de internet.

A interface de rede que está configurada com IP externo, é uma interface com alias(apelido), geralmente utilizadas para atribuirmos mais de um IP a mesma interface de rede.

Ex: eth0:0, eth0:1

O Firewall iptables  possui uma restrição sobre utilização de alias de interface. Ele NÃO aceita, isso por agir em uma camada mais abaixo sendo assim, não reconhece os alias atribuídos pelo SO.

Como a interface de rede que está configurado o IP externo no VPS é uma interface virtual com alias derivada da interface “principal (que no meu caso é a interface de  loopback). A  regra de nat para mascarar o ip de origem de minhas conexões não funciona.

Exemplo:

IPTABLES -t nat -A POSTROUTING -s IP_REDE_VPN -o eth0:0  j MASQUERADE

eth0:0  -É o alias que contém o IP Externo do meu host e está com rota para internet.Esse tipo de atribuição NÃO é aceito pelo iptables.

 

PARA SOLUCIONAR:

Utilizei um recurso do iptables que é o sinal de mais “+” logo após a descrição da interface de rede (ex: eth+, wlan+…)

Conforme o Manual do iptables:   

             ” If the interface name ends in a “+”, then any interface which
                  begins with this name will match.”

Se o nome da interface termina com” +”, então cada interface que inicia com esse nome irá ter um match em sua regra.

Exemplo:

IPTABLES -t nat -A POSTROUTING -s IP_REDE_VPN/MASCARA -o eth+ -j MASQUERADE

Incluindo essa opção,  consegui fazer o pass-through de minha conexão através da VPS  e sair pelo gateway dela.

Para TESTAR e VALIDAR o objetivo, baixei o aplicativo openvpn para meu celular e o configurei com o profile gerado na configuração do Openvpn server .


 

IMPORTANTE!!!:

1) A descrição do man do iptables informa que todas as interfaces que começarem com o nome antes do “+” irão ter match, logo se a interface “principal” estiver sendo utilizada com outros alias, o tráfego da interface da rede VPN será redirecionado com mascaramento também para essas outras interfaces.

Não consigo agora vislumbrar um cenário que isso possa causar uma confusão nas respostas do ao servidor VPN, porém deve existir.

No meu caso, a interface de loopback estava configurada como interface “principal” sendo seu alias o IP_Externo do meu hosts VPS. Essa configuração muitas vezes é utilizada em ambiente de clusters e virtualização (REF: https://www.ibm.com/support).

Como todo tráfego acaba passando por essa interface “principal” e não existia outro alias, verifiquei que para mim seria a melhor opção!

2) Existe uma alternativa em alguns sites que é de substituir a opção  “-o interface” por  “-d ip externo_servidor_VPS” da interface alias . Essa regra, NÃO funcionou. Acredito que seja pela ordem de ação da regra de nat do iptables.

Ex:  IPTABLES -t nat -A POSTROUTING -s IP_REDE_VPN/MASCARA -d IP_EXTERNO_SERVIDOR_VPN -j MASQUERADE

valeu, té+!!


 

 

Configuração do sistema utilizado:

Sistema: Linux

Distribuição: Debian Jessie 8.4

REFERENCIAS:

Man Page IPTABLES

https://wiki.debian.org/OpenVPN

https://www.ibm.com/support/knowledgecenter/

 

Ajude a outros..Compartilhe!!

4 thoughts on “Iptables NAT com alias (apelido) de interface de rede em servidor VPS

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *