Este artigo é sobre como eu consegui iniciar o servidor VPN atrás do NAT do provedor doméstico (sem um endereço IP branco). Farei uma reserva imediatamente: o
desempenho dessa implementação depende diretamente do tipo de NAT usado pelo seu provedor e pelo roteador .
Então, eu precisava conectar do meu smartphone Android ao meu computador doméstico, ambos os dispositivos estão conectados à Internet através dos ISPs, além do computador estar conectado através de um roteador doméstico, que também possui conexões NAT.
O esquema clássico usando um VPS / VDS alugado com um endereço IP branco, além de alugar um endereço IP branco do provedor, não foi considerado por vários motivos.
Com base na
experiência de artigos anteriores , tendo realizado várias experiências com STUNs e fornecedores de NAT. Decidi fazer um pequeno experimento executando o comando em um roteador doméstico executando no firmware OpenWRT:
$ stun stun.sipnet.ru
obteve o resultado:
Cliente STUN versão 0.97
Primário: Mapeamento Independente, Filtro Independente, porta aleatória, gancho de cabelo
O valor de retorno é 0x000002
Tradução literal:
Mapeamento Independente - Mapeamento Independente
Filtro Independente - Filtro Independente
porta aleatória - porta aleatória
gancho de cabelo - haverá um gancho de cabelo
Tendo executado um comando semelhante no meu PC, obtive:
Cliente STUN versão 0.97
Primário: mapeamento independente, filtro dependente de porta, porta aleatória, gancho de cabelo
O valor de retorno é 0x000006
Filtro dependente de porta - filtro dependente de porta
A diferença na saída dos comandos indicou que o roteador doméstico deu sua contribuição ao processo de transmissão de pacotes da Internet, isso se manifestou no fato de que, quando o comando foi executado no computador:
stun stun.sipnet.ru -p 11111 -v
Eu obtive o resultado:
...
MappedAddress = XX.1XX.1X4.2XX: 4398
...
Nesse momento, uma sessão UDP foi aberta por um tempo, se nesse momento uma solicitação UDP foi enviada (por exemplo: netcat XX.1XX.1X4.2XX 4398 -u), a solicitação chegou ao roteador doméstico, o que foi confirmado pelo TCPDump em execução, mas o pedido não chegou ao computador - o IPtables o soltou no roteador como um tradutor NAT.

Mas o fato de uma solicitação UDP ter passado pelo ISP NAT deu esperança de sucesso. Como o roteador está na minha jurisdição, resolvi o problema redirecionando a porta UDP / 11111 para o computador:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX
Assim, consegui iniciar uma sessão UDP e receber solicitações da Internet a partir de qualquer endereço IP. Nesse momento, lancei o servidor OpenVPN (com pré-configuração) ouvindo a porta UDP / 11111, indicada no smartphone o endereço IP externo e a porta (XX.1XX.1X4.2XX: 4398) e conectada com êxito do smartphone ao computador. Mas nesta implementação, surgiu um problema, era necessário manter de alguma forma uma sessão UDP até que o cliente OpenVPN estivesse conectado ao servidor, não gostei da opção de iniciar periodicamente o cliente STUN - não queria desperdiçar servidores STUN por nada.
Também chamou a atenção para a entrada "
vai hairpin - haverá um hairpin ", este modo
O hairpinning permite que uma máquina na rede local para o NAT acessar outra máquina na mesma rede no endereço externo do roteador.

Como resultado, o problema de manter uma sessão UDP foi simplesmente resolvido - iniciei o cliente no mesmo computador com o servidor.
Funcionou assim:
- lançou um cliente STUN com porta local 11111
- Recebeu uma resposta com um endereço IP externo e porta XX.1XX.1X4.2XX: 4398
- enviou dados com um endereço IP externo e porta para correio (qualquer outro serviço é possível) configurado no smartphone
- lançou o servidor OpenVPN em um computador com escuta de porta UDP / 11111
- lançou o cliente OpenVPN no computador com a indicação XX.1XX.1X4.2XX: 4398 para conectar
- a qualquer momento, iniciei o cliente OpenVPN no smartphone com o endereço IP e a porta (no meu caso, o endereço IP não mudou) para conectar

Assim, tive a oportunidade de me conectar ao meu computador a partir de um smartphone. Esta implementação permite conectar qualquer cliente OpenVPN.
Prática
Você precisará de:
Após escrever alguns scripts, alguns arquivos de configuração, gerando os certificados necessários (como o cliente no smartphone funciona apenas com certificados), foi obtida a implementação usual do servidor OpenVPN.
O script principal no computador
Script para enviar dados para o correio:
Arquivo de configuração do servidor:
proto udp dev tun ca /home/vpn11-srv/ca.crt cert /home/vpn11-srv/server.crt key /home/vpn11-srv/server.key dh /home/vpn11-srv/dh2048.pem server 10.2.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt tls-server tls-auth /home/vpn11-srv/ta.key 0 tls-timeout 60 auth SHA256 cipher AES-256-CBC client-to-client keepalive 10 30 comp-lzo max-clients 10 user nobody group nogroup persist-key persist-tun log /var/log/vpn11-server.log verb 3 mute 20
Arquivo de configuração do cliente:
client dev tun proto udp ca "/home/vpn11-srv/ca.crt" cert "/home/vpn11-srv/client1.crt" key "/home/vpn11-srv/client1.key" tls-client tls-auth "/home/vpn11-srv/ta.key" 1 auth SHA256 cipher AES-256-CBC auth-nocache comp-lzo user nobody group nogroup persist-key persist-tun log /var/log/vpn11-clent.log verb 3 mute 20 ping 10 ping-exit 30
A geração de certificado foi realizada
neste artigo .
Execução de script:
Tendo tornado executável anteriormente
No lado do smartphone
Depois de instalar o aplicativo
OpenVPN para Android , copiar o arquivo de configuração, certificados e configurá-lo, ficou assim:
Verifico as mensagens em um smartphone Corrijo o número da porta nas configurações Eu inicio o cliente e conecto No processo de redação do artigo, transferi a configuração do computador para o Raspberry Pi 3 e tentei executar tudo no modem LTE, mas não funcionou! Resultado da equipe
Cliente STUN versão 0.97
Primário: mapeamento independente, filtro dependente de porta, porta aleatória, gancho de cabelo
O valor de retorno é 0x000006
o valor do
filtro dependente de
porta não permitiu que o sistema iniciasse.
Mas o fornecedor doméstico sem problemas deixa o sistema Raspberry Pi 3 inicializar.
Em conjunto com uma webcam, com o VLC para
criando um fluxo RTSP a partir de uma webcam $ cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{vcodec=x264,venc=x264{preset=ultrafast,profile=baseline,level=31},vb=2048,fps=12,scale=1,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none}:rtp{sdp=rtsp://10.2.0.1:8554/}' --no-sout-all --sout-keep
e VLC no smartphone para visualização (fluxo rtsp: //10.2.0.1: 8554 /), acabou não sendo um mau sistema de vigilância por vídeo a distância, você também pode aumentar o Samba e trocar arquivos, rotear tráfego via VPN,
controlar remotamente um computador e muito mais ...
Conclusão
Como a prática demonstrou, para organizar um servidor VPN, você pode ficar sem um endereço IP externo pelo qual você deve pagar, bem como por um VPS / VDS alugado. Mas tudo depende do provedor. Claro que eu queria obter mais informações sobre os vários provedores e os tipos de NATs usados, mas este é apenas o começo ...
Obrigado pela atenção!