Желілерді бір L2 желісіне біріктіру үшін OpenVPN-ден WireGuard-қа көшіру

Желілерді бір L2 желісіне біріктіру үшін OpenVPN-ден WireGuard-қа көшіру

Мен үш географиялық алыс пәтерлердегі желілерді біріктіру тәжірибеммен бөліскім келеді, олардың әрқайсысы OpenWRT бар маршрутизаторларды шлюз ретінде бір ортақ желіге пайдаланады. Барлық желі түйіндері бір ішкі желіде болатын L3-ті ішкі желіні бағыттаумен және L2-ні көпірмен біріктіру әдісін таңдағанда, конфигурациялау қиынырақ, бірақ мөлдір болғандықтан, көбірек мүмкіндіктер беретін екінші әдіске артықшылық берілді. құрылған Wake-on-Lan және DLNA желісінде технологияларды пайдалану жоспарланған.

1-бөлім: Фон

Бастапқыда бұл тапсырманы орындау үшін протокол ретінде OpenVPN таңдалды, өйткені, біріншіден, ол көпірге еш қиындықсыз қосуға болатын кран құрылғысын жасай алады, екіншіден, OpenVPN TCP протоколы арқылы жұмыс істеуді қолдайды, бұл да маңызды болды, өйткені пәтерлердің ешқайсысында арнайы IP мекенжайы болмады, мен STUN қызметін пайдалана алмадым, себебі менің Интернет провайдерім қандай да бір себептермен олардың желілерінен кіріс UDP қосылымдарын блоктайды, ал TCP протоколы VPN серверінің портын жалға алынған VPS арқылы SSH арқылы жіберуге мүмкіндік берді. Иә, бұл тәсіл үлкен жүктеме береді, өйткені деректер екі рет шифрланған, бірақ мен VPS-ті жеке желіге енгізгім келмеді, өйткені үшінші тұлғалардың оны бақылауға алу қаупі әлі де болды, сондықтан мұндай үй желісіндегі құрылғы өте жағымсыз болды және қауіпсіздік үшін үлкен шығындармен төлеуге шешім қабылданды.

Серверді орналастыру жоспарланған маршрутизатордағы портты қайта жіберу үшін sshtunnel бағдарламасы пайдаланылды. Мен оның конфигурациясының қыр-сырын сипаттамаймын - бұл өте оңай жасалады, оның міндеті 1194 TCP портын маршрутизатордан VPS-ке жіберу екенін ескертемін. Содан кейін OpenVPN сервері br-lan көпіріне қосылған tap0 құрылғысында конфигурацияланды. Ноутбуктан жаңадан жасалған серверге қосылымды тексергеннен кейін, портты қайта жіберу идеясы өзін ақтағаны және менің ноутбугымның физикалық түрде болмаса да, маршрутизатор желісіне мүше болғаны белгілі болды.

Мәселе кішкентай болып қалды: 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 нұсқасынан бастап Linux ядросына қосылатыны туралы ақпарат АТ-ға қатысты ресурстар арқылы тарады. Жаңалықтар мақалалары, әдеттегідей, WireGuard-ты мақтады. Мен қайтадан жақсы ескі OpenVPN ауыстыру жолдарын іздеуге кірістім. Бұл жолы мен жүгірдім Бұл мақала. Онда GRE көмегімен L3 арқылы Ethernet туннелін құру туралы айтылды. Бұл мақала маған үміт берді. UDP протоколымен не істеу керектігі белгісіз болып қалды. Іздеу мені UDP портын бағыттау үшін SSH туннелімен бірге socat пайдалану туралы мақалаларға әкелді, бірақ олар бұл тәсіл тек бір қосылым режимінде жұмыс істейтінін атап өтті, бұл бірнеше VPN клиенттері мүмкін болмайтынын білдіреді. Мен VPS-те VPN серверін орнату және клиенттер үшін 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 туннелін орнатуға көшудің уақыты келді. Бұған дейін, маршрутизаторларға қолжетімділікті жоғалтпау үшін, мысалы, 22-пәтердегі маршрутизатор VPS-тің 10022 портында қол жетімді болатындай етіп, 2-портты VPS-ке бағыттау үшін SSH туннельдерін орнату керек. 11122-пәтердегі маршрутизатор VPS 3 портында қол жетімді болады XNUMX-пәтердегі маршрутизатор. Қайта жіберуді дәл сол sshtunnel арқылы конфигурациялаған дұрыс, өйткені ол құлаған жағдайда туннельді қалпына келтіреді.

