Провайдердің NAT артында VPN серверін іске қосу

Мен VPN серверін үй провайдерімнің NAT артында (ақ IP мекенжайсыз) қалай іске қосқаным туралы мақала. Маған бірден тапсырыс беруге рұқсат етіңіз: бұл бұл іске асырудың өнімділігі провайдер, сондай-ақ маршрутизатор пайдаланатын NAT түріне тікелей байланысты.
Сонымен, мен Android смартфонынан үйдегі компьютерге қосылуым керек болды, екі құрылғы да Интернетке NAT провайдері арқылы қосылған, сонымен қатар компьютер үй маршрутизаторы арқылы қосылған, ол да NAT қосылымдары.
Ақ IP мекенжайы бар жалға алынған VPS/VDS, сондай-ақ провайдерден ақ IP мекенжайын жалға алудың классикалық схемасы бірнеше себептер бойынша қарастырылмады.
ескере отырып өткен мақалалардан тәжірибе, провайдерлердің STUN және NAT құрылғыларымен бірнеше эксперименттер жүргізді. Мен OpenWRT микробағдарламасы бар үй маршрутизаторында пәрменді іске қосу арқылы кішкене эксперимент жасауды шештім:

$ stun stun.sipnet.ru

нәтиже алды:

STUN клиентінің 0.97 нұсқасы
Негізгі: Тәуелсіз салыстыру, тәуелсіз сүзгі, кездейсоқ порт, шаш қыстырғышы
Қайтарылатын мән 0x000002

Сөзбе-сөз аударма:
Independent Mapping – тәуелсіз карта жасау
Independent Filter - тәуелсіз сүзгі
кездейсоқ порт – кездейсоқ порт
шаш қыстырғыш болады - шаш қыстырғыш болады
Менің компьютерімде ұқсас пәрменді іске қосып, мен алдым:

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 аудармашысы ретінде оны тастады.
Провайдердің NAT артында VPN серверін іске қосу
Бірақ 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 мекенжайынан Интернеттен сұрауларды ала алдым. Осы сәтте мен UDP/11111 портын тыңдап, смартфонда сыртқы IP мекенжайы мен портын (XX.1XX.1X4.2XX:4398) көрсетіп, смартфоннан сәтті қосылатын OpenVPN серверін іске қостым (оны бұрын конфигурациялаған). компьютер. Бірақ бұл іске асыруда мәселе туындады: OpenVPN клиенті серверге қосылғанша UDP сеансын қандай да бір түрде сақтау керек болды; Маған STUN клиентін мерзімді түрде іске қосу опциясы ұнамады - жүктемені босқа жібергім келмеді. STUN серверлері.
Мен де жазбаны байқадым «шаш қыстырғыш болады - шаш қыстырғыш болады", осы режим

Шашты қысу NAT артындағы жергілікті желідегі бір құрылғыға маршрутизатордың сыртқы мекенжайындағы сол желідегі басқа құрылғыға кіруге мүмкіндік береді.

Провайдердің NAT артында VPN серверін іске қосу
Нәтижесінде мен жай ғана UDP сеансын жүргізу мәселесін шештім - мен клиентті сервермен бір компьютерде іске қостым.
Ол келесідей жұмыс істеді:

  • 11111 жергілікті портында STUN клиентін іске қосты
  • сыртқы IP мекенжайы және XX.1XX.1X4.2XX:4398 порты бар жауап алды
  • смартфонда конфигурацияланған сыртқы IP мекенжайы мен порты бар деректерді электрондық поштаға жібереді (кез келген басқа қызмет мүмкін).
  • UDP/11111 портын тыңдайтын компьютерде OpenVPN серверін іске қосты
  • қосылу үшін XX.1XX.1X4.2XX:4398 көрсететін компьютерде OpenVPN клиентін іске қосты.
  • кез келген уақытта қосылу үшін смартфонда IP мекенжайы мен портын (менің жағдайда IP мекенжайы өзгерген жоқ) көрсететін OpenVPN клиентін іске қосты.

Провайдердің NAT артында VPN серверін іске қосу
Осылайша мен смартфоннан компьютерге қосыла алдым. Бұл іске асыру кез келген 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

Смартфон жағында

Қолданбаны орнату арқылы Android жүйесіне арналған OpenVPN, конфигурация файлын, сертификаттарды көшіріп, оны конфигурациялағанда келесідей болды:
Мен электрондық поштамды смартфонда тексеремінПровайдердің NAT артында VPN серверін іске қосу
Мен параметрлерде порт нөмірін өңдеймінПровайдердің NAT артында VPN серверін іске қосу
Мен клиентті іске қосып, қосыламынПровайдердің NAT артында VPN серверін іске қосу

Осы мақаланы жазу кезінде мен конфигурацияны компьютерімнен 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 (stream rtsp://10.2.0.1:8554/), бұл жақсы қашықтағы бейнебақылау жүйесі болып шықты, сонымен қатар Samba орнатуға, VPN арқылы трафикті бағыттауға, компьютерді қашықтан басқаруға және т.б. Көбірек...

қорытынды

Тәжірибе көрсеткендей, VPN серверін ұйымдастыру үшін сіз жалға алынған VPS/VDS сияқты төлеу қажет сыртқы IP мекенжайынсыз жасай аласыз. Бірақ бәрі провайдерге байланысты. Әрине, мен әртүрлі провайдерлер мен қолданылатын NAT түрлері туралы көбірек ақпарат алғым келді, бірақ бұл бастамасы ғана...
Назарларыңызға рахмет!

Ақпарат көзі: www.habr.com

пікір қалдыру