Porta encaminhada para o cliente VPN?

21

Encontrei um pouco de quebra-cabeça e não tive muita sorte em encontrar uma solução. No momento, estou (infelizmente) conectado à rede via Verizon 3G. Eles filtram todo o tráfego recebido, por isso é impossível abrir portas para aceitar conexões.

Atualmente, tenho uma máquina virtual Linux em linode.com, e pensei em instalar pptpde tentar fazer o iptablesencaminhamento de portas. Eu pptpdinstalei e minha máquina doméstica conecta-se com facilidade. Dito isto, aqui estão algumas informações gerais:

IP da WAN do servidor (Debian): xxxx no eth0 - IP do pptpd: aaa1 no ppp0 - IP da VPN do cliente: aaaa100

Para verificar se eu não estava enlouquecendo, tentei algumas conexões do servidor para as portas abertas no cliente, e o cliente aceita as conexões pelo IP da VPN.

O que eu quero realizar é o seguinte:

Internet -> IP da WAN: Porta -> Encaminhar para o cliente VPN IP: Porta

Por exemplo, se eu tivesse a porta 6000 aberta no meu cliente, uma pessoa poderia telnetar para xxxx: 6000 e o servidor pegaria isso e encaminharia para 192.168.3.100:6000.

Eu tentei pelo menos 20 iptablesconfigurações diferentes no Google e nenhuma funcionou ainda. Alguém tem alguma idéia, ou talvez uma abordagem totalmente diferente, da qual eu possa não estar ciente? O objetivo aqui é ouvir através de uma conexão horrivelmente protegida por firewall, de preferência o tráfego TCP e UDP.

Vile Brigandier
fonte

Respostas:

25

Você precisa fazer três coisas no seu servidor VPN (o Linode) para fazer isso funcionar:

  1. Você deve ativar o encaminhamento de IP:

    sysctl -w net.ipv4.ip_forward=1
    
  2. Configure o NAT de destino (DNAT) para encaminhar a porta. Você provavelmente já descobriu isso porque é um material de encaminhamento de porta padrão, mas para ser completo:

    iptables -t nat -A PREROUTING -d x.x.x.x -p tcp --dport 6000 -j DNAT --to-dest y.y.y.100:6000
    
  3. Configure o NAT de origem (SNAT) para que, da perspectiva do seu cliente VPN, a conexão seja proveniente do servidor VPN:

    iptables -t nat -A POSTROUTING -d y.y.y.100 -p tcp --dport 6000 -j SNAT --to-source y.y.y.1
    

O motivo pelo qual você precisa do SNAT é que, caso contrário, o seu cliente VPN enviará seus pacotes de retorno diretamente ao host que iniciou a conexão (zzzz) por meio do gateway padrão (por exemplo, Verizon 3G), e não pela VPN. Portanto, o endereço IP de origem nos pacotes de retorno será o seu endereço 3G da Verizon, e não xxxx. Isso causa todos os tipos de problemas, já que o zzzz realmente iniciou a conexão com xxxx.

Na maioria das configurações de encaminhamento de porta, o SNAT não é necessário porque o host que realiza o encaminhamento de porta também é o gateway padrão para o host de destino (por exemplo, um roteador doméstico).

Observe também que se você deseja encaminhar a porta 6000 para uma porta diferente (por exemplo, 7000), a regra SNAT deve corresponder a 7000, e não a 6000.

AGWA
fonte
Olá AGWA, Obrigado pela resposta. Eu já estava com ip_forwarding e suas regras funcionaram perfeitamente, embora não inicialmente. O problema foi (no meu noobness iptables) que eu não percebi o iptables -F não liberou as entradas nat e o iptables -L não estava listando-as. Depois de descobrir como listá-los corretamente, notei várias entradas conflitantes das tentativas anteriores. Após liberar e experimentar suas regras, ele funciona perfeitamente. Uma pergunta rápida, porém, nas suas regras, você especifica tcp. Alterar isso para "todos" funcionaria para o tráfego TCP / UDP?
Vile Brigandier
De nada! (A propósito, eu gosto de usar iptables-savepara mostrar minhas regras do iptables - embora a saída não seja destinada ao consumo humano, ainda é legível e mostra todas as regras do iptables.) Não, infelizmente você não pode usar "todos" lá, porque --dportapenas trabalha com protocolos que realmente possuem portas ("todos" incluiriam, por exemplo, ICMP, que não tem noção de portas). Você precisará de regras separadas para TCP e UDP.
AGWA 15/11/12
Obrigado pela dica do iptables-save. Tudo funciona como esperado para TCP e UDP. Felicidades.
Vile Brigandier
2
Apenas uma atualização para esta resposta é que, com o iproute2, você pode realmente configurar seu cliente VPN para ter 2 gateways e rotear o tráfego DNAT de volta pela VPN. Isso é benéfico se você não quiser usar o SNAT e parecer que todo o tráfego vem do servidor vpn. thomas-krenn.com/en/wiki/Two_Default_Gateways_on_One_System inclui informações sobre como configurar isso.
PressingOnAlways
Funciona para mim desde que o ufw esteja desativado, mesmo que eu tenha permitido 8080 no ufw, mas assim que eu ativar o ufw, esse material de encaminhamento não funcionará .. alguma idéia?
Sudhir N
3

Eu também tive esse problema e tentei resolvê-lo por horas .. Aqui está minha solução:

  • Eu tinha mais de um VPNClientcom o mesmo IPAddress. Então eu dei a cada um deles uma estáticaIPAddress

Defina um diretório em que os scripts do cliente devem ser armazenados, por exemplo, / etc / openvpn / staticclients e crie o diretório

mkdir /etc/openvpn/staticclients

Inclua este diretório como opção no seu arquivo de configuração openvpn no servidor:

client-config-dir /etc/openvpn/staticclients

Para cada cliente, você precisa criar um arquivo. O nome do arquivo deve corresponder ao common nameatributo que foi especificado no certificado do cliente. Este comando obtém o CN do certificado do computador:

Este exemplo envia o IPAddress10.1.134.110/10.1.134.109 ao cliente com o common name TESTCLIENT e também envia uma rota adicional para a sub-rede 10.1.135.0.

cat /etc/openvpn/staticclients/TESTCLIENT

ifconfig-push 10.1.134.110 10.1.134.109
push "route 10.1.135.0 255.255.255.0 10.1.134.62"
sysctl -w net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp --dport 28006 -j DNAT --to 10.1.134.110
Dominic Jonas
fonte
2

A maioria dos servidores tem o encaminhamento de IP desabilitado na configuração padrão. Você precisa habilitá-lo se quiser redirecionar as conexões de entrada através da sua VPN.

Tente o seguinte:

sysctl -w net.ipv4.ip_forward = 1

Quero dizer, além da configuração do iptables.

Andrey Voitenkov
fonte
0

O que você deseja alcançar é (provavelmente) muito possível com pptpdou OpenVPN e iptables; no entanto, você pode achar que tinc é um candidato melhor para esse caso de uso. Acabei de ler isso, que descreve como configurar o tinc exatamente para este caso de uso. É uma alternativa (potencialmente mais simples) à parte pptdpou ao OpenVPN. Então você precisaria exatamente das mesmas regras para o iptables.

chmac
fonte