مهاجرت از OpenVPN به WireGuard برای ادغام شبکه ها در یک شبکه L2

مهاجرت از OpenVPN به WireGuard برای ادغام شبکه ها در یک شبکه L2

من می خواهم تجربه خود را از ترکیب شبکه ها در سه آپارتمان از نظر جغرافیایی دور که هر کدام از روترهایی با OpenWRT به عنوان دروازه استفاده می کنند، در یک شبکه مشترک به اشتراک بگذارم. هنگام انتخاب روشی برای ترکیب شبکه‌ها بین L3 با مسیریابی زیرشبکه و L2 با پل زدن، زمانی که تمام گره‌های شبکه در یک زیر شبکه قرار می‌گیرند، اولویت به روش دوم داده شد که پیکربندی آن دشوارتر است، اما فرصت‌های بیشتری را فراهم می‌کند، زیرا شفاف است. استفاده از فناوری ها در شبکه ایجاد شده Wake-on-Lan و DLNA برنامه ریزی شده بود.

قسمت 1: پس زمینه

OpenVPN در ابتدا به عنوان پروتکل برای اجرای این کار انتخاب شد، زیرا اولاً می تواند یک دستگاه ضربه ای ایجاد کند که می تواند بدون هیچ مشکلی به پل اضافه شود و ثانیاً OpenVPN از عملیات روی پروتکل TCP پشتیبانی می کند که این نیز مهم بود. هیچ یک از آپارتمان ها آدرس IP اختصاصی نداشتند و من نتوانستم از STUN استفاده کنم، زیرا به دلایلی ISP من اتصالات UDP ورودی از شبکه های آنها را مسدود می کند، در حالی که پروتکل TCP به من اجازه می داد که پورت سرور VPN را روی VPS اجاره ای با استفاده از SSH ارسال کنم. بله، این رویکرد بار زیادی را به همراه دارد، زیرا داده ها دو بار رمزگذاری می شوند، اما من نمی خواستم VPS را به شبکه خصوصی خود وارد کنم، زیرا هنوز خطر کنترل اشخاص ثالث بر روی آن وجود دارد، بنابراین، داشتن چنین دستگاهی در شبکه خانگی بسیار نامطلوب بود و تصمیم گرفته شد برای امنیت با سربار بزرگ پرداخت شود.

برای ارسال پورت روی روتری که قرار بود سرور روی آن مستقر شود، از برنامه sshtunnel استفاده شد. من پیچیدگی های پیکربندی آن را شرح نمی دهم - این به راحتی انجام می شود، فقط توجه می کنم که وظیفه آن انتقال پورت TCP 1194 از روتر به VPS بود. سپس سرور OpenVPN روی دستگاه tap0 که به پل br-lan متصل بود پیکربندی شد. پس از بررسی اتصال به سرور تازه ایجاد شده از لپ تاپ، مشخص شد که ایده انتقال پورت خود را توجیه می کند و لپ تاپ من به عضویت شبکه روتر درآمده است، اگرچه از نظر فیزیکی در آن نبود.

موضوع کوچک باقی ماند: لازم بود آدرس های IP در آپارتمان های مختلف توزیع شود تا با هم تداخل نداشته باشند و روترها را به عنوان مشتریان OpenVPN پیکربندی کنند.
آدرس‌های IP روتر و محدوده سرور DHCP زیر انتخاب شدند:

  • 192.168.10.1 با برد 192.168.10.2 - 192.168.10.80 برای سرور
  • 192.168.10.100 با برد 192.168.10.101 - 192.168.10.149 برای یک روتر در آپارتمان شماره 2
  • 192.168.10.150 با برد 192.168.10.151 - 192.168.10.199 برای یک روتر در آپارتمان شماره 3

همچنین لازم بود با افزودن خط به پیکربندی آن، دقیقاً این آدرس ها را به روترهای مشتری سرور OpenVPN اختصاص دهید:

ifconfig-pool-persist /etc/openvpn/ipp.txt 0

و خطوط زیر را به فایل /etc/openvpn/ipp.txt اضافه کنید:

flat1_id 192.168.10.100
flat2_id 192.168.10.150

که در آن flat1_id و flat2_id نام‌های دستگاهی هستند که هنگام تولید گواهی برای اتصال به OpenVPN مشخص شده‌اند.

