Artikkel sellest, kuidas ma suutsin käivitada VPN-serveri kodus oleva teenusepakkuja NATi kaudu (ilma avaliku IP-aadressita). Jätkan kohe: et antud rakenduse töökindlus sõltub otseselt teie teenusepakkuja kasutatavast NAT tüübist ning ka ruuterist.
Nii et mul tekkis vajadus ühenduda oma Android-smartfonist koduarvutiga, kus mõlemad seadmed on Internetti ühendatud teenusepakkuja NATide kaudu, lisaks on arvuti ühendatud koduse ruuteriga, mis ka NATib ühendusi.
Klassikaline skeem, kus kasutatakse rentimist VPS/VDS avaliku IP-aadressiga, samuti rentimine avaliku IP-aadressi teenusepakkujalt, ei tulnud mitmetel põhjustel kõne alla.
Arvestades eelnevate artiklite kogemuste, tegin mitu katset STUNide ja teenusepakkujate NATidega. Tegin väikese eksperimendi, sooritades käsu oma koduse ruuteri peal, mis töötab OpenWRT püsivaraga:
$ stun stun.sipnet.rusain tulemuseks:
Avatud port 21234 fd-ga 3
Primary: Independent Mapping, Independent Filter, random port, will hairpin
Tagasiuline väärtus on 0x000002
Sõna-sõnalt tõlge:
Independent Mapping — sõltumatu kaardistamine
Independent Filter — sõltumatu filter
random port — juhuslik port
will hairpin — tuleb pinnale
Tegemisel samasugust käsku oma PC-l, sain:
Avatud port 21234 fd-ga 3
Tagastatav väärtus on 0x000006
Tagasiuline väärtus on 0x000006
Port Dependent Filter — pordi sõltuv filter
Käskude väljundi tulemustes esinev erinevus andis mõista, et kodune ruuter andis „oma panuse“ pakettide edastamise protsessis, see väljendus selles, et arvutis käsu sooritamisel:
stun stun.sipnet.ru -p 11111 -vsain tulemuseks:
…
MappedAddress = XX.1XX.1X4.2XX:4398
…
sel hetkel avanes UDP-seanss ajaks, kui sellel hetkel saata UDP-päring (näiteks: netcat XX.1XX.1X4.2XX 4398 -u), siis päring jõudis kodusesse ruuteri, mida kinnitas TCPDump, mis oli sellel käimas, kuid päring ei jõudnud arvutini — IPtables NAT-muundajana ruuteris viskas selle tagasi.

Kuid fakt, et UDP päring läbis teenusepakkuja NATi, andis lootust edule. Kuna ruuter kuulub minu jurisdiktsiooni, lahendasin probleemi UDP/11111 pordi suunamisega arvutisse:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXXNii sain võimaluse algatada UDP-seansi ja saada Internetist päringuid mis tahes IP-aadressilt. Selle hetke jooksul käivitasin OpenVPN-serveri (eelnevalt konfigureeritud), kuulates UDP/11111 porti, märkisin nutitelefonis välise IP-aadressi ja porti (XX.1XX.1X4.2XX:4398) ning ühendasin eduka ühenduse nutitelefoniga arvutisse. Kuid antud rakenduses tekkis probleem, pidin leidma viisi, kuidas hoida UDP-seanssi OpenVPN-klient serveriga ühendamise hetkeks; mulle ei meeldinud variant STUN-klienti perioodiliselt käivitada — ei tahtnud STUN-servereid tarbetult koormata.
Samuti pöörasin tähelepanu kirjele „will hairpin — tuleb pinnale«, see režiim
Hairpinning võimaldab ühel seadmel kohalikus võrgus NAT-i taga pääseda teisele seadmele samas võrgus välise marsruuteri aadressi kaudu.

Lõpuks lahendasin UDP-seansi hoidmise probleemi lihtsalt — käivitasin kliendi samal arvutis, kus oli server.
See toimis järgmiselt:
- käivitasin STUN-klienti kohaliku portiga 11111
- sain vastuse välise IP-aadressiga ja sadamaga XX.1XX.1X4.2XX:4398
- saatsin andmed välise IP-aadressi ja sadamaga meili (võib kasutada mistahes muud teenust), mille seadistasin nutitelefonis
- käivitasin OpenVPN-serveri arvutis, kuulates UDP/11111 porti
- käivitasin OpenVPN-kliendi arvutis, märkides XX.1XX.1X4.2XX:4398 ühendamiseks
- igalt poolt käivitasin OpenVPN-kliendi nutitelefonis, märkides IP-aadress ja port (minu puhul IP-aadress ei muutunud) ühendamiseks

Nii sain ma võimaluse ühendada oma arvuti nutitelefoniga. See rakendus võimaldab ühendada mis tahes OpenVPN-kliendi.
Praktika
Vajalikud materjalid:
# apt install openvpn stun-client sendemailKirjutasin paar skripti, paar konfigureerimisfaili ja genereerisin vajalikud sertifikaadid (kuna nutitelefonil töötav klient kasutab ainult sertifikaate), sain tavalise OpenVPN-serveri rakenduse.
Peamine skript arvutis
# 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
doneAndmete saatmise skript meili peale:
# 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"Serveri konfigureerimisfail:
# 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 20Kliendi konfigureerimisfail:
# 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 30Sertifikaatide genereerimine toimus selles artiklis.
Skripti käivitamine:
# ./vpn11.shEnne selle täitvaks muutmist
# chmod +x vpn11.shNutitelefoni poolel
Rakenduse installimisel OpenVPN Androidile, kopeerides konfifaili, sertifikaadid ja seadistades selle, sai nii:
Kontrollin nutitelefonis posti
Kohanen numbriga seadetesse
Käivitame kliendi ja ühendume
Artikli kirjutamise protsessi jooksul edastasin konfi arvutist Raspberry Pi 3-le ja proovisin selle kõike LTE-mooduli peal käivitada, aga see ei õnnestunud! Käskluse tulemus
# stun stun.ekiga.net -p 11111Avatud port 21234 fd-ga 3
Tagastatav väärtus on 0x000006
Tagasiuline väärtus on 0x000006
väärtuse Porti sõltuv filter ei lubanud süsteemil käivituda.
Kuid kodune teenusepakkuja võimaldas süsteemil probleemideta Raspberry Pi 3-l käivituda.
Koos veebikaameraga, VLC-ga
RTSP voogude loomiseks veebikaamerast
$ 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-keepja VLC nutitelefonis vaatamiseks (voog rtsp://10.2.0.1:8554/), sai korralik kaugvaatamise videovalve süsteem, samuti saab tõsta Samba, marsruutida liiklust VPN-i kaudu, kaugtöötada arvutiga ja palju muud…
Kokkuvõte
Praktika näitas, et VPN-serveri loomine võib toimuda ka ilma välise IP-aadressita, mille eest tuleb maksta, samuti nagu renditud TP jaoks VPS/VDS. Kuid kõik sõltub teenusepakkujast. Loomulikult oleks tore saada rohkem teavet erinevate teenusepakkujate ja kasutatavate NAT-tüüpide kohta, kuid see on alles algus...
Aitäh tähelepanu eest!
Allikas: habr.com
