ใช้งานเซิร์ฟเวอร์ VPN ที่อยู่เบื้องหลัง NAT ของผู้ให้บริการ

บทความเกี่ยวกับวิธีที่ฉันจัดการเพื่อใช้งานเซิร์ฟเวอร์ VPN ที่อยู่เบื้องหลัง NAT ของผู้ให้บริการที่บ้านของฉัน (โดยไม่มีที่อยู่ IP สีขาว) ให้ฉันจองทันที:ว่า ประสิทธิภาพของการใช้งานนี้โดยตรงขึ้นอยู่กับประเภทของ NAT ที่ผู้ให้บริการของคุณใช้รวมถึงเราเตอร์ด้วย.
ดังนั้นฉันจึงจำเป็นต้องเชื่อมต่อจากสมาร์ทโฟน Android กับคอมพิวเตอร์ที่บ้าน อุปกรณ์ทั้งสองเชื่อมต่อกับอินเทอร์เน็ตผ่าน NAT ของผู้ให้บริการ อีกทั้งคอมพิวเตอร์ยังเชื่อมต่อผ่านเราเตอร์ที่บ้าน ซึ่งมีการเชื่อมต่อ NAT ด้วย
รูปแบบคลาสสิกที่ใช้ VPS/VDS แบบเช่าพร้อมที่อยู่ IP สีขาว รวมถึงการเช่าที่อยู่ IP สีขาวจากผู้ให้บริการ ไม่ได้รับการพิจารณาด้วยเหตุผลหลายประการ
โดยคำนึงถึง ประสบการณ์จากบทความที่ผ่านมาได้ทำการทดลองหลายครั้งกับ STUN และ NAT ของผู้ให้บริการ ฉันตัดสินใจทำการทดลองเล็กน้อยโดยรันคำสั่งบนเราเตอร์ที่บ้านที่ใช้เฟิร์มแวร์ OpenWRT:

$ stun stun.sipnet.ru

ได้ผลลัพธ์:

ไคลเอนต์ STUN เวอร์ชัน 0.97
หลัก: การแมปอิสระ, ฟิลเตอร์อิสระ, พอร์ตสุ่ม, จะติดกิ๊บ
ค่าส่งคืนคือ 0x000002

การแปลตามตัวอักษร:
การทำแผนที่อิสระ - การทำแผนที่อิสระ
ตัวกรองอิสระ - ตัวกรองอิสระ
พอร์ตสุ่ม - พอร์ตสุ่ม
จะกิ๊บ - ก็จะมีกิ๊บ
เมื่อใช้คำสั่งที่คล้ายกันบนพีซีของฉัน ฉันได้รับ:

ไคลเอนต์ STUN เวอร์ชัน 0.97
หลัก: การแมปอิสระ, ตัวกรองขึ้นอยู่กับพอร์ต, พอร์ตสุ่ม, จะติดกิ๊บ
ค่าส่งคืนคือ 0x000006

ตัวกรองขึ้นอยู่กับพอร์ต - ตัวกรองขึ้นอยู่กับพอร์ต
ความแตกต่างในผลลัพธ์ของเอาต์พุตคำสั่งระบุว่าเราเตอร์ที่บ้านกำลัง "สนับสนุน" ในกระบวนการส่งแพ็กเก็ตจากอินเทอร์เน็ต สิ่งนี้แสดงให้เห็นในความจริงที่ว่าเมื่อดำเนินการคำสั่งบนคอมพิวเตอร์:

stun stun.sipnet.ru -p 11111 -v

ฉันได้รับผลลัพธ์:

...
ที่อยู่ที่แมป = XX.1XX.1X4.2XX:4398
...

