Transisi saka OpenVPN ing WireGuard kanggo nggabungake jaringan dadi siji jaringan L2

Transisi saka OpenVPN ing WireGuard kanggo nggabungake jaringan dadi siji jaringan L2

Aku pengin nuduhake pengalaman nggabungake jaringan ing telung apartemen sing adoh saka geografis, sing saben nggunakake router OpenWRT minangka gateway, dadi siji jaringan umum. Nalika milih cara kanggo gabungke jaringan antarane L3 karo subnet routing lan L2 karo bridging, nalika kabeh simpul jaringan bakal ing subnet padha, preferensi diwenehi kanggo cara liya, kang luwih angel kanggo ngatur, nanging menehi kesempatan luwih, wiwit nggunakake teknologi transparan wis direncanakake ing jaringan sing digawe Wake-on-Lan lan DLNA.

Bagean 1: Latar mburi

Protokol sing dipilih kanggo ngleksanakake tugas iki wiwitane OpenVPN, amarga, sing pertama, bisa nggawe piranti kran sing bisa ditambahake ing jembatan tanpa masalah, lan sing nomer loro, OpenVPN Iki ndhukung TCP, sing uga penting, amarga ora ana apartemen sing duwe alamat IP khusus. Aku ora bisa nggunakake STUN amarga ISP-ku, amarga sawetara alesan, mblokir sambungan UDP mlebu saka jaringan. TCP ngidini aku nerusake port server VPN menyang VPS sing disewa nggunakake SSH. Sanajan pendekatan iki nggawe overhead sing signifikan, amarga data dienkripsi kaping pindho, aku ora pengin nggabungake VPS menyang jaringan pribadiku, amarga ana risiko pihak katelu sing bisa ngontrol. Mulane, duwe piranti kaya ngono ing jaringan omahku ora dikarepake banget, mula aku mutusake kanggo mbayar overhead sing signifikan kanggo keamanan.

Kanggo nerusake port ing router sing direncanakake bakal dipasang server, aku nggunakake program sshtunnel. Aku ora bakal nerangake rincian konfigurasine—gampang banget. Aku mung bakal nyathet yen tujuane yaiku nerusake port TCP 1194 saka router menyang VPS. Sabanjure, aku ngonfigurasi server. OpenVPN Ing piranti tap0, sing disambungake menyang jembatan br-lan. Sawise nguji sambungan menyang server sing nembe digawe saka laptopku, dadi jelas yen ide port forwarding wis bisa digunakake, lan laptopku wis dadi anggota jaringan router, sanajan sacara fisik dudu bagean saka jaringan kasebut.

Siji-sijine sing isih kudu ditindakake yaiku mbagekke alamat IP ing apartemen sing beda-beda supaya ora konflik lan ngonfigurasi router kaya ngono. OpenVPN-klien.
Alamat IP router lan kisaran server DHCP ing ngisor iki dipilih:

  • 192.168.10.1 karo sawetara 192.168.10.2 - 192.168.10.80 kanggo server
  • 192.168.10.100 karo sawetara 192.168.10.101 - 192.168.10.149 kanggo router ing apartemen No.. 2
  • 192.168.10.150 karo sawetara 192.168.10.151 - 192.168.10.199 kanggo router ing apartemen No.. 3

Uga perlu kanggo menehi alamat kasebut menyang router klien. OpenVPN-server, kanthi nambahake baris ing ngisor iki menyang konfigurasi:

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

lan nambahake baris ing ngisor iki menyang file /etc/openvpn/ipp.txt:

flat1_id 192.168.10.100
flat2_id 192.168.10.150

ing ngendi flat1_id lan flat2_id minangka jeneng piranti sing ditemtokake nalika nggawe sertifikat kanggo nyambung menyang OpenVPN

