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