Тармактарды бир L2 тармагына бириктирүү үчүн OpenVPNден WireGuardга которулуу

Тармактарды бир L2 тармагына бириктирүү үчүн OpenVPNден WireGuardга которулуу

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

1-бөлүк: Фон

OpenVPN алгач бул тапшырманы ишке ашыруу үчүн протокол катары тандалган, анткени, биринчиден, ал көпүрөгө көйгөйсүз кошула турган таптап түзө алат, экинчиден, OpenVPN TCP протоколу аркылуу иштөөнү колдойт, бул да маанилүү болгон, анткени эч ким жок. батирлердин биринин атайын IP дареги бар болчу жана мен STUN колдоно албай калдым, анткени менин провайдерим кандайдыр бир себептерден улам алардын тармактарынан кирүүчү UDP байланыштарын бөгөттөйт, ал эми TCP протоколу VPN серверинин портун SSH аркылуу ижарага алынган VPSке жөнөтүүгө мүмкүндүк берди. Ооба, бул ыкма чоң жүктү берет, анткени маалыматтар эки жолу шифрленген, бирок мен VPSти жеке тармагыма киргизгим келген жок, анткени үчүнчү тараптар аны көзөмөлдөп калуу коркунучу дагы эле бар болчу, ошондуктан, мындай түзүлүшкө ээ болуу Менин үй тармагымда өтө жагымсыз болгон жана коопсуздук үчүн чоң чыгымдар менен төлөө чечими кабыл алынган.

Серверди жайгаштыруу пландаштырылган роутерге портту жөнөтүү үчүн sshtunnel программасы колдонулган. Мен анын конфигурациясынын татаалдыктарын сүрөттөбөй эле коёюн - бул оңой эле жасалды, анын милдети роутерден VPSке 1194 TCP портун жөнөтүү экенин белгилей кетейин. Андан кийин, 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 ядросуна кошула тургандыгы тууралуу IT менен байланышкан ресурстарга тигил же бул жол менен тараган. Жаңылыктар макалалары, адаттагыдай эле, WireGuardды мактады. Мен дагы бир жолу жакшы эски OpenVPN алмаштыруу жолдорун издөөгө кириштим. Бул жолу чуркадым бул макалада. Анда GRE аркылуу L3 аркылуу Ethernet туннелин түзүү жөнүндө сөз болгон. Бул макала мага үмүт берди. UDP протоколу менен эмне кылуу керектиги белгисиз бойдон калды. Издөө мени UDP портун багыттоо үчүн SSH туннели менен бирге socat колдонуу жөнүндө макалаларга алып келди, бирок алар бул ыкма бир туташуу режиминде гана иштей тургандыгын, башкача айтканда, бир нече VPN кардарларынын иши мүмкүн эмес экенин белгилешти. Мен VPSге VPN серверин орнотуу жана кардарлар үчүн GRE орнотуу идеясын ойлоп чыктым, бирок GRE шифрлөөнү колдобойт, бул үчүнчү жактар ​​серверге кирүү мүмкүнчүлүгүнө алып келет. , менин тармактарымдын ортосундагы бардык трафик алардын колунда болот, бул мага такыр туура келген жок.

Дагы бир жолу, чечим төмөнкү схеманы колдонуп VPN аркылуу VPN аркылуу ашыкча шифрлөөнүн пайдасына кабыл алынды:

XNUMX-деңгээл VPN:
VPS Ал сервер ички дареги менен 192.168.30.1
MC Ал кардар VPS ички дареги 192.168.30.2
MK2 Ал кардар VPS ички дареги 192.168.30.3
MK3 Ал кардар VPS ички дареги 192.168.30.4

Экинчи деңгээл VPN:
MC Ал сервер тышкы дареги 192.168.30.2 жана ички 192.168.31.1 менен
MK2 Ал кардар MC дареги 192.168.30.2 жана ички IP 192.168.31.2 бар
MK3 Ал кардар MC дареги 192.168.30.2 жана ички IP 192.168.31.3 бар

* MC — 1-батирдеги роутер-сервер, MK2 - 2-батирдеги роутер, MK3 - 3-батирдеги роутер
* Түзмөктүн конфигурациялары макаланын аягындагы спойлерде жарыяланган.

Ошентип, пингдер 192.168.31.0/24 тармак түйүндөрүнүн ортосунда иштеп жатат, GRE туннелин орнотууга өтүүгө убакыт келди. Буга чейин, роутерлерге кирүү мүмкүнчүлүгүн жоготпоо үчүн, мисалы, 22-квартирадагы роутер VPSтин 10022 портунда жеткиликтүү болушу үчүн, 2-портту VPSке багыттоо үчүн SSH туннелдерин орнотуу керек. 11122-батирдин роутери 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 жогору болгондуктан, Layer 8000 жана Layer 7500 WireGuard туташуулары үчүн MTUs тиешелүүлүгүнө жараша XNUMX жана XNUMX болуп орнотулган.

Мен 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 колдондум

Source: www.habr.com

Комментарий кошуу