Iniciando um servidor VPN atrás do provedor NAT

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.

imagem
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:
 # apt install openvpn stun-client sendemail 

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


 # cat vpn11.sh 

 #!/bin/bash until [[ -n "$iftosrv" ]]; do echo "$(date)   "; iftosrv=`ip route get 8.8.8.8 | head -n 1 | sed 's|.*dev ||' | awk '{print $1}'`; sleep 5; done ABSOLUTE_FILENAME=`readlink -f "$0"` DIR=`dirname "$ABSOLUTE_FILENAME"` localport=11111 until [[ $a ]]; do address=`stun stun.sipnet.ru -v -p $localport 2>&1 | grep "MappedAddress" | sort | uniq | head -n 1 | sed 's/:/ /g' | awk '{print $3" "$4}'` ip=`echo "$address" | awk {'print $1'}` port=`echo "$address" | awk {'print $2'}` srv="openvpn --config $DIR/server.conf --port $localport --daemon" $srv echo "$(date)      $ip:$port" $DIR/sendemail.sh "OpenVPN-Server" "$ip:$port" sleep 1 openvpn --config $DIR/client.conf --remote $ip --port $port echo "$(date) C    " for i in `ps xa | grep "$srv" | grep -v grep | awk '{print $1}'`; do kill $i && echo "$(date)    $i ($srv)" done echo " 15 " sleep 15 done 

Script para enviar dados para o correio:
 # cat sendemail.sh 

 #!/bin/bash from=" " pass="" to="" theme="$1" message="$2" server="smtp.yandex.ru:587" sendEmail -o tls=yes -f "$from" -t "$to" -s "$server" -xu "$from" -xp "$pass" -u "$theme" -m "$message" 

Arquivo de configuração do servidor:
 # cat server.conf 

 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:
 # cat client.conf 

 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:
 # ./vpn11.sh 

Tendo tornado executável anteriormente
 # chmod +x vpn11.sh 

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
 # stun stun.ekiga.net -p 11111 

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!

Source: https://habr.com/ru/post/pt482888/


All Articles