Sabanjure, router-router kasebut dikonfigurasi OpenVPN- klien, piranti tap0 ing loro-lorone ditambahake menyang jembatan br-lan. Ing wektu iki, kabeh katon apik, amarga kabeh telung jaringan bisa ndeleng siji liyane lan bisa berfungsi minangka unit tunggal. Nanging, ana detail sing rada ora nyenengake: kadhangkala piranti bakal nampa alamat IP saka router sing salah, kanthi kabeh akibat sing bakal kedadeyan. Amarga sawetara alesan, router ing salah sawijining apartemen gagal nanggapi DHCPDISCOVER kanthi tepat wektu, lan piranti kasebut nampa alamat sing salah. Aku ngerti yen aku kudu nyaring panjaluk kasebut ing tap0 ing saben router, nanging jebul, iptables ora bisa digunakake karo piranti yen minangka bagean saka jembatan, mula aku kudu nggunakake ebtables. Sayange, firmwareku ora kalebu, mula aku kudu mbangun maneh gambar kanggo saben piranti. Sawise nindakake iki lan nambahake baris ing ngisor iki menyang /etc/rc.local ing saben router, masalah kasebut wis dirampungake:

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

Konfigurasi iki suwene telung taun.

Bagean 2: Ngerteni WireGuard

Akhir-akhir iki, ana akeh omongan ing internet babagan WireGuard, nggumunake gampange konfigurasi, kecepatan transfer sing dhuwur, ping sing endhek, lan keamanan sing bisa dibandhingake. Panelusuran kanggo informasi tambahan babagan iki nuduhake yen ora ndhukung dhukungan anggota jembatan utawa protokol TCP, sing ndadekake aku percaya yen ora ana alternatif liyane. OpenVPN kanggo aku iku isih durung ana. Dadi aku nundha kanggo kenal karo WireGuard.

Sawetara dina kepungkur, pawarta nyebar liwat sumber daya sing ana gandhengane karo IT kanthi cara siji utawa liyane sing WireGuard pungkasane bakal dilebokake ing kernel Linux, diwiwiti karo versi 5.6. Artikel pawarta, kaya biasane, dipuji WireGuardAku sepisan maneh nggoleki cara kanggo ngganti sing lawas sing apik OpenVPNWektu iki aku ketemu artikel iki. Dheweke ngomong babagan nggawe trowongan Ethernet liwat L3 nggunakake GRE. Artikel iki menehi pangarep-arep. Ora jelas apa sing kudu ditindakake karo protokol UDP. Panelusuran kasebut nuntun aku menyang artikel babagan nggunakake socat bebarengan karo trowongan SSH kanggo nerusake port UDP, nanging dheweke nyathet yen pendekatan iki mung bisa digunakake ing mode sambungan tunggal, yaiku, karya sawetara klien VPN ora mungkin. Aku duwe ide kanggo nginstal server VPN ing VPS lan nyetel GRE kanggo klien, nanging ternyata GRE ora ndhukung enkripsi, sing bakal nyebabake kasunyatan manawa pihak katelu entuk akses menyang server. , kabeh lalu lintas ing antarane jaringanku bakal ana ing tangane, sing ora cocog karo aku.

Sawise maneh, keputusan kasebut digawe kanggo enkripsi berlebihan, kanthi nggunakake VPN liwat VPN nggunakake skema ing ngisor iki:

VPN level XNUMX:
VPS Iku server karo alamat internal 192.168.30.1
MS Iku klien VPS karo alamat internal 192.168.30.2
MK2 Iku klien VPS karo alamat internal 192.168.30.3
MK3 Iku klien VPS karo alamat internal 192.168.30.4

VPN tingkat kapindho:
MS Iku server kanthi alamat eksternal 192.168.30.2 lan internal 192.168.31.1
MK2 Iku klien MS kanthi alamat 192.168.30.2 lan nduweni IP internal 192.168.31.2
MK3 Iku klien MS kanthi alamat 192.168.30.2 lan nduweni IP internal 192.168.31.3

* MS - router-server ing apartemen 1, MK2 - router ing apartemen 2, MK3 - router ing apartemen 3
* Konfigurasi piranti diterbitake ing spoiler ing pungkasan artikel.

