مقاله ای در مورد اینکه چگونه توانستم یک سرور VPN را در پشت NAT یک ارائه دهنده خانگی (بدون آدرس IP سفید) اجرا کنم. اجازه دهید فوراً به شما بگویم: عملکرد این پیاده سازی مستقیماً به نوع NAT استفاده شده توسط ارائه دهنده شما و همچنین روتر بستگی دارد.
بنابراین، من نیاز داشتم که از تلفن هوشمند اندرویدی خود به رایانه خانگی خود متصل شوم، هر دو دستگاه از طریق NAT های ارائه دهنده به اینترنت متصل می شوند، به علاوه رایانه از طریق یک روتر خانگی وصل می شود، که اتصالات NAT نیز دارد.
طرح کلاسیک با استفاده از VPS / VDS اجاره ای با آدرس IP سفید و همچنین اجاره یک آدرس IP سفید از ارائه دهنده، به چند دلیل در نظر گرفته نشد.
با در نظر گرفتن
$ stun stun.sipnet.ru
نتیجه گرفت:
STUN کلاینت نسخه 0.97
اولیه: نقشه برداری مستقل، فیلتر مستقل، پورت تصادفی، سنجاق سر
مقدار بازگشتی است 0x000002
ترجمه تحت اللفظی:
نقشه برداری مستقل - نمایشگر مستقل
فیلتر مستقل - فیلتر مستقل
پورت تصادفی - پورت تصادفی
سنجاق سر - سنجاق سر وجود خواهد داشت
پس از اجرای دستور مشابه در رایانه شخصی، دریافتم:
STUN کلاینت نسخه 0.97
اولیه: نقشهبرداری مستقل، فیلتر وابسته به پورت، پورت تصادفی، سنجاق سر
مقدار بازگشتی است 0x000006
فیلتر وابسته به پورت - فیلتر وابسته به پورت
تفاوت در نتایج خروجی دستورات نشان می دهد که روتر خانگی "سهم خود" را در فرآیند پخش بسته ها از اینترنت انجام می دهد ، این در این واقعیت آشکار شد که هنگام اجرای دستور بر روی رایانه:
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) را روی گوشی هوشمند نشان دادم و با موفقیت از گوشی هوشمند به کامپیوتر. اما در این پیاده سازی، مشکلی پیش آمد، لازم بود تا زمانی که کلاینت OpenVPN به سرور متصل شود، جلسه UDP را به نحوی حفظ کنیم، گزینه راه اندازی دوره ای STUN کلاینت را دوست نداشتم - نمی خواستم سرورهای STUN را بارگیری کنم. بیهوده
همچنین توجه به مدخل "
Hairpinning به یک ماشین در یک شبکه محلی پشت 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
در سمت گوشی هوشمند
با نصب اپلیکیشن 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، می توانید بدون یک آدرس IP خارجی که برای آن باید پرداخت کنید، و همچنین VPS / VDS اجاره ای انجام دهید. اما همه چیز به ارائه دهنده بستگی دارد. البته، من می خواستم اطلاعات بیشتری در مورد ارائه دهندگان مختلف و انواع NAT های مورد استفاده به دست بیاورم، اما این تنها شروع است ...
با تشکر از شما!
منبع: www.habr.com