Artikulli mbi se si munda të filloj VPN-server pas NAT-it të ofruesit të shërbimit (pa adresë IP të bardhë). Menjëherë duhet të theksoj se funksionaliteti i kësaj zbatimi varet drejtpërdrejt nga lloji i NAT që ofruesi juaj përdor, si dhe nga routeri.
Pra, më erdhi nevoja të lidhem nga smartphone-i im Android me kompjuterin tim të shtëpisë, të dy pajisjet janë të lidhura me Internetin përmes NAT-ëve të ofruesve, dhe kompjuteri gjithashtu është i lidhur përmes një routeri shtëpiak, i cili gjithashtu NAT-onte lidhjet.
Skema klasike me përdorimin e një VPS/VDS të marrë me adresë IP të bardhë, si dhe marrja e një adrese IP të bardhë nga ofruesi nuk u shqyrtua për disa arsye.
Duke marrë parasysh përvojat nga artikujt e kaluar, duke kryer disa eksperimente me STUN-at dhe NAT-et e ofruesve. Vendosa të bëj një eksperiment të vogël, duke ekzekutuar komandën në routerin tim shtëpiak që punon me firmware OpenWRT:
$ stun stun.sipnet.rumora rezultatin:
STUN client version 0.97
Primary: Mapping i Pavarur, Filtri i Pavarur, port i rastësishëm, do të hairpin
Vlera e kthimit është 0x000002
Përkthimi i drejtpërdrejtë:
Mapping i Pavarur — hartë e pavarur
Filtri i Pavarur — filtrues i pavarur
port i rastësishëm — port i rastësishëm
do të hairpin — do të shkojë në kthim
Duke ekzekutuar një komandë të ngjashme në PC-në time, mora:
STUN client version 0.97
Primary: Mapping të Pavarur, Filtri të Varur nga Porta, port rastësor, do të hairpin
Vlera e kthimit është 0x000006
Port Dependent Filter — filtrues i varur nga porti
Dallimi në rezultatet e daljes së komandave tregonte se routeri shtëpiak po bënte 'kontributin' e tij në procesin e përkthimit të paketeve nga Interneti, kjo shfaqej në atë që, kur ekzekutonim komandën në kompjuter:
stun stun.sipnet.ru -p 11111 -vmora rezultatin:
…
MappedAddress = XX.1XX.1X4.2XX:4398
…
në atë moment hapte për një kohë të shkurtër një sesion UDP, nëse në atë moment dërgohej një kërkesë UDP (p.sh.: netcat XX.1XX.1X4.2XX 4398 -u), atëherë kërkesa arrinte në routerin shtëpiak, që e konfirmoi TCPDump i nisur në të, por kërkesa nuk arriti në kompjuter — IPtables si përkthyes NAT në router e ndaloi atë.

Por fakti që kërkesa UDP kalonte përmes NAT-it të ofruesit jepte shpresë për sukses. Duke qenë se routeri është në juridiksionin tim, zgjodha problemin duke drejtuar portin UDP/11111 në kompjuter:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXXKështu arrita të iniciova një seancë UDP dhe të merrja kërkesa nga interneti nga çdo IP adresë. Në këtë moment, aktivizova OpenVPN-server (pas konfiguruar paraprakisht) duke dëgjuar portin UDP/11111, tregova në smartphone adresën IP të jashtme dhe portin (XX.1XX.1X4.2XX:4398) dhe u lidh me sukses me smartphone nga kompjuteri. Por në këtë implementim u paraqit një problem, duhej somehow të mbaja seancën UDP deri në momentin që klienti OpenVPN i lidhte me serverin, opsioni me nisjen periodike të klientit STUN nuk më pëlqeu - nuk doja të ngarkoja pa nevojë serverat STUN.
Po ashtu vura re shënimin "do të hairpin — do të shkojë në kthim", ky mod
Hairpinning lejon një makinë në rrjetin lokal pas NAT të aksesojë një makinë tjetër në të njëjtin rrjet përmes adresës së jashtme të router.