ในขณะนี้ เซสชัน UDP ถูกเปิดมาระยะหนึ่งแล้วหากในขณะนี้คุณส่งคำขอ UDP (เช่น: netcat XX.1XX.1X4.2XX 4398 -u) คำขอนั้นก็มาถึงเราเตอร์ที่บ้านซึ่งก็คือ ยืนยันโดย TCPDump ที่ทำงานอยู่ แต่คำขอไปไม่ถึงคอมพิวเตอร์ - IPtables ซึ่งเป็นนักแปล NAT บนเราเตอร์จึงทิ้งมันไป
ใช้งานเซิร์ฟเวอร์ VPN ที่อยู่เบื้องหลัง 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
ฉันยังสังเกตเห็นรายการ “จะกิ๊บ - ก็จะมีกิ๊บ"โหมดนี้

Hairpinning อนุญาตให้เครื่องหนึ่งบนเครือข่ายท้องถิ่นที่อยู่ด้านหลัง NAT เข้าถึงเครื่องอื่นบนเครือข่ายเดียวกันตามที่อยู่ภายนอกของเราเตอร์

ใช้งานเซิร์ฟเวอร์ VPN ที่อยู่เบื้องหลัง NAT ของผู้ให้บริการ
ด้วยเหตุนี้ ฉันเพียงแค่แก้ไขปัญหาในการรักษาเซสชัน UDP - ฉันเปิดตัวไคลเอนต์บนคอมพิวเตอร์เครื่องเดียวกันกับเซิร์ฟเวอร์
มันทำงานเช่นนี้:

  • เปิดตัวไคลเอนต์ STUN บนพอร์ตท้องถิ่น 11111
  • ได้รับการตอบกลับด้วยที่อยู่ IP ภายนอกและพอร์ต XX.1XX.1X4.2XX:4398
  • ส่งข้อมูลด้วยที่อยู่ IP ภายนอกและพอร์ตไปยังอีเมล (บริการอื่น ๆ ที่เป็นไปได้) ที่กำหนดค่าบนสมาร์ทโฟน
  • เปิดตัวเซิร์ฟเวอร์ OpenVPN บนคอมพิวเตอร์ที่กำลังฟังพอร์ต UDP/11111
  • เปิดตัวไคลเอนต์ OpenVPN บนคอมพิวเตอร์ที่ระบุ XX.1XX.1X4.2XX:4398 สำหรับการเชื่อมต่อ
  • เปิดตัวไคลเอนต์ OpenVPN บนสมาร์ทโฟนเมื่อใดก็ได้โดยระบุที่อยู่ IP และพอร์ต (ในกรณีของฉันที่อยู่ IP ไม่เปลี่ยนแปลง) เพื่อเชื่อมต่อ

ใช้งานเซิร์ฟเวอร์ VPN ที่อยู่เบื้องหลัง NAT ของผู้ให้บริการ
ด้วยวิธีนี้ ฉันสามารถเชื่อมต่อกับคอมพิวเตอร์จากสมาร์ทโฟนได้ การใช้งานนี้ทำให้คุณสามารถเชื่อมต่อไคลเอนต์ 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เมื่อคัดลอกไฟล์กำหนดค่าใบรับรองและกำหนดค่าแล้วจะได้ดังนี้:
ฉันตรวจสอบอีเมลบนสมาร์ทโฟนของฉันใช้งานเซิร์ฟเวอร์ VPN ที่อยู่เบื้องหลัง NAT ของผู้ให้บริการ
ฉันแก้ไขหมายเลขพอร์ตในการตั้งค่าใช้งานเซิร์ฟเวอร์ VPN ที่อยู่เบื้องหลัง NAT ของผู้ให้บริการ
ฉันเปิดตัวไคลเอนต์และเชื่อมต่อใช้งานเซิร์ฟเวอร์ VPN ที่อยู่เบื้องหลัง NAT ของผู้ให้บริการ

ในขณะที่เขียนบทความนี้ ฉันได้โอนการกำหนดค่าจากคอมพิวเตอร์ของฉันไปยัง 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 ที่ใช้ แต่นี่เป็นเพียงจุดเริ่มต้น...
ขอบคุณ!

ที่มา: will.com

เพิ่มความคิดเห็น