VPN zerbitzari bat abiarazi hornitzaile baten NAT atzean

Etxeko hornitzaile baten NATaren atzean VPN zerbitzari bat exekutatzeko nola lortu nuen (IP helbide zuririk gabe) buruzko artikulu bat. Esango dizut berehala: ezarpen honen errendimendua zuzenean zure hornitzaileak erabiltzen duen NAT motaren araberakoa da, baita bideratzaileak ere.
Beraz, nire Android telefonotik nire etxeko ordenagailura konektatu beharra nuen, bi gailuak Internetera konektatzen dira hornitzaileen NATen bidez, gainera ordenagailua etxeko bideratzaile baten bidez konektatuta dago, eta horrek ere NAT konexioak egiten ditu.
IP helbide zuria duen VPS / VDS alokatutako eskema klasikoa erabiltzeaz gain, hornitzailearen IP helbide zuria alokatzeaz gain, ez zen kontuan hartu hainbat arrazoirengatik.
Kontuan hartuta iraganeko artikuluen esperientzia, hainbat esperimentu egin ondoren hornitzaileen STUN eta NATekin. Esperimentu txiki bat erabaki nuen OpenWRT firmwarea exekutatzen duen etxeko bideratzaile batean komandoa exekutatuz:

$ stun stun.sipnet.ru

emaitza lortu du:

STUN bezeroaren bertsioa 0.97
Lehena: mapa independentea, iragazki independentea, ausazko ataka, ilea izango da
itzultzeko balioa da 0x000002

Itzulpen literala:
Independent Mapping - pantaila independentea
Independent Filter - iragazki independentea
random port - ausazko ataka
ilea izango da - ilea izango da
Nire ordenagailuan antzeko komando bat exekutatu ondoren, lortu nuen:

STUN bezeroaren bertsioa 0.97
Lehena: mapa independentea, portuen menpeko iragazkia, ausazko ataka, ilea izango da
itzultzeko balioa da 0x000006

Port Dependent Filter - portuen menpeko iragazkia
Komandoen irteerako emaitzen desberdintasunak adierazi zuen etxeko bideratzaileak "bere ekarpena" egin zuela Internetetik paketeak igortzeko prozesuan, hau da, komandoa ordenagailuan exekutatzen zenean:

stun stun.sipnet.ru -p 11111 -v

emaitza lortu dut:

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

une horretan, UDP saio bat ireki zen denbora batez, une horretan UDP eskaera bat bidali bazen (adibidez: netcat XX.1XX.1X4.2XX 4398 -u), orduan eskaera etxeko bideratzailera iritsi zen, hau da. bertan exekutatzen ari den TCPDump-ek baieztatu zuen, baina eskaera ez zen ordenagailura iritsi - IPtables-ek bideratzaileko NAT itzultzaile gisa erori egin zuen.
VPN zerbitzari bat abiarazi hornitzaile baten NAT atzean
Baina hornitzailearen NAT bidez UDP eskaera bat pasatzeak arrakastarako itxaropena eman zuen. Bideratzailea nire jurisdikzioan dagoenez, arazoa konpondu nuen UDP / 11111 ataka ordenagailura birbideratuz:

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

Hala, aukera izan nuen UDP saio bat hasteko eta Internetetik eskaerak jasotzeko edozein IP helbidetatik. Momentu honetan, OpenVPN zerbitzaria abiarazi nuen (konfiguratu ondoren) UDP/11111 ataka entzuten, kanpoko IP helbidea eta ataka (XX.1XX.1X4.2XX:4398) adierazi nituen telefonoan eta ondo konektatu nintzen telefonotik telefonora. ordenagailua. Baina inplementazio honetan, arazo bat sortu zen, beharrezkoa zen nolabait UDP saioa mantentzea OpenVPN bezeroa zerbitzarira konektatu arte, ez zitzaidan gustatu STUN bezeroa aldian-aldian abiarazteko aukera - ez nuen STUN zerbitzariak kargatu nahi. Alferrik.
Sarreran ere arreta jarri zuen "ilea izango da - ilea izango da", modu hau

Hairpinning-ak NAT atzean dagoen sare lokaleko makina bati sare bereko beste makina bat sartzea ahalbidetzen dio bideratzailearen kanpoko helbidean.

