Перекход с OpenVPN на WireGuard да се мреже споје у једну L2 мрежу

Перекход с OpenVPN на WireGuard да се мреже споје у једну L2 мрежу

Желео бих да поделим своје искуство комбиновања мрежа у три географски удаљена стана, од којих сваки користи рутере са ОпенВРТ као мрежни пролаз, у једну заједничку мрежу. Приликом избора методе за комбиновање мрежа између Л3 са подмрежним рутирањем и Л2 са премошћавањем, када ће сви мрежни чворови бити у истој подмрежи, предност је дата другом методу, који је теже конфигурисати, али пружа веће могућности, јер планирано је транспарентно коришћење технологија у мрежи која се ствара Ваке-он-Лан и ДЛНА.

Део 1: Позадина

Протокол изабран за имплементацију овог задатка је првобитно био OpenVPN, јер, прво, може да направи уређај за славину који се може додати на мост без икаквих проблема, и друго, OpenVPN Подржава TCP, што је такође било важно, јер ниједан од станова није имао наменску IP адресу. Нисам могао да користим STUN јер мој интернет провајдер, из неког разлога, блокира долазне UDP конекције из својих мрежа. TCP ми је омогућио да проследим порт VPN сервера на изнајмљени VPS користећи SSH. Иако овај приступ ствара значајно додатно плаћење, јер су подаци двоструко шифровани, нисам желео да интегришем VPS у своју приватну мрежу, јер је постојао ризик да трећа лица стекну контролу над њим. Стога је било веома непожељно имати такав уређај у мојој кућној мрежи, па сам одлучио да платим значајно додатно плаћење за безбедност.

Да бих проследио порт на рутеру где је планирано да се сервер инсталира, користио сам програм sshtunnel. Нећу улазити у детаље његове конфигурације — прилично је једноставно. Само ћу напоменути да је његова сврха била да проследи TCP порт 1194 са рутера на VPS. Затим сам конфигурисао сервер. OpenVPN На tap0 уређају, који је био повезан на br-lan мост. Након тестирања везе са новокреираним сервером са мог лаптопа, постало је јасно да је идеја о прослеђивању портова функционисала и да је мој лаптоп постао члан мреже рутера, иако физички није био њен део.

Једино што је преостало било је да се расподеле ИП адресе у различитим становима како не би дошло до сукоба и да се рутери конфигуришу као OpenVPN-клијенти.
Изабране су следеће ИП адресе рутера и опсези ДХЦП сервера:

  • 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

и додавањем следећих редова у /етц/опенвпн/ипп.ткт датотеку:

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 коначно ће бити укључен у језгро Linux, почевши од верзије 5.6. Вести су, као и увек, биле похваљене WireGuardПоново сам се упустио у потрагу за начинима да заменим старо добро OpenVPNОвог пута сам наишао на овај чланак. Говорило се о стварању Етхернет тунела преко Л3 користећи ГРЕ. Овај чланак ми је дао наду. Остало је нејасно шта да се ради са УДП протоколом. Претрага ме је довела до чланака о коришћењу соцат-а у комбинацији са ССХ тунелом за прослеђивање УДП порта, међутим, приметили су да овај приступ функционише само у режиму једне везе, односно да би рад неколико ВПН клијената био немогућ. Дошао сам на идеју да инсталирам ВПН сервер на ВПС и подесим ГРЕ за клијенте, али како се испоставило, ГРЕ не подржава шифровање, што ће довести до тога да ако треће стране добију приступ серверу , сав саобраћај између мојих мрежа биће у њиховим рукама, што ми никако није одговарало.

Још једном, одлука је донета у корист сувишне енкрипције, коришћењем ВПН-а преко ВПН-а користећи следећу шему:

ВПН нивоа 1:
ВПС је сервер са интерном адресом 192.168.30.1
МС је клијент ВПС са интерном адресом 192.168.30.2
MK2 је клијент ВПС са интерном адресом 192.168.30.3
MK3 је клијент ВПС са интерном адресом 192.168.30.4

ВПН другог нивоа:
МС је сервер са екстерном адресом 192.168.30.2 и интерном 192.168.31.1
MK2 је клијент МС са адресом 192.168.30.2 и има интерни ИП 192.168.31.2
MK3 је клијент МС са адресом 192.168.30.2 и има интерни ИП 192.168.31.3

* МС — рутер-сервер у стану 1, MK2 - рутер у стану 2, MK3 - рутер у стану 3
* Конфигурације уређаја су објављене у спојлеру на крају чланка.

