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.ruobteve 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 -vEu 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.

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.XXXIsso 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.

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

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 sendemailApó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
doneScript 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.confproto 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 20Arquivo de configuração do cliente:
# cat client.confclient
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 30Os certificados foram gerados usando Este artigo.
Executando o script:
# ./vpn11.shTornando-o primeiro executável
# chmod +x vpn11.shDo 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 smartphone
Eu edito o número da porta nas configurações
Eu inicio o cliente e conecto
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 11111Cliente 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-keepe 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
