Cumincià un servitore VPN daretu à u NAT di un fornitore

Un articulu nantu à cumu aghju riesciutu à gestisce un servitore VPN daretu à u NAT di un fornitore di casa (senza un indirizzu IP biancu). Lasciami dì subitu: a prestazione di sta implementazione dipende direttamente da u tipu di NAT utilizatu da u vostru fornitore, è ancu da u router.
Allora, aghju avutu bisognu di cunnette da u mo smartphone Android à u mo computer di casa, i dui dispositi sò cunnessi à Internet per mezu di NAT di u fornitore, più l'urdinatore hè cunnessu cù un router di casa, chì ancu e cunnessione NAT.
U schema classicu chì utilizeghja un VPS / VDS affittu cù un indirizzu IP biancu, è ancu affittu un indirizzu IP biancu da u fornitore, ùn hè micca cunsideratu per parechje motivi.
Pigliendu in contu sperienza di articuli passati, dopu avè passatu parechji esperimenti cù STUN è NAT di i fornituri. Aghju decisu di un picculu esperimentu eseguendu u cumandimu nantu à un router di casa chì esegue firmware OpenWRT:

$ stun stun.sipnet.ru

ottene u risultatu:

Versione client STUN 0.97
Primariu: Mappatura Indipendente, Filtru Indipendente, portu aleatoriu, sarà hairpin
u valore di ritornu hè 0x000002

traduzzione letterale:
Mappatura Indipendente - display indipendente
Filtru indipendente - filtru indipendente
random port - portu casuale
will hairpin - ci sarà un hairpin
Dopu avè eseguitu un cumandamentu simili in u mo PC, aghju avutu:

Versione client STUN 0.97
Primariu: Mappatura Indipendente, Filtru Dipendente di Portu, portu aleatoriu, sarà hairpin
u valore di ritornu hè 0x000006

Port Dependent Filter - filtru dipendente di u portu
A sfarenza in i risultati di l'output di i cumandamenti indicava chì u router di casa hà fattu "a so cuntribuzione" à u prucessu di trasmissione di pacchetti da Internet, questu hè statu manifestatu in u fattu chì quandu u cumandamentu era eseguitu in l'urdinatore:

stun stun.sipnet.ru -p 11111 -v

aghju u risultatu:

...
MappedAddress = XX.1XX.1X4.2XX: 4398
...

in quellu mumentu, una sessione UDP hè stata aperta per un tempu, se in quellu mumentu una dumanda UDP hè stata mandata (per esempiu: netcat XX.1XX.1X4.2XX 4398 -u), a dumanda hè ghjunta à u router di casa, chì era cunfirmatu da TCPDump in esecuzione, ma a dumanda ùn hà micca ghjuntu à l'urdinatore - IPtables cum'è un traduttore NAT in u router l'abbandunò.
Cumincià un servitore VPN daretu à u NAT di un fornitore
Ma u fattu stessu di passà una dumanda UDP attraversu u NAT di u fornitore hà datu a speranza di successu. Siccomu u router hè in a mo ghjuridizione, aghju risoltu u prublema reindirizzendu u portu UDP / 11111 à l'urdinatore:

iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX

Cusì, aghju avutu l'uppurtunità di inizià una sessione UDP è riceve richieste da Internet da qualsiasi indirizzu IP. In questu mumentu, aghju lanciatu OpenVPN-server (dopu à cunfigurazione) ascoltendu u portu UDP/11111, hà indicatu l'indirizzu IP esternu è u portu (XX.1XX.1X4.2XX: 4398) in u smartphone è cunnessu cù successu da u smartphone à u telefuninu. urdinatore. Ma in questa implementazione, hè stata un prublema, era necessariu di mantene in qualchì modu a sessione UDP finu à chì u cliente OpenVPN cunnessu à u servitore, ùn mi piaceva micca l'opzione di lancià periodicamente u cliente STUN - ùn vulia micca carricà i servitori STUN. in vanu.
Hà attiratu ancu l'attenzione à l'entrata "will hairpin - ci sarà un hairpin", stu modu

