VPN-palvelimen käynnistäminen palveluntarjoajan NAT:n takana

Artikkeli siitä, kuinka onnistuin ajamaan VPN-palvelinta kotipalveluntarjoajan NAT:n takana (ilman valkoista IP-osoitetta). Kerron heti: tämän toteutuksen suorituskyky riippuu suoraan palveluntarjoajasi käyttämästä NAT-tyypistä sekä reitittimestä.
Joten minulla oli tarve muodostaa yhteys Android-älypuhelimestani kotitietokoneeseeni, molemmat laitteet ovat yhteydessä Internetiin palveluntarjoajan NAT:ien kautta, ja tietokone on kytketty kotireitittimen kautta, joka myös NAT-yhteydet.
Klassista järjestelmää, jossa käytetään vuokrattua VPS / VDS:ää valkoisella IP-osoitteella, sekä valkoisen IP-osoitteen vuokraamista palveluntarjoajalta ei otettu huomioon useista syistä.
Ottaen huomioon kokemusta aiemmista artikkeleistatehtyään useita kokeita palveluntarjoajien STUN- ja NAT-tunnisteilla. Päätin tehdä pienen kokeilun suorittamalla komennon kotireitittimessä, jossa on OpenWRT-laiteohjelmisto:

$ stun stun.sipnet.ru

sai tuloksen:

STUN-asiakasversio 0.97
Ensisijainen: riippumaton kartoitus, riippumaton suodatin, satunnainen portti, hiusneula
palautusarvo on 0x000002

Kirjaimellinen käännös:
Independent Mapping - riippumaton näyttö
Independent Filter - riippumaton suodatin
satunnainen portti - satunnainen portti
tulee hiusneula - tulee hiusneula
Suoritettuani samanlaisen komennon tietokoneellani, sain:

STUN-asiakasversio 0.97
Ensisijainen: Itsenäinen kartoitus, porttiriippuvainen suodatin, satunnainen portti, hiusneula
palautusarvo on 0x000006

Port Dependent Filter - porttiriippuvainen suodatin
Ero komentojen tulosten tuloksissa osoitti, että kotireititin antoi "osuutensa" pakettien lähettämiseen Internetistä, tämä ilmeni siinä, että kun komento suoritettiin tietokoneessa:

stun stun.sipnet.ru -p 11111 -v

sain tuloksen:

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

sillä hetkellä UDP-istunto avattiin hetkeksi, jos sillä hetkellä lähetettiin UDP-pyyntö (esim. netcat XX.1XX.1X4.2XX 4398 -u), niin pyyntö tuli kotireitittimelle, joka oli vahvisti siinä käynnissä olevan TCPDump:n, mutta pyyntö ei päässyt tietokoneelle - IPtables reitittimen NAT-kääntäjänä pudotti sen.
VPN-palvelimen käynnistäminen palveluntarjoajan NAT:n takana
Mutta jo se tosiasia, että UDP-pyyntö välitettiin palveluntarjoajan NAT:n kautta, antoi toivoa menestyksestä. Koska reititin on lainkäyttöalueellani, ratkaisin ongelman ohjaamalla UDP / 11111-portin tietokoneeseen:

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

Näin sain mahdollisuuden aloittaa UDP-istunnon ja vastaanottaa pyyntöjä Internetistä mistä tahansa IP-osoitteesta. Tällä hetkellä käynnistin OpenVPN-palvelimen (sen konfiguroinnin jälkeen), joka kuuntelee UDP/11111-porttia, ilmoitin älypuhelimen ulkoisen IP-osoitteen ja portin (XX.1XX.1X4.2XX:4398) ja yhdistän älypuhelimesta onnistuneesti tietokone. Mutta tässä toteutuksessa ilmeni ongelma, UDP-istunto piti jotenkin ylläpitää, kunnes OpenVPN-asiakas on yhteydessä palvelimeen, en pitänyt mahdollisuudesta käynnistää STUN-asiakas ajoittain - en halunnut ladata STUN-palvelimia turhaan.
kiinnitti huomiota myös merkintään "tulee hiusneula - tulee hiusneula", tämä tila

Hiusneulauksen avulla yksi NAT:n takana olevassa paikallisverkossa oleva kone voi käyttää toista konetta samassa verkossa reitittimen ulkoisessa osoitteessa.

