Članak o tome kako sam uspio pokrenuti VPN poslužitelj iza NAT-a svog kućnog pružatelja usluga (bez bijele IP adrese). Odmah da rezerviram: to izvedba ove implementacije izravno ovisi o vrsti NAT-a koju koristi vaš pružatelj, kao i usmjerivač.
Dakle, trebao sam se povezati sa svog Android pametnog telefona na kućno računalo, oba uređaja su povezana s internetom putem NAT-ova pružatelja usluga, a računalo je povezano putem kućnog usmjerivača, koji također ima NAT veze.
Klasična shema korištenja zakupljenog VPS/VDS-a s bijelom IP adresom, kao i najam bijele IP adrese od provajdera, nije razmatrana iz nekoliko razloga.
Uzeti u obzir
$ stun stun.sipnet.ru
dobio rezultat:
STUN klijent verzija 0.97
Primarni: Neovisno mapiranje, Neovisni filtar, nasumični priključak, ukosnica
Povratna vrijednost je 0x000002
Doslovni prijevod:
Independent Mapping - neovisno preslikavanje
Independent Filter - nezavisni filtar
random port - slučajni priključak
će ukosnica - bit će ukosnica
Pokrećući sličnu naredbu na računalu, dobio sam:
STUN klijent verzija 0.97
Primarno: neovisno mapiranje, filtar ovisan o portu, nasumični port, bit će ukosnica
Povratna vrijednost je 0x000006
Port Dependent Filter - filtar ovisan o portu
Razlika u rezultatima izlaza naredbe pokazala je da kućni usmjerivač daje "svoj doprinos" procesu prijenosa paketa s Interneta; to se očitovalo u činjenici da prilikom izvršavanja naredbe na računalu:
stun stun.sipnet.ru -p 11111 -v
Dobivao sam rezultat:
...
Mapirana adresa = XX.1XX.1X4.2XX:4398
...
u ovom trenutku, UDP sesija je bila otvorena neko vrijeme, ako u ovom trenutku pošaljete UDP zahtjev (na primjer: netcat XX.1XX.1X4.2XX 4398 -u), tada je zahtjev došao do kućnog usmjerivača, koji je potvrdio TCPDump pokrenut na njemu, ali zahtjev nije došao do računala - IPtables ga je, kao NAT prevoditelj na routeru, ispustio.
Ali sama činjenica da je UDP zahtjev prošao kroz NAT provajdera davala je nadu za uspjeh. Budući da se usmjerivač nalazi u mojoj nadležnosti, riješio sam problem preusmjeravanjem UDP/11111 porta na računalo:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX
Tako sam mogao pokrenuti UDP sesiju i primati zahtjeve s Interneta s bilo koje IP adrese. U ovom trenutku sam pokrenuo OpenVPN-poslužitelj (prethodno ga konfigurirajući) slušajući UDP/11111 port, označio vanjsku IP adresu i port (XX.1XX.1X4.2XX:4398) na pametnom telefonu i uspješno se povezao sa pametnog telefona na Računalo. Ali u ovoj implementaciji pojavio se problem: bilo je potrebno nekako održavati UDP sesiju dok se OpenVPN klijent ne poveže s poslužiteljem; nije mi se svidjela opcija povremenog pokretanja STUN klijenta - nisam želio gubiti opterećenje na STUN poslužitelja.
Također sam primijetio unos "
Hairpinning omogućuje jednom stroju na lokalnoj mreži iza NAT-a pristup drugom stroju na istoj mreži na vanjskoj adresi usmjerivača.
Kao rezultat toga, jednostavno sam riješio problem održavanja UDP sesije - pokrenuo sam klijenta na istom računalu s poslužiteljem.
Radilo je ovako:
- pokrenuo STUN klijent na lokalnom priključku 11111
- dobio odgovor s vanjskom IP adresom i portom XX.1XX.1X4.2XX:4398
- šalje podatke s vanjskom IP adresom i portom za e-poštu (bilo koja druga usluga je moguća) konfiguriranim na pametnom telefonu
- pokrenuo OpenVPN poslužitelj na računalu koje sluša UDP/11111 port
- pokrenuo OpenVPN klijent na računalu navodeći XX.1XX.1X4.2XX:4398 za povezivanje
- u bilo kojem trenutku pokrenuo OpenVPN klijent na pametnom telefonu navodeći IP adresu i port (u mom slučaju IP adresa se nije promijenila) za povezivanje
Na ovaj sam se način uspio spojiti na svoje računalo sa svog pametnog telefona. Ova implementacija vam omogućuje povezivanje bilo kojeg OpenVPN klijenta.
Praksa
Trebat će vam:
# apt install openvpn stun-client sendemail
Nakon što smo napisali par skripti, par konfiguracijskih datoteka i generirali potrebne certifikate (pošto klijent na pametnom telefonu radi samo s certifikatima), dobili smo uobičajenu implementaciju OpenVPN servera.
Glavna skripta na računalu
# 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
Skripta za slanje podataka e-poštom:
# 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"
Konfiguracijska datoteka poslužitelja:
# 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
Konfiguracijska datoteka klijenta:
# 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
Certifikati su generirani pomoću
Pokretanje skripte:
# ./vpn11.sh
Tako što ga prvo učinite izvršnim
# chmod +x vpn11.sh
Na strani pametnog telefona
Instaliranjem aplikacije OpenVPN za Android, nakon što je kopirao konfiguracijsku datoteku, certifikate i konfigurirao je, ispalo je ovako:
Provjeravam e-poštu na pametnom telefonu
Uredim broj porta u postavkama
Pokrenem klijent i spojim se
Dok sam pisao ovaj članak, prebacio sam konfiguraciju sa svog računala na Raspberry Pi 3 i pokušao pokrenuti cijelu stvar na LTE modemu, ali nije išlo! Rezultat naredbe
# stun stun.ekiga.net -p 11111
STUN klijent verzija 0.97
Primarno: neovisno mapiranje, filtar ovisan o portu, nasumični port, bit će ukosnica
Povratna vrijednost je 0x000006
vrijednost Filtar ovisan o portu nije dopustio pokretanje sustava.
No, domaći pružatelj omogućio je pokretanje sustava na Raspberry Pi 3 bez ikakvih problema.
U kombinaciji s web kamerom, s VLC za
stvaranje RTSP streama s web kamere
$ 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
i VLC na pametnom telefonu za gledanje (stream rtsp://10.2.0.1:8554/), pokazao se kao dobar daljinski sustav video nadzora, možete instalirati i Sambu, usmjeravati promet preko VPN-a, daljinski upravljati računalom i još mnogo toga više...
Izlaz
Kao što je praksa pokazala, za organiziranje VPN poslužitelja možete bez vanjske IP adrese za koju morate platiti, baš kao i za iznajmljeni VPS/VDS. Ali sve ovisi o provajderu. Naravno, želio sam dobiti više informacija o različitim pružateljima usluga i vrstama korištenih NAT-ova, ali ovo je tek početak...
Hvala vam!
Izvor: www.habr.com