Executando um servidor VPN atrás do NAT do provedor

Um artigo sobre como consegui executar um servidor VPN atrás do NAT do meu provedor doméstico (sem um endereço IP branco). Deixe-me fazer uma reserva imediatamente: que o desempenho desta implementação depende diretamente do tipo de NAT utilizado pelo seu provedor, bem como do roteador.
Então, eu precisava conectar do meu smartphone Android ao meu computador doméstico, ambos os dispositivos estão conectados à Internet através de NATs do provedor, além do computador estar conectado através de um roteador doméstico, que também faz conexões NATs.
O esquema clássico que utiliza um VPS/VDS alugado com um endereço IP branco, bem como alugar um endereço IP branco a um fornecedor, não foi considerado por vários motivos.
Considerando experiência de artigos anteriores, tendo realizado diversos experimentos com STUNs e NATs de provedores. Decidi fazer uma pequena experiência executando o comando em um roteador doméstico executando 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
O valor de retorno é 0x000002

Tradução literal:
Mapeamento Independente - mapeamento independente
Filtro Independente - filtro independente
porta aleatória - porta aleatória
vai ser um grampo - haverá um grampo
Executando 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
O valor de retorno é 0x000006

Filtro Dependente de Porta - filtro dependente de porta
A diferença nos resultados da saída do comando indicou que o roteador doméstico estava dando “sua contribuição” para o processo de transmissão de pacotes da Internet; isso se manifestou no fato de que ao executar o comando no computador:

stun stun.sipnet.ru -p 11111 -v

Eu estava obtendo o resultado:

...
Endereço mapeado = XX.1XX.1X4.2XX:4398
...

neste momento foi aberta uma sessão UDP por algum tempo, se neste momento você enviar uma solicitação UDP (por exemplo: netcat XX.1XX.1X4.2XX 4398 -u), então a solicitação veio para o roteador doméstico, que foi confirmado pelo TCPDump em execução nele, mas a solicitação não chegou ao computador - o IPtables, como tradutor NAT no roteador, a descartou.
Executando um servidor VPN atrás do NAT do provedor
Mas o próprio fato de a solicitação UDP ter passado pelo NAT do provedor deu esperança de sucesso. Como o roteador está localizado 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 de qualquer endereço IP. Neste momento, lancei o servidor OpenVPN (tendo-o configurado anteriormente) ouvindo a porta UDP/11111, indiquei o endereço IP externo e a porta (XX.1XX.1X4.2XX:4398) no smartphone e conectei com sucesso do smartphone ao o computador. Mas nesta implementação surgiu um problema: era necessário manter de alguma forma a sessão UDP até que o cliente OpenVPN se conectasse ao servidor; não gostei da opção de lançar periodicamente o cliente STUN - não queria desperdiçar carga em os servidores STUN.
Também notei a entrada “vai ser um grampo - haverá um grampo", este modo

Hairpinning permite que uma máquina em uma rede local atrás de um NAT acesse outra máquina na mesma rede no endereço externo do roteador.

Executando um servidor VPN atrás do NAT do provedor
Como resultado, simplesmente resolvi o problema de manter uma sessão UDP - iniciei o cliente no mesmo computador do servidor.
Funcionou assim:

  • lançou o cliente STUN na porta local 11111
  • recebeu uma resposta com um endereço IP externo e porta XX.1XX.1X4.2XX:4398
  • enviou dados com endereço IP externo e porta para email (qualquer outro serviço é possível) configurado no smartphone
  • lançou o servidor OpenVPN em um computador ouvindo a porta UDP/11111
  • iniciou o cliente OpenVPN no computador especificando XX.1XX.1X4.2XX:4398 para conexão
  • a qualquer momento lancei o cliente OpenVPN no smartphone indicando o endereço IP e a porta (no meu caso o endereço IP não mudou) para conectar

Executando um servidor VPN atrás do NAT do provedor
Dessa forma, consegui me conectar ao meu computador a partir do meu smartphone. Esta implementação permite conectar qualquer cliente OpenVPN.

Prática

Você vai precisar de:

# apt install openvpn stun-client sendemail

Depois de escrever alguns scripts, alguns arquivos de configuração e gerar os certificados necessários (já que o cliente em um smartphone funciona apenas com certificados), obtivemos a implementação usual de um servidor OpenVPN.

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 envio de dados por email:

# 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

Os certificados foram gerados usando Este artigo.
Executando o script:

# ./vpn11.sh

Tornando-o primeiro executável

# chmod +x vpn11.sh

Do lado do smartphone

Ao instalar o aplicativo OpenVPN para Android, tendo copiado o arquivo de configuração, certificados e configurado, ficou assim:
Eu verifico meu e-mail no meu smartphoneExecutando um servidor VPN atrás do NAT do provedor
Eu edito o número da porta nas configuraçõesExecutando um servidor VPN atrás do NAT do provedor
Eu inicio o cliente e conectoExecutando um servidor VPN atrás do NAT do provedor

Enquanto escrevia este artigo, transferi a configuração do meu computador para o Raspberry Pi 3 e tentei rodar tudo em um modem LTE, mas não funcionou! Resultado do Comando

# stun stun.ekiga.net -p 11111

Cliente STUN versão 0.97
Primário: mapeamento independente, filtro dependente de porta, porta aleatória, gancho
O valor de retorno é 0x000006

valor Filtro Dependente de Porta não permitiu que o sistema fosse iniciado.
Mas o provedor doméstico permitiu que o sistema iniciasse no Raspberry Pi 3 sem problemas.
Em conjunto com uma webcam, com 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 em um smartphone para visualização (stream rtsp://10.2.0.1:8554/), acabou sendo um bom sistema de videovigilância remota, você também pode instalar o Samba, rotear o tráfego via VPN, controlar remotamente seu computador e muito mais mais...

Jogar aviator online grátis: hack aviator funciona

Como a prática tem mostrado, para organizar um servidor VPN, você pode prescindir de um endereço IP externo pelo qual precisa pagar, assim como acontece com um VPS/VDS alugado. Mas tudo depende do provedor. Claro, eu queria obter mais informações sobre os diferentes provedores e tipos de NATs usados, mas isso é apenas o começo...
Obrigado!

Fonte: habr.com

Adicionar um comentário