VPN-palvelimen käynnistäminen palveluntarjoajan NAT:n takana
Tämän seurauksena ratkaisin UDP-istunnon ylläpitämisen ongelman yksinkertaisesti - käynnistin asiakkaan samassa tietokoneessa palvelimen kanssa.
Se toimi näin:

  • käynnisti STUN-asiakasohjelman paikallisella portilla 11111
  • vastaanotettu vastaus ulkoisella IP-osoitteella ja portilla XX.1XX.1X4.2XX:4398
  • lähetti tietoja ulkoisella IP-osoitteella ja portilla älypuhelimeen määritettyyn sähköpostiin (muu palvelu on mahdollinen).
  • käynnisti OpenVPN-palvelimen tietokoneella, joka kuuntelee UDP/11111-porttia
  • käynnisti OpenVPN-asiakkaan tietokoneessa, jossa määritettiin XX.1XX.1X4.2XX:4398 yhteyden muodostamiseksi
  • milloin tahansa käynnisti OpenVPN-asiakkaan älypuhelimessa määrittämällä IP-osoitteen ja portin (minun tapauksessani IP-osoite ei muuttunut) yhteyden muodostamiseksi

VPN-palvelimen käynnistäminen palveluntarjoajan NAT:n takana
Näin sain mahdollisuuden muodostaa yhteyden tietokoneeseeni älypuhelimesta. Tämän toteutuksen avulla voit yhdistää minkä tahansa OpenVPN-asiakkaan.

Käytäntö

Tarvitset:

# apt install openvpn stun-client sendemail

Kirjoittamisen jälkeen pari komentosarjaa, pari määritystiedostoa, luotu tarvittavat varmenteet (koska älypuhelimen asiakas toimii vain varmenteilla), saimme OpenVPN-palvelimen tavanomaisen toteutuksen.

Pääskripti tietokoneella

# 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

Sähköpostin lähetysskripti:

# 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"

Palvelimen asetustiedosto:

# 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

Asiakkaan asetustiedosto:

# 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

Sertifikaatit luotiin mukaan tässä artikkelissa.
Skriptin suorittaminen:

# ./vpn11.sh

Tee siitä ensin suoritettava

# chmod +x vpn11.sh

Älypuhelimen puolella

Asentamalla sovelluksen Avaa VPN Androidille, kopioimalla määritystiedoston, sertifikaatit ja määrittämällä se, siitä tuli seuraava:
Tarkistan sähköpostin älypuhelimellaniVPN-palvelimen käynnistäminen palveluntarjoajan NAT:n takana
Muokkaan portin numeroa asetuksissaVPN-palvelimen käynnistäminen palveluntarjoajan NAT:n takana
Käynnistän asiakkaan ja yhdistänVPN-palvelimen käynnistäminen palveluntarjoajan NAT:n takana

Artikkelia kirjoittaessani siirsin asetukset tietokoneelta Raspberry Pi 3:een ja yritin ajaa koko asiaa LTE-modeemilla, mutta se ei toiminut! komennon tulos

# stun stun.ekiga.net -p 11111

STUN-asiakasversio 0.97
Ensisijainen: Itsenäinen kartoitus, porttiriippuvainen suodatin, satunnainen portti, hiusneula
palautusarvo on 0x000006

значение Porttiriippuvainen suodatin ei antanut järjestelmän käynnistyä.
Mutta kotipalveluntarjoaja antoi järjestelmän toimia Raspberry Pi 3:lla ilman ongelmia.
Yhdessä web-kameran kanssa, VLC for
RTSP-streamin luominen verkkokamerasta

$ 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

ja VLC älypuhelimessa katselua varten (stream rtsp://10.2.0.1:8554/), se ei osoittautunut huonoksi videovalvontajärjestelmäksi etäältä, voit myös määrittää Samban, reitittää liikennettä VPN: n kautta, etäohjata tietokonetta ja paljon enemmän ...

johtopäätös

Kuten käytäntö on osoittanut, VPN-palvelimen järjestämiseksi voit tehdä ilman ulkoista IP-osoitetta, josta sinun on maksettava, samoin kuin vuokrattua VPS:ää / VDS:ää. Mutta kaikki riippuu palveluntarjoajasta. Tietenkin halusin saada lisätietoja eri palveluntarjoajista ja käytetyistä NAT-tyypeistä, mutta tämä on vasta alkua ...
Спасибо за внимание!

Lähde: will.com

Lisää kommentti