
Мен ар бири OpenWRT роутерлерин шлюз катары колдонгон үч географиялык алыскы батирдеги тармактарды бир жалпы тармакка бириктирүү боюнча тажрыйбам менен бөлүшкүм келет. Бардык тармак түйүндөрү бир субсетте турганда, L3 менен ички тармактын маршрутизациясы менен L2 ортосундагы тармактарды бириктирүү ыкмасын тандоодо, конфигурациялоо кыйыныраак, бирок көбүрөөк мүмкүнчүлүктөрдү берген экинчи ыкмага артыкчылык берилген. Wake-on-Lan жана DLNA түзүлүп жаткан тармакта технологияларды ачык колдонуу пландаштырылган.
1-бөлүк: Фон
Бул тапшырманы аткаруу үчүн башында тандалган протокол OpenVPN, анткени, биринчиден, ал көпүрөгө эч кандай көйгөйсүз кошула турган кран түзмөгүн түзө алат, экинчиден, OpenVPN Ал TCPти колдойт, бул дагы маанилүү болчу, анткени бир дагы батирде өзүнчө IP дарек жок болчу. Мен STUNду колдоно алган жокмун, анткени кандайдыр бир себептерден улам менин интернет провайдерим өз тармактарынан кирүүчү UDP туташууларын бөгөттөп коёт. TCP мага VPN сервер портун SSH аркылуу ижарага алынган VPSке жөнөтүүгө мүмкүндүк берди. Бул ыкма маалыматтар эки жолу шифрленгендиктен, олуттуу чыгымдарды жаратса да, мен 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.
Бир нече күн мурун IT тармагына байланыштуу ресурстар аркылуу жаңылыктар тигил же бул жол менен тараган WireGuard акыры ядрого киргизилет Linux, 5.6 версиясынан баштап. Жаңылыктар макалалары, ар дайымкыдай эле, мактоого арзыды 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 түзмөгүн көпүрөдөн алып чыгып, иштетем OpenVPN 2-батирдеги роутерде тармак кайрадан туура иштеп жатканын жана байланыштар үзүлбөгөнүн ырастадым. Издеп жатып, адамдар ошол эле көйгөйлөргө нааразы болуп, MTUну көтөрүү сунушталган форумдарды таптым. Айтылгандан көп өтпөй эле бүттү. Бирок, MTU жетиштүү деңгээлде жогору коюлганга чейин — gretap түзмөктөрү үчүн 7000 — TCP байланыштары үзүлүп же өткөрүү ылдамдыгы төмөн болуп жатты. Gretap үчүн MTU жогору болгондуктан, байланыштар үчүн MTU WireGuard Биринчи жана экинчи деңгээлдер тиешелүүлүгүнө жараша 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 колдонуу азыр кыйынчылыксыз. Пинг бир аз төмөндөдү, бирок туруктуураак болуп калды:
колдонууда 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>
[Теңдеш]
Ачык ачкыч = <VPN_1_MS_PUBLIC_KEY>
AllowedIPs = 192.168.30.2/32
[Теңдеш]
Ачык ачкыч = <VPN_2_MK2_PUBLIC_KEY>
AllowedIPs = 192.168.30.3/32
[Теңдеш]
Ачык ачкыч = <VPN_2_MK3_PUBLIC_KEY>
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 үчүн сүрөттөлгөн конфигурацияларда мен кардарларга төмөнкүлөрдү көрсөтөм WireGuard 51821-порт. Бул зарыл эмес болушу керек, анткени кардар каалаган эркин, артыкчылыксыз порттон байланыш түзөт, бирок мен муну бардык роутерлердин wg0 интерфейстериндеги бардык кирүүчү туташууларды четке кагуу үчүн жасадым, 51821-портко кирүүчү UDP туташууларынан тышкары.
Мен макала кимдир бирөө үчүн пайдалуу болот деп үмүттөнөм.
PS Ошондой эле, тармагымда жаңы түзмөк пайда болгондо, WirePusher тиркемесинде телефонума PUSH эскертмесин жөнөткөн скриптимди бөлүшкүм келет. Бул жерде сценарийге шилтеме: .
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-lzoOpenVPN-кардар
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