Hairpinning permette à una macchina in una reta lucale daretu à NAT per accede à una altra macchina nantu à a stessa reta à l'indirizzu esternu di u router.

Cumincià un servitore VPN daretu à u NAT di un fornitore
In u risultatu, aghju risoltu u prublema di mantene una sessione UDP simplicemente - aghju lanciatu u cliente in u stessu computer cù u servitore.
Funziona cusì:

  • lanciatu u cliente STUN cù u portu lucale 11111
  • ricevutu risposta cù indirizzu IP esternu è portu XX.1XX.1X4.2XX: 4398
  • mandatu dati cù un indirizzu IP esternu è u portu à u mail (qualsiasi altru serviziu hè pussibule) cunfigurati in u smartphone
  • hà lanciatu un servitore OpenVPN in un computer chì ascolta u portu UDP/11111
  • hà lanciatu un cliente OpenVPN in un urdinatore chì specifica XX.1XX.1X4.2XX: 4398 per cunnette
  • in ogni mumentu hà lanciatu u cliente OpenVPN in u smartphone, specificendu l'indirizzu IP è u portu (in u mo casu, l'indirizzu IP ùn hà micca cambiatu) per cunnette

Cumincià un servitore VPN daretu à u NAT di un fornitore
Cusì, aghju avutu l'uppurtunità di cunnette à u mo urdinatore da un smartphone. Questa implementazione permette di cunnette qualsiasi client OpenVPN.

Prutizzioni

Pigliarete:

# apt install openvpn stun-client sendemail

Dopu avè scrittu un paru di script, un paru di schedarii di cunfigurazione, generendu i certificati necessarii (siccomu u cliente nantu à u smartphone travaglia solu cù certificati), avemu avutu l'implementazione abituale di u servitore OpenVPN.

Scrittura principale nantu à l'urdinatore

# 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

Scrittura di mandatu di 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"

File di cunfigurazione di u servitore:

# 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

File di cunfigurazione di u 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

I certificati sò stati generati secondu stu articulu.
Esecuzione di u script:

# ./vpn11.sh

Facendu prima eseguibile

# chmod +x vpn11.sh

Da u latu di u smartphone

Installendu l'applicazione Apri VPN per Android, cupiendu u schedariu di cunfigurazione, i certificati è cunfigurà lu, hè risultatu cusì:
Verificate l'email nantu à u mo smartphoneCumincià un servitore VPN daretu à u NAT di un fornitore
Edite u numeru di portu in i paràmetriCumincià un servitore VPN daretu à u NAT di un fornitore
Cumincià u cliente è cunnetteCumincià un servitore VPN daretu à u NAT di un fornitore

In u prucessu di scrittura di l'articulu, aghju trasfirutu a cunfigurazione da l'urdinatore à u Raspberry Pi 3 è pruvatu à eseguisce tuttu in un modem LTE, ma ùn hà micca travagliatu! risultatu di cumanda

# stun stun.ekiga.net -p 11111

Versione client STUN 0.97
Primariu: Mappatura Indipendente, Filtru Dipendente di Portu, portu aleatoriu, sarà hairpin
u valore di ritornu hè 0x000006

valore Filtru dipendente di u portu impeditu u sistema di principià.
Ma u fornitore di casa hà lasciatu u sistema in funzione nantu à u Raspberry Pi 3 senza prublemi.
In cunghjunzione cù una webcam, cù VLC per
criendu un flussu RTSP da una 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

è VLC in un smartphone per a visualizazione (stream rtsp://10.2.0.1:8554/), ùn hè micca un cattivu sistema di surviglianza video à distanza, pudete ancu installà Samba, rotta trafficu attraversu VPN, cuntrullà remotamente un urdinatore è assai di più ...

cunchiusioni

Comu a pratica hà dimustratu, per urganizà un servitore VPN, pudete fà senza un indirizzu IP esternu per quale avete bisognu di pagà, è ancu per un VPS / VDS affittu. Ma tuttu dipende di u fornitore. Di sicuru, vulia avè più infurmazione nantu à i diversi fornituri è i tipi di NAT utilizati, ma questu hè solu u principiu ...
Ti ringraziu per a vostra attenzione!

Source: www.habr.com

Add a comment