Dadi, ping mlaku antarane jaringan simpul 192.168.31.0/24, iku wektu kanggo nerusake kanggo nyetel trowongan GRE. Sadurunge iki, supaya ora kelangan akses menyang router, sampeyan kudu nyetel terowongan SSH kanggo nerusake port 22 menyang VPS, supaya, contone, router saka apartemen 10022 bakal bisa diakses ing port 2 VPS, lan router saka apartemen 11122 bakal diakses ing port 3 router saka apartemen XNUMX. Iku paling apik kanggo ngatur nerusake nggunakake sshtunnel padha, awit iku bakal mulihake trowongan yen gagal.

Trowongan wis dikonfigurasi, sampeyan bisa nyambung menyang SSH liwat port sing diterusake:

ssh root@МОЙ_VPS -p 10022

Sabanjure sampeyan kudu mateni OpenVPN:

/etc/init.d/openvpn stop

Saiki ayo nyiyapake trowongan GRE ing router saka apartemen 2:

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

Lan tambahake antarmuka sing digawe menyang jembatan:

brctl addif br-lan grelan0

Ayo nindakake prosedur sing padha ing router server:

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

Lan uga nambah antarmuka sing digawe menyang jembatan:

brctl addif br-lan grelan0

wiwit wektu iki, pings wiwit kasil pindhah menyang jaringan anyar lan aku, kanthi marem, pindhah kanggo ngombe kopi. Banjur, kanggo ngevaluasi carane jaringan bisa digunakake ing ujung liyane, aku nyoba SSH menyang salah sawijining komputer ing apartemen 2, nanging klien ssh beku tanpa njaluk sandhi. Aku nyoba nyambung menyang komputer iki liwat telnet ing port 22 lan aku weruh baris saka ngendi aku bisa ngerti yen sambungan lagi diadegaké, server SSH nanggapi, nanging sakperangan alesan iku mung ora njaluk kula kanggo log. ing.

$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1

Aku nyoba kanggo nyambung menyang liwat VNC lan ndeleng layar ireng. Aku gawe uwong yakin dhewe sing masalah karo komputer remot, amarga aku bisa gampang nyambung menyang router saka apartemen iki nggunakake alamat internal. Nanging, aku mutusake kanggo nyambung menyang SSH komputer iki liwat router lan kaget yen sambungan kasebut sukses, lan komputer remot bisa digunakake kanthi normal, nanging uga ora bisa nyambung menyang komputer.

Aku njupuk piranti grelan0 saka jembatan lan mbukak OpenVPN Ing router ing apartemen 2, aku ngonfirmasi manawa jaringan wis bisa digunakake kanthi bener maneh lan sambungane ora mudhun. Nalika nggoleki, aku nemokake forum ing ngendi wong-wong sambat babagan masalah sing padha, lan ing ngendi dheweke disaranake kanggo ngunggahake MTU. Ora let suwe, aku wis rampung. Nanging, nganti MTU disetel cukup dhuwur—7000 kanggo piranti gretap—aku ngalami sambungan TCP sing mudhun utawa kecepatan transfer sing kurang. Amarga MTU sing dhuwur kanggo gretap, MTU kanggo sambungan WireGuard Level kapisan lan kapindho disetel ing 8000 lan 7500.

Aku digawa metu persiyapan padha ing dalan saka apartemen 3, karo mung prabédan sing antarmuka gretap kapindho jenenge grelan1 iki ditambahake menyang router server, kang uga ditambahake ing jembatan br-lan.

Kabeh mlaku. Saiki sampeyan bisa nyelehake rakitan gretap menyang wiwitan. Kanggo iki:

Aku sijine baris iki ing /etc/rc.local ing router ing apartemen 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

Iki ditambahake menyang /etc/rc.local ing router ing apartemen 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

Lan ing router server:

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