سپس، کلاینت‌های OpenVPN روی روترها پیکربندی شدند، دستگاه‌های tap0 در هر دو به پل br-lan اضافه شدند. در این مرحله به نظر می رسید همه چیز مرتب است، زیرا هر سه شبکه یکدیگر را می بینند و به صورت کلی کار می کنند. با این حال، یک جزئیات نه چندان خوشایند معلوم شد: گاهی اوقات دستگاه ها می توانند یک آدرس IP را نه از روتر خود دریافت کنند، با تمام عواقب بعدی. به دلایلی، روتر در یکی از آپارتمان ها زمان پاسخگویی به موقع به DHCPDISCOVER را نداشت و دستگاه آدرس اشتباهی دریافت کرد. متوجه شدم که باید چنین درخواست هایی را در tap0 روی هر یک از روترها فیلتر کنم، اما همانطور که مشخص شد، iptables نمی تواند با دستگاهی کار کند اگر بخشی از یک پل باشد و ebtables باید به کمک من بیاید. متأسفانه در سیستم عامل من نبود و مجبور شدم تصاویر را برای هر دستگاه بازسازی کنم. با انجام این کار و افزودن این خطوط به /etc/rc.local هر روتر، مشکل حل شد:

ebtables -A INPUT --in-interface tap0 --protocol ipv4 --ip-protocol udp --ip-destination-port 67:68 -j DROP
ebtables -A INPUT --in-interface tap0 --protocol ipv4 --ip-protocol udp --ip-source-port 67:68 -j DROP
ebtables -A FORWARD --out-interface tap0 --protocol ipv4 --ip-protocol udp --ip-destination-port 67:68 -j DROP
ebtables -A FORWARD --out-interface tap0 --protocol ipv4 --ip-protocol udp --ip-source-port 67:68 -j DROP

این پیکربندی به مدت سه سال به طول انجامید.

قسمت 2: معرفی WireGuard

اخیراً اینترنت به طور فزاینده ای درباره WireGuard صحبت می کند و سادگی پیکربندی آن، سرعت انتقال بالا، پینگ کم با امنیت قابل مقایسه را تحسین می کند. جستجوی اطلاعات بیشتر در مورد آن مشخص کرد که نه کار به عنوان عضو پل و نه کار روی پروتکل TCP توسط آن پشتیبانی نمی‌شود، که باعث شد فکر کنم هنوز هیچ جایگزینی برای OpenVPN برای من وجود ندارد. بنابراین آشنایی با WireGuard را به تعویق انداختم.

چند روز پیش، این خبر از طریق منابع مرتبط با فناوری اطلاعات منتشر شد مبنی بر اینکه WireGuard سرانجام با نسخه 5.6 در هسته لینوکس قرار خواهد گرفت. مقالات خبری، مثل همیشه، WireGuard را ستایش کردند. من دوباره به جستجوی راه هایی برای جایگزینی OpenVPN خوب قدیمی پرداختم. این دفعه برخورد کردم این مقاله. در مورد ایجاد یک تونل اترنت روی L3 با استفاده از GRE صحبت شد. این مقاله به من امید داد. هنوز مشخص نیست که با پروتکل UDP چه باید کرد. جستجو من را به مقالاتی در مورد استفاده از socat در ارتباط با یک تونل SSH برای ارسال یک پورت UDP هدایت کرد، با این حال، آنها اشاره کردند که این رویکرد فقط در حالت اتصال تک کار می کند، به این معنی که چندین مشتری VPN غیرممکن است. من به این فکر افتادم که یک سرور VPN روی VPS راه اندازی کنم و GRE را برای مشتریان پیکربندی کنم، اما همانطور که مشخص شد، GRE از رمزگذاری پشتیبانی نمی کند، که منجر به این واقعیت می شود که اگر اشخاص ثالث به سرور دسترسی پیدا کنند، تمام ترافیک بین شبکه های من در دست آنهاست که اصلا مناسب من نبود.

مجدداً، تصمیم به نفع رمزگذاری اضافی، با استفاده از VPN از طریق VPN طبق طرح زیر گرفته شد:

لایه XNUMX VPN:
VPS آن است سرور با آدرس داخلی 192.168.30.1
MS آن است مشتری VPS با آدرس داخلی 192.168.30.2
MK2 آن است مشتری VPS با آدرس داخلی 192.168.30.3
MK3 آن است مشتری VPS با آدرس داخلی 192.168.30.4

لایه XNUMX VPN:
MS آن است سرور با آدرس خارجی 192.168.30.2 و داخلی 192.168.31.1
MK2 آن است مشتری MS با آدرس 192.168.30.2 و دارای IP داخلی 192.168.31.2
MK3 آن است مشتری MS با آدرس 192.168.30.2 و دارای IP داخلی 192.168.31.3