VPN zerbitzari bat abiarazi hornitzaile baten NAT atzean
Ondorioz, UDP saio bat mantentzeko arazoa besterik gabe konpondu nuen: bezeroa zerbitzariaren ordenagailu berean abiarazi nuen.
Honela funtzionatu zuen:

  • STUN bezeroa abiarazi zuen 11111 ataka lokalarekin
  • erantzuna jaso du kanpoko IP helbidearekin eta XX.1XX.1X4.2XX:4398 atakarekin
  • kanpoko IP helbide eta ataka batekin datuak bidali ditu telefonoan konfiguratutako postara (beste edozein zerbitzu posible da).
  • OpenVPN zerbitzari bat abiarazi zuen UDP/11111 atakan entzuten ari den ordenagailu batean
  • OpenVPN bezero bat abiarazi zuen ordenagailu batean XX.1XX.1X4.2XX:4398 zehazten zuen konektatzeko
  • edozein unetan abiarazi zuen OpenVPN bezeroa telefonoan, IP helbidea eta ataka zehaztuz (nire kasuan, IP helbidea ez zen aldatu) konektatzeko

VPN zerbitzari bat abiarazi hornitzaile baten NAT atzean
Horrela, nire ordenagailura konektatzeko aukera izan nuen smartphone batetik. Inplementazio honek edozein OpenVPN bezero konektatzeko aukera ematen du.

Praktika

Hartuko du:

# apt install openvpn stun-client sendemail

Script pare bat, konfigurazio fitxategi pare bat idatzi ondoren, beharrezko ziurtagiriak sortuz (smartphoneko bezeroak ziurtagiriekin soilik funtzionatzen duenez), OpenVPN zerbitzariaren ohiko inplementazioa lortu dugu.

Ordenagailuko gidoi nagusia

# 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

Posta elektronikoa bidaltzeko gidoia:

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

Zerbitzariaren konfigurazio fitxategia:

# 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

Bezeroaren konfigurazio fitxategia:

# 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

Horren arabera sortu ziren ziurtagiriak Artikulu honetan.
Gidoia exekutatzen:

# ./vpn11.sh

Lehenik eta behin exekutagarria izatea

# chmod +x vpn11.sh

Smartphone aldean

Aplikazioa instalatuz Ireki VPN Androiderako, konfigurazio fitxategia, ziurtagiriak kopiatu eta konfiguratuz, honela geratu zen:
Nire telefonoan posta elektronikoa egiaztatzenVPN zerbitzari bat abiarazi hornitzaile baten NAT atzean
Portuaren zenbakia editatzen dut ezarpenetanVPN zerbitzari bat abiarazi hornitzaile baten NAT atzean
Bezeroa abiarazten dut eta konektatzen naizVPN zerbitzari bat abiarazi hornitzaile baten NAT atzean

Artikulua idazteko prozesuan, konfigurazioa ordenagailutik Raspberry Pi 3ra transferitu nuen eta guztia LTE modem batean exekutatzen saiatu nintzen, baina ez zuen funtzionatu! aginduaren emaitza

# stun stun.ekiga.net -p 11111

STUN bezeroaren bertsioa 0.97
Lehena: mapa independentea, portuen menpeko iragazkia, ausazko ataka, ilea izango da
itzultzeko balioa da 0x000006

balioa Portuaren menpeko iragazkia sistema abiaraztea eragotzi zuen.
Baina etxeko hornitzaileak sistema Raspberry Pi 3-n exekutatzen utzi zuen arazorik gabe.
Webcam batekin batera, VLC-rekin
Webcam batetik RTSP korrontea sortzea

$ 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

eta VLC telefonoan ikusteko (korrontea rtsp://10.2.0.1:8554/), ez zen bideo-zaintza sistema txarra urrundik atera, Samba ere konfigura dezakezu, VPN bidez trafikoa bideratu, ordenagailu bat urrunetik kontrolatu. eta askoz gehiago...

Irteera

Praktikak erakutsi duenez, VPN zerbitzari bat antolatzeko, ordaindu behar duzun kanpoko IP helbiderik gabe egin dezakezu, baita alokatutako VPS / VDS bat ere. Baina dena hornitzailearen araberakoa da. Noski, erabilitako NAT mota eta hornitzaileei buruzko informazio gehiago lortu nahi nuen, baina hau hasiera baino ez da...
Eskerrik asko zure arreta!

Iturria: www.habr.com

Gehitu iruzkin berria