Sawisé nguripaké manèh router klien, aku nemokaké yèn merga sawetara alesan, router-router mau ora nyambung menyang server. Sawisé nyambung menyang SSH-ne (untungé, aku wis ngonfigurasi sshtunnel sadurungé kanggo iki), aku nemokaké yèn WireGuard Amarga sawetara alesan, iki nggawe rute kanggo titik pungkasan, nanging salah. Contone, kanggo 192.168.30.2, tabel rute nemtokake rute liwat antarmuka pppoe-wan, yaiku, liwat internet, sanajan rute menyang rute kasebut kudune diarahake liwat antarmuka wg0. Sawise mbusak rute iki, sambungan kasebut dipulihake. Apa aku bisa nemokake pandhuan ing endi wae babagan carane meksa WireGuard Aku ora bisa ngindhari nggawe rute-rute iki. Kajaba iku, aku malah ora ngerti apa iki fitur saka OpenWRT utawa saka WireGuardTanpa ngentekake wektu akeh kanggo ngerteni masalah kasebut, aku mung nambahake baris menyang skrip berbasis timer ing loro router sing mbusak rute iki:

route del 192.168.30.2

Nyimpul

Penolakan lengkap OpenVPN Aku durung nglakoni iki, amarga sok-sok aku kudu nyambung menyang jaringan anyar saka laptop utawa telpon, lan nyetel piranti gretap ing piranti kasebut umume ora mungkin. Nanging, sanajan mangkono, aku wis entuk kauntungan ing kecepatan transfer data antarane apartemen, lan nggunakake VNC, contone, saiki ora repot. Ping wis rada mudhun nanging dadi luwih stabil:

Nalika nggunakake 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

Nalika nggunakake 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

Luwih kena pengaruh ping dhuwur menyang VPS, yaiku kira-kira 61.5 ms

Nanging, kecepatane wis tambah akeh banget. Dadi, ing apartemen sing nganggo router-server, aku duwe kecepatan sambungan internet 30 Mbps, lan ing apartemen liyane 5 Mbps. Kajaba iku, nalika digunakake OpenVPN Aku ora bisa entuk kecepatan transfer data antarane jaringan sing luwih saka 3,8 Mbps miturut bacaan iperf, dene WireGuard "ngompa" nganti 5 Mbit/detik sing padha.

Konfigurasi WireGuard ing VPS[Interface]
Address = 192.168.30.1/24
ListenPort = 51820
PrivateKey = <ЗАКРЫТЫЙ_КЛЮЧ_ДЛЯ_VPS>

[Peer]
Kunci Publik = <VPN_1_MS_PUBLIC_KEY>
AllowedIPs = 192.168.30.2/32

[Peer]
Kunci Publik = <VPN_2_MK2_KEY_PUBLIC>
AllowedIPs = 192.168.30.3/32

[Peer]
Kunci Publik = <VPN_2_MK3_KEY_PUBLIC>
AllowedIPs = 192.168.30.4/32

Konfigurasi WireGuard ing MS (ditambahake menyang /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'

Konfigurasi WireGuard ing MK2 (ditambahake menyang /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'

Konfigurasi WireGuard ing MK3 (ditambahake menyang /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'

Ing konfigurasi sing diterangake kanggo VPN tingkat loro, aku nuduhake marang klien WireGuard Port 51821. Iki ora perlu, amarga klien bakal nggawe sambungan saka port gratis lan ora duwe hak istimewa, nanging aku nindakake kanthi cara iki supaya aku bisa nolak kabeh sambungan mlebu ing antarmuka wg0 saka kabeh router, kajaba sambungan UDP mlebu menyang port 51821.

Mugi sing artikel bakal migunani kanggo wong.

PS Uga, aku pengin nuduhake naskahku sing ngirim kabar PUSH menyang telponku ing aplikasi WirePusher nalika piranti anyar katon ing jaringanku. Iki link menyang skrip: github.com/r0ck3r/device_discover.

UPDATE: Konfigurasi OpenVPN-server lan klien

OpenVPN-server

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-klien

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

Aku digunakake gampang-rsa kanggo generate sertifikat

Source: www.habr.com

Tuku hosting sing dipercaya kanggo situs kanthi proteksi DDoS, server VPS VDS 🔥 Tuku hosting situs web sing bisa dipercaya nganggo proteksi DDoS, server VPS VDS | ProHoster