Cikk arról, hogyan sikerült elindítanom VPN-szerverüket a szolgáltató NAT-ja mögött (fehér IP cím nélkül). Azonnal megjegyzem, hogy a megvalósítás működőképessége közvetlenül függ a szolgáltató által használt NAT típusától és a routertől,.
Tehát szükségem adódott arra, hogy csatlakozzak a házi számítógépemhez az Android okostelefonomról, mindkét eszköz az internethez a szolgáltatói NAT-on keresztül csatlakozik, ráadásul a számítógép otthoni routeren keresztül kapcsolódik, amely szintén NAT-olta a kapcsolatokat.
A klasszikus séma bérelt VPS/VDS használatával fehér IP címmel, valamint a szolgáltatótól fehér IP cím bérlése több okból nem volt figyelembe véve.
Figyelembe véve az előző cikkek tapasztalatait, néhány kísérletet követően a STUN-okat és a szolgáltatók NAT-jait illetően. Elhatároztam, hogy egy kis kísérletet végzek, végrehajtva a parancsot a nyílt forráskódú OpenWRT firmware-rel működő otthoni routeren:
$ stun stun.sipnet.rukaptam az alábbi eredményt:
STUN kliens verzió 0.97
Elsődleges: Független leképezés, Független szűrő, véletlenszerű port, fogsor
A visszatérési érték: 0x000002
Szó szerinti fordítás:
Független leképezés — független leképezés
Független szűrő — független szűrő
véletlenszerű port — véletlenszerű port
fogpiszkáló — fogsor
Hasonló parancs végrehajtásával a számítógépemen, azt kaptam:
STUN kliens verzió 0.97
Elsődleges: Független leképezés, Port függő szűrő, véletlenszerű port, fogsor
A visszatérési érték: 0x000006
Port függő szűrő — portfüggő szűrő
A parancsek kimenetében észlelt különbség arra utalt, hogy a házi router hozzájárult a csomagok internetes leképezésének folyamatához, ez abban nyilvánult meg, hogy a számítógépen a következő parancs végrehajtásakor:
stun stun.sipnet.ru -p 11111 -vaz alábbi eredményt kaptam:
…
MappedAddress = XX.1XX.1X4.2XX:4398
…
ebben a pillanatban egy rövid időre megnyílt egy UDP-session, ha ebben a pillanatban elküldök egy UDP-kérést (például: netcat XX.1XX.1X4.2XX 4398 -u), akkor a kérés a házi routerhez érkezett, amit a TCPDump megerősített rajta, de a kérés nem érkezett meg a számítógéphez — az IPtables NAT-átalakítóként a routeren eldobta azt.

De az a tény, hogy az UDP kérés áthaladt a szolgáltató NAT-on, reményt adott a sikerre. Mivel a router az én joghatóságom alatt áll, a problémát az UDP/11111 port számítógépre való továbbításával oldottam meg:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXXEzzel lehetővé válik UDP-sesszió indítása, és bármilyen IP-címről érkező kérelmek fogadása az internetről. Ekkor indítottam el az OpenVPN-szervert (korábban konfigurálva), az UDP/11111 portot figyelve, a smartphone-on megadtam a külső IP-címet és a portot (XX.1XX.1X4.2XX:4398), és sikeresen csatlakoztam a számítógéphez a smartphone-ról. Azonban ebben a megvalósításban probléma merült fel, szükséges volt valahogy fenntartani az UDP-sessziót az OpenVPN-kliens csatlakozásáig a szerverhez, nem tetszett a STUN-kliens időszakos indításának lehetősége — nem akartam feleslegesen megterhelni a STUN-szervereket.
Ugyanígy figyelmet szenteltem a "fogpiszkáló — fogsor" mérvén,
A Hairpinning lehetővé teszi, hogy egy gép a NAT-on belül hozzáférjen egy másik géphez ugyanazon a hálózaton a router külső címén.

Végül az UDP-sesszió fenntartásának problémáját egyszerűen megoldottam - a klienst indítottam el ugyanazon a számítógépen, mint a szerver.
Ez így működött:
- elindítottam a STUN-klienset a helyi 11111 porttal,
- kaptam választ a külső IP-cím párral és porttal XX.1XX.1X4.2XX:4398,
- küldtem az adatokat a külső IP-címmel és porttal az e-mail címre (bármilyen más szolgáltatás lehetséges), amely be volt állítva a smartphone-on,
- elindítottam az OpenVPN-szervert a számítógépen az UDP/11111 port figyelésével,
- elindítottam az OpenVPN-klienset a számítógépen XX.1XX.1X4.2XX:4398 megadásával a csatlakozáshoz,
- bármikor elindítottam az OpenVPN-klienset a smartphone-on az IP-cím és a port megadásával (az én esetemben az IP-cím nem változott) a csatlakozáshoz.

Így lehetőséget kaptam arra, hogy a smartphone-omról csatlakozzak a számítógépemhez. Ez a megvalósítás lehetővé teszi bármely OpenVPN-kliens csatlakoztatását.
Gyakorlat
Szükség lesz:
# apt install openvpn stun-client sendemailPár szkriptet megírva, pár konfigurációs fájlt létrehozva, szükséges tanúsítványokat generálva (mivel a smartphone-on futó kliens csak tanúsítványokkal működik), egy szokásos OpenVPN-szerver megvalósítást hoztam létre.
Fő szkript a számítógépen:
# 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
doneAdatküldő szkript e-mailre:
# 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"Szerver konfigurációs fájlja:
# 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 20Kliens konfigurációs fájlja:
# cat client.confügyfél
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 30A tanúsítványok generálása a következőképpen történt cikkben.
A szkript futtatása:
# ./vpn11.shElőször is, tedd végrehajthatóvá
# chmod +x vpn11.shA telefon oldalán
Alkalmazás telepítése OpenVPN Androidra, a konfigurációs fájl, tanúsítványok másolásával és beállításával így alakult:
A telefonon ellenőrzöm az e-mailt
Módosítom a port számot a beállításokban
Elindítom a klienst és csatlakozom
A cikk írása közben az konfigurációt átvittem a számítógépről a Raspberry Pi 3-ra, és próbáltam mindezt egy LTE modemre rákonfigurálni, de nem sikerült! A parancs eredménye
# stun stun.ekiga.net -p 11111STUN kliens verzió 0.97
Elsődleges: Független leképezés, Port függő szűrő, véletlenszerű port, fogsor
A visszatérési érték: 0x000006
értéket Portfüggő szűrő nem tette lehetővé a rendszer elindítását.
De a házi szolgáltató problémamentesen elindította a rendszert a Raspberry Pi 3-on.
Webkamerával kombinálva, a VLC segítségével
RTSP-stream létrehozása a webkamerából
$ 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és VLC a telefonon a megtekintéshez (stream rtsp://10.2.0.1:8554/), így egy egész jó távoli megfigyelő rendszert állítottam össze, emellett Samba-t is indíthatunk, forgalmat irányíthatunk VPN-en keresztül, távolról vezérelhetjük a számítógépet és még sok mást...
Következtetés
A gyakorlat alapján a VPN-szerver megszervezéséhez elég külső IP-cím nélkül is meglenni, amit nem kell megfizetni, akárcsak a bérelt VPS/VDS. De ez a szolgáltatótól függ. Természetesen szívesen kaptam volna bővebb információt a különböző szolgáltatókról és a használt NAT-típusokról, de hát ez csak a kezdet...
Köszönöm a figyelmet!
Forrás: habr.com
