Ev provayderimin NAT arxasında (ağ IP ünvanı olmadan) VPN serverini necə idarə etməyi bacardığım haqqında məqalə. İcazə verin, dərhal rezervasiya edim: bu bu tətbiqin performansı birbaşa provayderinizin, eləcə də marşrutlaşdırıcının istifadə etdiyi NAT növündən asılıdır.
Beləliklə, mən Android smartfonumdan ev kompüterimə qoşulmalı oldum, hər iki cihaz provayder NAT-ları vasitəsilə İnternetə qoşulub, üstəlik kompüter NAT-a qoşulan ev marşrutlaşdırıcısı vasitəsilə qoşulub.
Ağ IP ünvanı ilə icarəyə götürülmüş VPS/VDS-dən istifadə edən klassik sxem, eləcə də provayderdən ağ IP ünvanını icarəyə götürmək bir neçə səbəbə görə nəzərə alınmadı.
Nəzərə alaraq
$ stun stun.sipnet.ru
nəticə əldə etdi:
STUN müştəri versiyası 0.97
İbtidai: Müstəqil Xəritəçəkmə, Müstəqil Filtr, təsadüfi port, saç düzümü
Qaytarılan dəyərdir 0x000002
Hərfi tərcümə:
Müstəqil Xəritəçəkmə - müstəqil xəritəçəkmə
Müstəqil Filtr - müstəqil filtr
təsadüfi port - təsadüfi port
saç sancısı olacaq - saç sancısı olacaq
Bənzər bir əmri kompüterimdə işlətməklə mən əldə etdim:
STUN müştəri versiyası 0.97
İlkin: Müstəqil Xəritəçəkmə, Portdan Asılı Filtr, təsadüfi port, saç tıxacları
Qaytarılan dəyərdir 0x000006
Port Dependent Filter - portdan asılı filtr
Komanda çıxışının nəticələrindəki fərq, ev marşrutlaşdırıcısının İnternetdən paketlərin ötürülməsi prosesinə "töhfəsini" etdiyini göstərdi; bu, kompüterdə əmri yerinə yetirərkən özünü göstərdi:
stun stun.sipnet.ru -p 11111 -v
Nəticəni alırdım:
...
Xəritəli Ünvan = XX.1XX.1X4.2XX:4398
...
bu anda bir müddət UDP sessiyası açıldı, əgər bu anda bir UDP sorğusu göndərsəniz (məsələn: netcat XX.1XX.1X4.2XX 4398 -u), o zaman sorğu ev marşrutlaşdırıcısına gəldi. üzərində işləyən TCPDump tərəfindən təsdiqləndi, lakin sorğu kompüterə çatmadı - IPtables, marşrutlaşdırıcıda NAT tərcüməçisi olaraq onu atdı.
Ancaq UDP sorğusunun provayderin NAT-dan keçməsi uğura ümid verdi. Router mənim yurisdiksiyamda yerləşdiyi üçün problemi UDP/11111 portunu kompüterə yönləndirməklə həll etdim:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX
Beləliklə, mən UDP sessiyasına başlaya bildim və istənilən IP ünvanından İnternetdən sorğular ala bildim. Bu anda mən UDP/11111 portunu dinləyən OpenVPN-serverini işə saldım (əvvəllər onu konfiqurasiya etmişəm), smartfonda xarici IP ünvanını və portunu (XX.1XX.1X4.2XX:4398) göstərdim və smartfondan uğurla qoşuldum. Kompüter. Ancaq bu tətbiqdə bir problem yarandı: OpenVPN müştəri serverə qoşulana qədər UDP sessiyasını birtəhər saxlamaq lazım idi; STUN müştərisini vaxtaşırı işə salmaq seçimini bəyənmədim - yükü sərf etmək istəmədim. STUN serverləri.
Mən də qeyd etdim "
Saç kəsmə NAT-ın arxasındakı yerli şəbəkədə bir maşına marşrutlaşdırıcının xarici ünvanında eyni şəbəkədəki digər maşına daxil olmaq imkanı verir.
Nəticədə, mən sadəcə olaraq UDP sessiyasını saxlamaq problemini həll etdim - müştərini serverlə eyni kompüterdə işə saldım.
Bu belə işlədi:
- yerli port 11111-də STUN müştərisini işə saldı
- xarici IP ünvanı və XX.1XX.1X4.2XX:4398 portu ilə cavab aldı
- smartfonda konfiqurasiya edilmiş xarici IP ünvanı və portu olan məlumatları e-poçta göndərmək (hər hansı digər xidmət mümkündür).
- UDP/11111 portunu dinləyən kompüterdə OpenVPN serverini işə saldı
- qoşulma üçün XX.1XX.1X4.2XX:4398 göstərərək kompüterdə OpenVPN müştərisini işə saldı
- istənilən vaxt qoşulmaq üçün IP ünvanını və portunu (mənim vəziyyətimdə IP ünvanı dəyişməyib) göstərən OpenVPN müştərisini smartfonda işə saldı.
Bu yolla mən smartfondan kompüterimə qoşula bildim. Bu proqram istənilən OpenVPN müştərisini birləşdirməyə imkan verir.
Praktika
Alacaq:
# apt install openvpn stun-client sendemail
Bir neçə skript, bir neçə konfiqurasiya faylı yazdıqdan və lazımi sertifikatları yaratdıqdan sonra (smartfondakı müştəri yalnız sertifikatlarla işlədiyi üçün) biz OpenVPN serverinin adi tətbiqini əldə etdik.
Kompüterdə əsas skript
# 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
E-poçt vasitəsilə məlumat göndərmək üçün skript:
# 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"
Server konfiqurasiya faylı:
# 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
Müştəri konfiqurasiya faylı:
# 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
Sertifikatlar istifadə edərək yaradıldı
Skriptin icrası:
# ./vpn11.sh
Əvvəlcə onu icra edilə bilən hala gətirməklə
# chmod +x vpn11.sh
Smartfon tərəfində
Proqramı quraşdıraraq Android üçün OpenVPN, konfiqurasiya faylını, sertifikatları kopyalayıb konfiqurasiya etdikdən sonra belə oldu:
Smartfonumda e-poçtumu yoxlayıram
Parametrlərdə port nömrəsini redaktə edirəm
Mən müştərini işə salıram və qoşuluram
Bu məqaləni yazarkən mən konfiqurasiyanı kompüterimdən Raspberry Pi 3-ə köçürdüm və hər şeyi LTE modemində işlətməyə çalışdım, amma alınmadı! Komanda Nəticəsi
# stun stun.ekiga.net -p 11111
STUN müştəri versiyası 0.97
İlkin: Müstəqil Xəritəçəkmə, Portdan Asılı Filtr, təsadüfi port, saç tıxacları
Qaytarılan dəyərdir 0x000006
dəyər Portdan asılı filtr sistemin işə salınmasına imkan vermədi.
Ancaq ev provayderi sistemin Raspberry Pi 3-də heç bir problem olmadan işə salınmasına icazə verdi.
Veb kamera ilə birlikdə VLC üçün
veb kameradan RTSP axını yaratmaq
$ 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
və baxmaq üçün bir smartfonda VLC (stream rtsp://10.2.0.1:8554/), yaxşı uzaqdan video nəzarət sistemi olduğu ortaya çıxdı, siz həmçinin Samba quraşdıra, VPN vasitəsilə trafik yönləndirə, kompüterinizi uzaqdan idarə edə və daha çox şey edə bilərsiniz. daha çox...
Buraxılış
Təcrübə göstərdiyi kimi, VPN serverini təşkil etmək üçün icarəyə götürülmüş VPS/VDS kimi, ödəniş etməli olduğunuz xarici IP ünvanı olmadan edə bilərsiniz. Ancaq hamısı provayderdən asılıdır. Əlbəttə ki, müxtəlif provayderlər və istifadə olunan NAT növləri haqqında daha çox məlumat almaq istəyirdim, lakin bu, yalnız başlanğıcdır...
Diqqətiniz üçün təşəkkür edirik!
Mənbə: www.habr.com