Executando um servidor VPN atrás do NAT do provedor

Um artigo sobre como consegui lançar servidor VPN por trás do NAT do provedor de hospedagem (sem um endereço IP público). Deixe-me esclarecer imediatamente: o desempenho desta implementação depende diretamente do tipo de NAT utilizado pelo seu provedor, bem como do roteador.
Então, eu precisava me conectar com meu Android- Um smartphone conectado a um computador doméstico, ambos os dispositivos conectados à Internet através de NATs do provedor, e o computador conectado através de um roteador doméstico, que também realiza NATs nas conexões.
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

Isso me deu a capacidade de iniciar uma sessão UDP e receber solicitações da Internet de qualquer endereço IP. Nesse ponto, eu lancei OpenVPNCom o servidor (pré-configurado) escutando na porta UDP/11111, especifiquei o endereço IP externo e a porta (XX.1XX.1X4.2XX:4398) no smartphone e consegui conectar o smartphone ao computador. No entanto, essa implementação apresentou um problema: eu precisava manter a sessão UDP ativa até que a conexão fosse estabelecida. OpenVPN-Da comunicação cliente para servidor, eu não gostei da opção de iniciar o cliente STUN periodicamente - eu não queria sobrecarregar os servidores STUN desnecessariamente.
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çado OpenVPN- um servidor em um computador que escuta na porta UDP/11111
  • lançado OpenVPN- um cliente em um computador especificando XX.1XX.1X4.2XX:4398 para conexão
  • lançado a qualquer momento OpenVPN- um cliente em um smartphone com o endereço IP e a porta (no meu caso, o endereço IP não mudou) para conexão

Executando um servidor VPN atrás do NAT do provedor
Dessa forma, consegui me conectar ao meu computador a partir do meu smartphone. Essa implementação permite que você conecte qualquer pessoa. OpenVPN-cliente.

Prática

Você vai precisar de:

# apt install openvpn stun-client sendemail

Após escrever alguns scripts, alguns arquivos de configuração e gerar os certificados necessários (já que o cliente no smartphone funciona apenas com certificados), obtivemos uma implementação padrão. OpenVPN-servidores.

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 demonstrado, para organizar um servidor VPN você pode prescindir de um endereço IP externo pelo qual você precisa pagar, assim como acontece com um endereço IP alugado. VPS / VDSMas tudo depende do provedor. Claro, eu gostaria de obter mais informações sobre os diferentes provedores e os tipos de NAT que eles usam, mas isso é só o começo...
Obrigado!

Fonte: habr.com

Compre hospedagem confiável para sites com proteção DDoS, servidores VPS VDS 🔥 Compre hospedagem de sites confiável com proteção contra DDoS, servidores VPS/VDS | ProHoster