* MS - روتر-سرور در آپارتمان 1، MK2 - روتر در آپارتمان 2، MK3 - روتر در آپارتمان 3
* تنظیمات دستگاه در اسپویلر انتهای مقاله منتشر شده است.

و بنابراین، پینگ بین گره های شبکه 192.168.31.0/24، زمان آن رسیده است که به راه اندازی تونل GRE بروید. قبل از آن، برای اینکه دسترسی به روترها را از دست ندهید، ارزش آن را دارد که تونل های SSH را برای ارسال پورت 22 به VPS راه اندازی کنید، به طوری که، به عنوان مثال، یک روتر از آپارتمان 10022 در پورت 2 VPS در دسترس باشد و یک روتر از آپارتمان 11122 در پورت 3 روتر VPS از آپارتمان XNUMX در دسترس خواهد بود. بهتر است ارسال را با همان sshtunnel پیکربندی کنید، زیرا در صورت افتادن تونل را بازیابی می کند.

تونل پیکربندی شده است، می توانید از طریق پورت فوروارد شده به SSH متصل شوید:

ssh root@МОЙ_VPS -p 10022

بعد، OpenVPN را غیرفعال کنید:

/etc/init.d/openvpn stop

حالا بیایید یک تونل GRE روی روتر آپارتمان 2 راه اندازی کنیم:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set grelan0 up

و رابط ایجاد شده را به پل اضافه کنید:

brctl addif br-lan grelan0

بیایید رویه مشابهی را در روتر سرور انجام دهیم:

ip link add grelan0 type gretap remote 192.168.31.2 local 192.168.31.1
ip link set grelan0 up

و همچنین، رابط ایجاد شده را به پل اضافه کنید:

brctl addif br-lan grelan0

از این لحظه پینگ ها با موفقیت به شبکه جدید می روند و من با رضایت به نوشیدن قهوه می روم. سپس، برای اینکه ببینم شبکه آن طرف سیم چگونه کار می‌کند، سعی می‌کنم SSH را به یکی از رایانه‌های آپارتمان 2 وارد کنم، اما کلاینت ssh بدون اینکه از من رمز عبور بخواهد مسدود می‌شود. من سعی می کنم از طریق telnet در پورت 22 به این رایانه متصل شوم و خطی را ببینم که از آن می توانید بفهمید که اتصال برقرار است، سرور SSH پاسخ می دهد، اما به دلایلی به من پیشنهاد ورود نمی دهد.

$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1

من سعی می کنم از طریق VNC به آن وصل شوم و یک صفحه سیاه می بینم. من خودم را متقاعد می کنم که موضوع در رایانه از راه دور است، زیرا می توانم به راحتی از این آپارتمان با استفاده از آدرس داخلی به روتر متصل شوم. با این حال، من تصمیم گرفتم از طریق روتر به این کامپیوتر SSH کنم و با تعجب متوجه شدم که اتصال موفقیت آمیز است و کامپیوتر راه دور به خوبی کار می کند، اما به کامپیوتر من نیز متصل نمی شود.

من دستگاه grelan0 را از پل خارج می کنم و OpenVPN را روی روتر آپارتمان 2 راه اندازی می کنم و مطمئن می شوم که شبکه دوباره به درستی کار می کند و اتصالات قطع نمی شود. با جستجو به انجمن‌هایی برخوردم که در آن افراد از مشکلات مشابه شکایت دارند، جایی که به آنها توصیه می‌شود MTU را بالا ببرند. زودتر گفته شود. با این حال، تا زمانی که MTU روی مقدار کافی بزرگ 7000 برای دستگاه‌های gretap تنظیم شد، یا اتصالات TCP قطع شد یا انتقال آهسته مشاهده شد. با توجه به MTU بالا برای gretap، MTU برای اتصالات WireGuard سطح اول و دوم به ترتیب روی 8000 و 7500 تنظیم شد.

من تنظیمات مشابهی را روی روتر از آپارتمان 3 انجام دادم، تنها با این تفاوت که یک رابط gretap دوم به نام grelan1 به روتر سرور اضافه شد که به پل br-lan نیز اضافه شد.

همه چیز کار می کند. اکنون می توانید مجموعه gretap را در autoload قرار دهید. برای این:

این خطوط را در /etc/rc.local روی روتر آپارتمان 2 قرار دهید:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set dev grelan0 mtu 7000
ip link set grelan0 up
brctl addif br-lan grelan0

این را به /etc/rc.local در روتر آپارتمان 3 اضافه کرد:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.3
ip link set dev grelan0 mtu 7000
ip link set grelan0 up
brctl addif br-lan grelan0

و در روتر سرور:

ip link add grelan0 type gretap remote 192.168.31.2 local 192.168.31.1
ip link set dev grelan0 mtu 7000
ip link set grelan0 up
brctl addif br-lan grelan0

ip link add grelan1 type gretap remote 192.168.31.3 local 192.168.31.1
ip link set dev grelan1 mtu 7000
ip link set grelan1 up
brctl addif br-lan grelan1

پس از راه اندازی مجدد روترهای مشتری، متوجه شدم که به دلایلی به سرور متصل نمی شوند. با اتصال به SSH آنها (خوشبختانه، من قبلا sshtunnel را برای این کار پیکربندی کرده بودم)، مشخص شد که WireGuard به دلایلی یک مسیر برای نقطه پایانی ایجاد می کند، در حالی که نادرست است. بنابراین، برای 192.168.30.2، جدول مسیر در جدول مسیر از طریق رابط pppoe-wan، یعنی از طریق اینترنت مشخص شده است، اگرچه مسیر به آن باید از طریق واسط wg0 هدایت می شد. پس از حذف این مسیر، اتصال دوباره برقرار شد. هیچ جا نتوانستم دستورالعملی در مورد اینکه چگونه WireGuard را مجبور کنم این مسیرها را ایجاد نکند پیدا کنم. علاوه بر این، من حتی متوجه نشدم که آیا این ویژگی OpenWRT است یا خود WireGuard. بدون اینکه برای مدت طولانی با این مشکل دست و پنجه نرم کنم، به سادگی به هر دو روتر در یک اسکریپت حلقه شده توسط یک تایمر، خطی که این مسیر را حذف می کند، اضافه کردم:

route del 192.168.30.2

به طور خلاصه

من هنوز به رد کامل OpenVPN نرسیده ام، زیرا گاهی اوقات نیاز به اتصال به یک شبکه جدید از طریق لپ تاپ یا تلفن دارم و نصب یک دستگاه gretap روی آنها به طور کلی غیرممکن است، اما علیرغم این، من در انتقال داده مزیت داشتم. سرعت بین آپارتمان ها و به عنوان مثال استفاده از VNC دیگر ناخوشایند نیست. پینگ اندکی کاهش یافت، اما پایدارتر شد:

هنگام استفاده از OpenVPN:

[r0ck3r@desktop ~]$ ping -c 20 192.168.10.110
PING 192.168.10.110 (192.168.10.110) 56(84) bytes of data.
64 bytes from 192.168.10.110: icmp_seq=1 ttl=64 time=133 ms
...
64 bytes from 192.168.10.110: icmp_seq=20 ttl=64 time=125 ms

--- 192.168.10.110 ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 19006ms
rtt min/avg/max/mdev = 124.722/126.152/136.907/3.065 ms

هنگام استفاده از WireGuard:

[r0ck3r@desktop ~]$ ping -c 20 192.168.10.110
PING 192.168.10.110 (192.168.10.110) 56(84) bytes of data.
64 bytes from 192.168.10.110: icmp_seq=1 ttl=64 time=124 ms
...
64 bytes from 192.168.10.110: icmp_seq=20 ttl=64 time=124 ms
--- 192.168.10.110 ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 19003ms
rtt min/avg/max/mdev = 123.954/124.423/126.708/0.675 ms

بیشتر تحت تأثیر پینگ بالا به VPS است که تقریباً 61.5 میلی‌ثانیه است

با این حال، سرعت به طور قابل توجهی افزایش یافته است. بنابراین، در آپارتمانی با سرور روتر، سرعت اتصال به اینترنت 30 مگابیت بر ثانیه و در آپارتمان های دیگر، 5 مگابیت در ثانیه است. در همان زمان، در حالی که از OpenVPN استفاده می کردم، طبق iperf نتوانستم به سرعت انتقال داده بین شبکه ها بیش از 3,8 مگابیت در ثانیه برسم، در حالی که WireGuard آن را تا همان 5 مگابیت در ثانیه "پمپ" کرد.

پیکربندی WireGuard در VPS[Interface] Address = 192.168.30.1/24
ListenPort = 51820
PrivateKey = <ЗАКРЫТЫЙ_КЛЮЧ_ДЛЯ_VPS>

[Peer] PublicKey = <ОТКРЫТЫЙ_КЛЮЧ_VPN_1_МС>
AllowedIPs = 192.168.30.2/32

[Peer] PublicKey = <ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК2>
AllowedIPs = 192.168.30.3/32

[Peer] PublicKey = <ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК3>
AllowedIPs = 192.168.30.4/32

پیکربندی WireGuard در MS (اضافه شده به /etc/config/network)