Në fund, problemin e mbajtjes së seancës UDP e zgjidhja thjesht - aktivizova klientin në të njëjtin kompjuter me serverin.
Kjo funksiononte kështu:
- aktivizova klientin STUN me portin lokal 11111
- mora përgjigjen me adresën IP të jashtme dhe portin XX.1XX.1X4.2XX:4398
- dërgova të dhënat me adresën IP të jashtme dhe portin në email (mund të përdoret çdo shërbim tjetër), të konfiguruar në smartphone
- aktivizova OpenVPN-server në kompjuter me dëgjimin e portit UDP/11111
- aktivizova klientin OpenVPN në kompjuter duke treguar XX.1XX.1X4.2XX:4398 për t'u lidhur
- në çdo kohë aktivizoja klientin OpenVPN në smartphone duke treguar adresën IP dhe portin (në rastin tim, adresa IP nuk ndryshonte) për t'u lidhur

Kështu arrita të lidhem me kompjuterin tim nga smartphone. Kjo implementim lejon lidhjen e çdo klienti OpenVPN.
Praktika
Do të nevojiten:
# apt install openvpn stun-client sendemailPas shkrimit të disa skripteve, disa skedave të konfigurimit, duke gjeneruar certifikatat e nevojshme (pasi klienti në smartphone punon vetëm me certifikata) rezultoi një implementim i zakonshëm i OpenVPN-server.
Skripti kryesor në kompjuter
# 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
doneSkripti për dërgimin e të dhënave në 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"Skeda e konfigurimit të serverit:
# 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 20Skeda e konfigurimit të klientit:
# 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 30Gjenenerimi i certifikatëve u krye sipas këto artikuj.
Ekzekutimi i skriptit:
# ./vpn11.shFillimisht duke e bërë atë ekzekutues
# chmod +x vpn11.shNga ana e smartphone-it
Duke instaluar aplikacionin OpenVPN për Android, duke kopjuar skedarin e konfigurimit, certifikatave dhe duke e konfiguruar, doli kështu:
Në smartphone kontrolloj postën
Ndryshoj numrin e portit në cilësimet
E nis klientin dhe lidhem
gjatë procesit të shkrimit të artikullit, transferova konfigurimin nga kompjuteri në Raspberry Pi 3 dhe provova ta nisa këtë në modem LTE, por nuk funksionoi! Rezultati i komandës
# stun stun.ekiga.net -p 11111STUN client version 0.97
Primary: Mapping të Pavarur, Filtri të Varur nga Porta, port rastësor, do të hairpin
Vlera e kthimit është 0x000006
vlerën Filtri në varësi të portit nuk i lejoi sistemit të startojë.
Por ofruesi i shërbimit në shtëpi lehtë e lejoi sistmen të startojë në Raspberry Pi 3.
Në kombinim me kamerën IP, me VLC për
krijimin e një rrjedhe RTSP nga kamera IP
$ 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-keepdhe VLC në smartphone për shikim (rrjedha rtsp://10.2.0.1:8554/), doli një sistem i mirë për mbikëqyrje nga distanca, gjithashtu mund të ngreja Samba, të rruaja trafikun përmes VPN, të menaxhoja kompjuterin në distancë dhe shumë gjëra të tjera…
Përfundimi
Siç tregoi praktika, për të organizuar një server VPN mund të kalosh edhe pa një IP të jashtme për të cilën duhet të paguash, po ashtu si dhe për qiranë VPS/VDS. Por gjithçka varet nga ofruesi. Sigurisht do të doja të merrja më shumë informacion rreth ofruesve të ndryshëm dhe tipeve të NAT-eve të përdorura, por kjo është vetëm fillimi…
Faleminderit për vëmendjen!
Burimi: habr.com
