Статија за тоа како успеав да стартувам VPN сервер зад NAT на мојот домашен провајдер (без бела IP адреса). Веднаш да направам резервација: тоа перформансите на оваа имплементација директно зависи од типот на NAT што го користи вашиот провајдер, како и од рутерот.
Така, требаше да се поврзам од мојот Android смартфон со мојот домашен компјутер, двата уреди се поврзани на Интернет преку NAT-и на провајдерите, плус компјутерот е поврзан преку домашен рутер, кој исто така се поврзува со NAT.
Класичната шема со користење на изнајмен VPS/VDS со бела IP адреса, како и изнајмување бела IP адреса од провајдер, не беше разгледана од неколку причини.
Земајќи ги во предвид
$ stun stun.sipnet.ru
го доби резултатот:
STUN клиент верзија 0.97
Примарно: Независно мапирање, Независен филтер, случајна порта, ќе биде фиба
Повратната вредност е 0x000002
Буквален превод:
Независно мапирање - независно мапирање
Независен филтер - независен филтер
случајна порта - случајна порта
ќе фиба - ќе има фиба
Извршувајќи слична команда на мојот компјутер, добив:
STUN клиент верзија 0.97
Примарно: Независно мапирање, филтер зависен од пристаништето, случаен приклучок, фиба
Повратната вредност е 0x000006
Port Dependent Filter - филтер зависен од портата
Разликата во резултатите од излезот на командата укажа дека домашниот рутер го дава „својот придонес“ во процесот на пренос на пакети од Интернет; тоа се манифестираше во фактот дека при извршување на командата на компјутерот:
stun stun.sipnet.ru -p 11111 -v
Го добив резултатот:
...
MappedAddress = XX.1XX.1X4.2XX:4398
...
во овој момент, UDP сесија беше отворена некое време, ако во овој момент испратите барање UDP (на пример: netcat XX.1XX.1X4.2XX 4398 -u), тогаш барањето дојде до домашниот рутер, што беше потврдено од TCPDump што работи на него, но барањето не стигна до компјутерот - IPtables, како NAT преведувач на рутерот, го исфрли.
Но, самиот факт што барањето за UDP помина низ NAT на давателот даде надеж за успех. Бидејќи рутерот се наоѓа во моја јурисдикција, го решив проблемот со пренасочување на портата UDP/11111 на компјутерот:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX
Така, можев да иницирам UDP сесија и да примам барања од Интернет од која било IP адреса. Во овој момент, го стартував OpenVPN-серверот (претходно го конфигурирав) слушајќи ја портата UDP/11111, ја наведов надворешната IP адреса и портата (XX.1XX.1X4.2XX:4398) на паметниот телефон и успешно се поврзав од паметниот телефон на компјутерот. Но, во оваа имплементација се појави проблем: беше неопходно некако да се одржи UDP сесијата додека клиентот OpenVPN не се поврзе со серверот; не ми се допадна опцијата периодично да го стартувам клиентот STUN - не сакав да го трошам товарот на серверите STUN.
Го забележав и записот „
Косањето на косата овозможува една машина на локална мрежа зад NAT да пристапи до друга машина на истата мрежа на надворешната адреса на рутерот.
Како резултат на тоа, едноставно го решив проблемот со одржување на UDP сесија - го стартував клиентот на истиот компјутер со серверот.
Работеше вака:
- го лансираше STUN клиентот на локалната порта 11111
- доби одговор со надворешна IP адреса и порта XX.1XX.1X4.2XX:4398
- испратени податоци со надворешна IP адреса и порта до е-пошта (можна е која било друга услуга) конфигурирани на паметниот телефон
- го лансираше серверот OpenVPN на компјутер што слуша UDP/11111 порта
- го лансираше клиентот OpenVPN на компјутерот наведувајќи XX.1XX.1X4.2XX:4398 за поврзување
- во секое време го лансираше клиентот OpenVPN на паметниот телефон, означувајќи ја IP адресата и портата (во мојот случај IP адресата не се промени) за да се поврзете
На овој начин можев да се поврзам со мојот компјутер од мојот паметен телефон. Оваа имплементација ви овозможува да поврзете кој било клиент OpenVPN.
Пракса
Ќе треба:
# apt install openvpn stun-client sendemail
Откако напишавме неколку скрипти, неколку конфигурациски датотеки и ги генериравме потребните сертификати (бидејќи клиентот на паметен телефон работи само со сертификати), ја добивме вообичаената имплементација на серверот OpenVPN.
Главна скрипта на компјутерот
# 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
Скрипта за испраќање податоци по е-пошта:
# 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"
Датотека за конфигурација на серверот:
# 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
Датотека за конфигурација на клиентот:
# 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
Сертификатите беа генерирани со користење
Водење на сценариото:
# ./vpn11.sh
Со тоа што прво ќе го направиме извршно
# chmod +x vpn11.sh
На страната на паметниот телефон
Со инсталирање на апликацијата OpenVPN за Android, откако ја копиравте конфигурациската датотека, сертификатите и ја конфигуриравте, се покажа вака:
Ја проверувам мојата е-пошта на мојот паметен телефон
Го уредувам бројот на портата во поставките
Го стартувам клиентот и се поврзувам
Додека ја пишував оваа статија, ја префрлив конфигурацијата од мојот компјутер на Raspberry Pi 3 и се обидов да ја извршам целата работа на LTE модем, но тоа не функционираше! Резултат на командата
# stun stun.ekiga.net -p 11111
STUN клиент верзија 0.97
Примарно: Независно мапирање, филтер зависен од пристаништето, случаен приклучок, фиба
Повратната вредност е 0x000006
вредност Филтер зависен од порта не дозволи системот да стартува.
Но, домашниот провајдер дозволи системот да започне на Raspberry Pi 3 без никакви проблеми.
Во врска со веб камера, со VLC за
создавање на RTSP поток од веб камера
$ 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
и VLC на паметен телефон за гледање (стрим rtsp://10.2.0.1:8554/), се покажа дека е добар систем за видео надзор од далечина, можете исто така да инсталирате Samba, да насочувате сообраќај преку VPN, далечински да го контролирате вашиот компјутер и многу повеќе...
Излез
Како што покажа практиката, за да организирате VPN сервер, можете да направите без надворешна IP адреса за која треба да платите, исто како и за изнајмен VPS/VDS. Но, сето тоа зависи од давателот. Се разбира, сакав да добијам повеќе информации за различните провајдери и типови на NAT кои се користат, но ова е само почеток...
Ви благодариме!
Извор: www.habr.com