#VPN первого уровня - клиент
config interface 'wg0'
        option proto 'wireguard'
        list addresses '192.168.30.2/24'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_1_МС'
        option auto '1'
        option mtu '8000'

config wireguard_wg0
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_1_VPS'
        option endpoint_port '51820'
        option route_allowed_ips '1'
        option persistent_keepalive '25'
        list allowed_ips '192.168.30.0/24'
        option endpoint_host 'IP_АДРЕС_VPS'

#VPN второго уровня - сервер
config interface 'wg1'
        option proto 'wireguard'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_2_МС'
        option listen_port '51821'
        list addresses '192.168.31.1/24'
        option auto '1'
        option mtu '7500'

config wireguard_wg1
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК2'
        list allowed_ips '192.168.31.2'

config wireguard_wg1ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.3

        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК3'
        list allowed_ips '192.168.31.3'

پیکربندی WireGuard در MK2 (به /etc/config/network اضافه شد)

#VPN первого уровня - клиент
config interface 'wg0'
        option proto 'wireguard'
        list addresses '192.168.30.3/24'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_1_МК2'
        option auto '1'
        option mtu '8000'

config wireguard_wg0
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_1_VPS'
        option endpoint_port '51820'
        option persistent_keepalive '25'
        list allowed_ips '192.168.30.0/24'
        option endpoint_host 'IP_АДРЕС_VPS'

#VPN второго уровня - клиент
config interface 'wg1'
        option proto 'wireguard'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_2_МК2'
        list addresses '192.168.31.2/24'
        option auto '1'
        option listen_port '51821'
        option mtu '7500'

config wireguard_wg1
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МС'
        option endpoint_host '192.168.30.2'
        option endpoint_port '51821'
        option persistent_keepalive '25'
        list allowed_ips '192.168.31.0/24'

پیکربندی WireGuard در MK3 (به /etc/config/network اضافه شد)

#VPN первого уровня - клиент
config interface 'wg0'
        option proto 'wireguard'
        list addresses '192.168.30.4/24'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_1_МК3'
        option auto '1'
        option mtu '8000'

config wireguard_wg0
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_1_VPS'
        option endpoint_port '51820'
        option persistent_keepalive '25'
        list allowed_ips '192.168.30.0/24'
        option endpoint_host 'IP_АДРЕС_VPS'

#VPN второго уровня - клиент
config interface 'wg1'
        option proto 'wireguard'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_2_МК3'
        list addresses '192.168.31.3/24'
        option auto '1'
        option listen_port '51821'
        option mtu '7500'

config wireguard_wg1
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МС'
        option endpoint_host '192.168.30.2'
        option endpoint_port '51821'
        option persistent_keepalive '25'
        list allowed_ips '192.168.31.0/24'

در تنظیمات توصیف شده برای VPN سطح دوم، من پورت 51821 را برای مشتریان WireGuard مشخص می کنم. از نظر تئوری، این امر ضروری نیست، زیرا مشتری از هر پورت غیرمجاز رایگان اتصال برقرار می کند، اما من آن را طوری ساختم که تمام اتصالات ورودی را می توان در واسط های wg0 همه روترها رد کرد، به جز اتصالات UDP ورودی در پورت 51821.

امیدوارم که مقاله برای کسی مفید باشد.

PS همچنین، من می‌خواهم اسکریپت خود را که در برنامه WirePusher هنگامی که دستگاه جدیدی در شبکه من ظاهر می‌شود، یک اعلان PUSH به تلفن من ارسال می‌کند، به اشتراک بگذارم. اینم لینکی به اسکریپت: github.com/r0ck3r/device_discover.

تکمیلی: پیکربندی سرور OpenVPN و مشتریان

سرور OpenVPN

client-to-client

ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/vpn-server.crt
dh /etc/openvpn/server/dh.pem
key /etc/openvpn/server/vpn-server.key

dev tap
ifconfig-pool-persist /etc/openvpn/ipp.txt 0
keepalive 10 60
proto tcp4
server-bridge 192.168.10.1 255.255.255.0 192.168.10.80 192.168.10.254
status /var/log/openvpn-status.log
verb 3
comp-lzo

کلاینت OpenVPN

client
tls-client
dev tap
proto tcp
remote VPS_IP 1194 # Change to your router's External IP
resolv-retry infinite
nobind

ca client/ca.crt
cert client/client.crt
key client/client.key
dh client/dh.pem

comp-lzo
persist-tun
persist-key
verb 3

من از easy-rsa برای تولید گواهی استفاده کردم.

منبع: www.habr.com

اضافه کردن نظر