И тако, пингови се покрећу између мрежних чворова 192.168.31.0/24, време је да пређемо на постављање ГРЕ тунела. Пре тога, да се не би изгубио приступ рутерима, вреди подесити ССХ тунеле за прослеђивање порта 22 ка ВПС-у, тако да ће, на пример, рутер из стана 10022 бити доступан на порту 2 ВПС-а, а рутер из стана 11122 ће бити доступан на порту 3 рутер из стана XNUMX. Најбоље је да конфигуришете прослеђивање користећи исти ссхтуннел, јер ће вратити тунел ако не успе.

Тунел је конфигурисан, можете се повезати на ССХ преко прослеђеног порта:

ssh root@МОЙ_VPS -p 10022

Затим би требало да онемогућите OpenVPN:

/etc/init.d/openvpn stop

Сада да поставимо ГРЕ тунел на рутеру из стана 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

почевши од овог тренутка, пингови почињу успешно да иду на нову мрежу и ја са задовољством одлазим да попијем кафу. Затим, да бих проценио како мрежа ради на другом крају линије, покушавам да уђем ССХ у један од рачунара у стану 2, али ссх клијент се замрзава без тражења лозинке. Покушавам да се повежем са овим рачунаром преко телнета на порту 22 и видим линију из које могу да разумем да се веза успоставља, ССХ сервер одговара, али из неког разлога једноставно не тражи од мене да се пријавим ин.

$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1

Покушавам да се повежем на њега преко ВНЦ-а и видим црни екран. Убеђујем себе да је проблем у удаљеном рачунару, јер се из овог стана лако могу повезати на рутер користећи интерну адресу. Међутим, одлучујем да се повежем на ССХ овог рачунара преко рутера и са изненађењем откривам да је веза успешна, а удаљени рачунар ради сасвим нормално, али такође не може да се повеже са мојим рачунаром.

Извадим grelan0 уређај из моста и покренем га OpenVPN На рутеру у стану 2, потврдио сам да мрежа поново исправно ради и да везе не прекидају. Претражујући, наишао сам на форуме где су се људи жалили на исте проблеме и где им је саветовано да повећају MTU. Речено, то урађено. Међутим, док MTU није био подешен довољно високо - 7000 за gretap уређаје - доживљавао сам или прекиде TCP веза или ниске брзине преноса. Због високог MTU-а за gretap, MTU за везе... WireGuard Први и други ниво су постављени на 8000 и 7500 респективно.

Извео сам слично подешавање на рутеру из стана 3, са једином разликом што је други гретап интерфејс по имену грелан1 додат на рутер сервера, који је такође додат на бр-лан мост.

Све ради. Сада можете да ставите гретап склоп у покретање. За ово:

Поставио сам ове линије у /етц/рц.лоцал на рутеру у стану 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

Ово је додато у /етц/рц.лоцал на рутеру у стану 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

На њега више утиче висок пинг до ВПС-а, који износи приближно 61.5 мс

Међутим, брзина се значајно повећала. Тако, у стану са рутер-сервером, имам брзину интернет конекције од 30 Mbps, а у осталим становима је 5 Mbps. Штавише, током коришћења OpenVPN Нисам успео да постигнем брзину преноса података између мрежа већу од 3,8 Mbps према очитањима iperf-а, док WireGuard „напумпао“ га је на истих 5 Mbit/sec.

Конфигурација WireGuard на VPS-у[Interface]
Address = 192.168.30.1/24
ListenPort = 51820
PrivateKey = <ЗАКРЫТЫЙ_КЛЮЧ_ДЛЯ_VPS>

[Вршњак]
ЈавниКључ = <VPN_1_MS_ЈАВНИ_КЉУЧ>
Дозвољени ИП-ови = 192.168.30.2/32

[Вршњак]
ЈавниКључ = <VPN_2_MK2_ЈАВНИ_КЉУЧ>
Дозвољени ИП-ови = 192.168.30.3/32

[Вршњак]
ЈавниКључ = <VPN_2_MK3_ЈАВНИ_КЉУЧ>
Дозвољени ИП-ови = 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 другог нивоа, клијентима указујем WireGuard Порт 51821. Ово не би требало да буде неопходно, јер ће клијент успоставити везу са било ког слободног, непривилегованог порта, али сам то урадио на овај начин како бих могао да одбијем све долазне везе на wg0 интерфејсима свих рутера, осим долазних UDP веза ка порту 51821.

Надам се да ће чланак некоме бити од користи.

ПС Такође, желим да поделим своју скрипту која ми шаље ПУСХ обавештење на мој телефон у апликацији ВиреПусхер када се нови уређај појави на мојој мрежи. Ево везе до скрипте: гитхуб.цом/р0цк3р/девице_дисцовер.

Ажурирање: Конфигурација 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

Користио сам еаси-рса за генерисање сертификата

Извор: ввв.хабр.цом

Купите поуздан хостинг за сајтове са ДДоС заштитом, ВПС ВДС сервере 🔥 Купите поуздан веб хостинг са DDoS заштитом, VPS VDS сервере | ProHoster