Туннель конфигурацияланған, сіз SSH-ге жіберілген порт арқылы қосыла аласыз:

ssh root@МОЙ_VPS -p 10022

Содан кейін OpenVPN өшіріңіз:

/etc/init.d/openvpn stop

Енді 2-пәтердегі маршрутизаторда GRE туннелін орнатайық:

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

Осы сәттен бастап пингтер жаңа желіге сәтті кіре бастайды және мен қанағаттанғанмен кофе ішуге барамын. Содан кейін сымның екінші жағындағы желінің қалай жұмыс істейтінін көру үшін мен 2-пәтердегі компьютерлердің біріне SSH қосуға тырысамын, бірақ ssh клиенті құпия сөзді сұрамай тұрып қалады. Мен бұл компьютерге 22-порттағы telnet арқылы қосылуға тырысамын және қосылым орнатылып жатқанын, SSH сервері жауап беріп жатқанын түсінуге болатын жолды көремін, бірақ қандай да бір себептермен ол маған кіруді ұсынбайды.

$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1

Мен оған VNC арқылы қосылуға тырысамын және қара экранды көремін. Мен бұл мәселе қашықтағы компьютерде екеніне сенімдімін, өйткені мен ішкі мекенжайды пайдаланып осы пәтерден маршрутизаторға оңай қосыла аламын. Дегенмен, мен маршрутизатор арқылы осы компьютерге SSH қосуды шештім және қосылым сәтті және қашықтағы компьютер жақсы жұмыс істейді, бірақ менің компьютеріме де қосыла алмайтынына таң қалдым.

Мен grelan0 құрылғысын көпірден алып, 2-пәтердегі маршрутизаторда OpenVPN іске қосамын және желі қайтадан дұрыс жұмыс істеп тұрғанына және қосылымдар үзілмейтініне көз жеткіземін. Іздеу кезінде мен адамдар бірдей проблемаларға шағымданатын форумдарды кездестіремін, онда оларға MTU көтеруге кеңес беріледі. Айтылды орындалды. Дегенмен, MTU gretap құрылғылары үшін жеткілікті үлкен 7000 мәніне орнатылмайынша, TCP қосылымдарының жоғалуы немесе баяу жіберу байқалды. Gretap үшін жоғары MTU болғандықтан, бірінші және екінші деңгейдегі WireGuard қосылымдары үшін MTU сәйкесінше 8000 және 7500-ге орнатылды.

Мен 3-пәтердегі маршрутизаторда ұқсас орнатуды жасадым, жалғыз айырмашылығы, сервер маршрутизаторына grelan1 деп аталатын екінші gretap интерфейсі қосылды, ол да br-lan көпіріне қосылды.

Барлығы жұмыс істейді. Енді gretap жинағын автожүктемеге қоюға болады. Осыған:

Осы жолдарды 2-пәтердегі маршрутизаторда /etc/rc.local ішіне орналастырды:

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

Мұны 3-пәтердегі маршрутизатордағы /etc/rc.local ішіне қосты:

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 пайдалану енді ыңғайсыз емес. Ping аздап төмендеді, бірақ тұрақтырақ болды:

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 Мбит/с-қа дейін «сорғызды».

VPS жүйесінде WireGuard конфигурациясы[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

MS жүйесіндегі WireGuard конфигурациясы (/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'

MK2 жүйесіндегі WireGuard конфигурациясы (/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'

MK3 жүйесіндегі WireGuard конфигурациясы (/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 үшін сипатталған конфигурацияларда мен WireGuard клиенттеріне 51821 портын көрсетемін.Теорияда бұл қажет емес, өйткені клиент кез келген тегін артықшылықсыз порттан қосылым орнатады, бірақ мен оны барлық кіріс қосылымдары болатындай етіп жасадым. 0 портындағы кіріс UDP қосылымдарын қоспағанда, барлық маршрутизаторлардың wg51821 интерфейстерінде қабылданбауы мүмкін.

Мақала біреуге пайдалы болады деп үміттенемін.

PS Сондай-ақ, желіде жаңа құрылғы пайда болған кезде WirePusher қолданбасында телефоныма PUSH хабарландыруын жіберетін сценарийімді бөліскім келеді. Міне, сценарийге сілтеме: github.com/r0ck3r/device_discover.

UPDATE: 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

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