Ngalih saka OpenVPN menyang WireGuard kanggo nggabungake jaringan dadi siji jaringan L2

Ngalih saka OpenVPN menyang 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

OpenVPN wiwitane dipilih minangka protokol kanggo ngleksanakake tugas iki, amarga, pisanan, bisa nggawe piranti tunyuk sing bisa ditambahake menyang jembatan tanpa masalah, lan kaping pindho, OpenVPN ndhukung operasi liwat protokol TCP, sing uga penting, amarga ora ana. saka apartemen wis alamat IP darmabakti, lan aku ora bisa nggunakake STUN, wiwit panyedhiya sandi kanggo sawetara alesan pamblokiran sambungan UDP mlebu saka jaringan, nalika protokol TCP ngidini kula kanggo nerusake port server VPN kanggo nyewa VPS nggunakake SSH. Ya, pendekatan iki menehi beban gedhe, amarga data kasebut dienkripsi kaping pindho, nanging aku ora pengin ngenalake VPS menyang jaringan pribadiku, amarga isih ana risiko pihak katelu entuk kontrol, mula duwe piranti kasebut. ing jaringan asal iki arang banget undesirable lan iki mutusaké mbayar kanggo keamanan karo nduwur sirah gedhe.

Kanggo nerusake port ing router sing direncanakake kanggo nyebarake server, program sshtunnel digunakake. Aku ora bakal njlèntrèhaké seluk-beluk konfigurasi - iku wis rampung cukup gampang, aku mung bakal Wigati sing tugas kanggo nerusake TCP port 1194 saka router kanggo VPS. Sabanjure, server OpenVPN dikonfigurasi ing piranti tap0, sing disambungake menyang jembatan br-lan. Sawise mriksa sambungan menyang server sing mentas digawe saka laptop, dadi jelas manawa ide port forwarding dibenerake lan laptopku dadi anggota jaringan router, sanajan ora ana ing njero.

Mung ana siji bab cilik sing kudu ditindakake: perlu kanggo nyebarake alamat IP ing apartemen sing beda-beda supaya ora konflik lan ngatur router minangka klien OpenVPN.
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

Sampeyan uga perlu kanggo nemtokake alamat kasebut menyang router klien server OpenVPN kanthi nambahake baris kasebut 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, klien OpenVPN dikonfigurasi ing router, tap0 piranti ing loro ditambahake menyang jembatan br-lan. Ing tataran iki, kabeh katon apik amarga kabeh telung jaringan bisa ndeleng siji liyane lan bisa dadi siji. Nanging, rincian sing ora nyenengake muncul: kadhangkala piranti bisa nampa alamat IP dudu saka dalane, kanthi kabeh akibate. Kanggo sawetara alasan, router ing salah sawijining apartemen ora duwe wektu kanggo nanggapi DHCPDISCOVER ing wektu lan piranti kasebut nampa alamat sing ora dimaksudake. Aku temen maujud sing aku kudu nyaring panjalukan kuwi ing tap0 ing saben router, nanging ternyata, iptables ora bisa digunakake karo piranti yen iku bagéan saka jembatan lan ebtables kudu teka kanggo bantuan. Kanggo penyesalan, ora ana ing perangkat kukuh lan aku kudu mbangun maneh gambar kanggo saben piranti. Kanthi nindakake iki lan nambahake baris kasebut menyang /etc/rc.local saben router, masalah kasebut ditanggulangi:

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.

Part 2: Ngenalke WireGuard

Bubar, wong-wong ing Internet wis wiwit ngomong babagan WireGuard, ngujo kesederhanaan konfigurasi, kacepetan transmisi dhuwur, ping kurang kanthi keamanan sing padha. Nggoleki informasi luwih lengkap babagan iki nerangake manawa ora bisa digunakake minangka anggota jembatan utawa ora nggarap protokol TCP sing didhukung, sing nggawe aku mikir yen isih ora ana alternatif kanggo OpenVPN kanggo aku. Dadi aku ora ngerti WireGuard.

Sawetara dina kepungkur, warta nyebar ing sumber daya siji utawa liyane sing ana gandhengane karo IT sing WireGuard pungkasane bakal kalebu ing kernel Linux, diwiwiti karo versi 5.6. Artikel warta, kaya biasane, muji WireGuard. Aku maneh golek cara kanggo ngganti OpenVPN lawas sing apik. Wektu iki aku mlayu menyang 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 mbusak piranti grelan0 saka jembatan lan mbukak OpenVPN ing router ing apartemen 2 lan priksa manawa jaringan bisa digunakake kaya samesthine lan sambungan ora dropped. Kanthi nggoleki aku nemokake forum ing ngendi wong-wong sambat babagan masalah sing padha, ing ngendi dheweke menehi saran kanggo ngunggahake MTU. Ora let suwe diomongke. Nanging, nganti MTU disetel cukup dhuwur - 7000 kanggo piranti gretap, sambungan TCP mudhun utawa tarif transfer sing kurang diamati. Amarga MTU dhuwur kanggo gretap, MTU kanggo Layer 8000 lan Layer 7500 WireGuard sambungan disetel kanggo XNUMX lan XNUMX mungguh.

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

Sawise reboot router klien, aku nemokake manawa ana alesan ora nyambung menyang server. Duwe disambungake menyang SSH sing (begjanipun, Aku sadurunge wis diatur sshtunnel iki), ditemokaké sing WireGuard sakperangan alesan nggawe rute kanggo endpoint, nanging iku salah. Dadi, kanggo 192.168.30.2, tabel rute nuduhake rute liwat antarmuka pppoe-wan, yaiku, liwat Internet, sanajan rute kasebut kudu diarahake liwat antarmuka wg0. Sawise mbusak rute iki, sambungan kasebut dibalekake. Aku ora bisa nemokake instruksi ing ngendi wae babagan carane meksa WireGuard supaya ora nggawe rute kasebut. Kajaba iku, aku ora ngerti manawa iki minangka fitur saka OpenWRT utawa WireGuard dhewe. Tanpa kudu ngatasi masalah iki nganti suwe, aku mung nambahake baris menyang loro router kanthi skrip wektu sing mbusak rute iki:

route del 192.168.30.2

Nyimpul

Aku durung entuk nilar OpenVPN lengkap, amarga kadhangkala aku kudu nyambung menyang jaringan anyar saka laptop utawa telpon, lan nyiyapake piranti gretap umume ora mungkin, nanging sanajan iki, aku entuk kauntungan saka kacepetan. transfer data antarane Apartemen lan, contone, nggunakake VNC ora trep maneh. Ping rada suda, 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, kacepetan wis tambah akeh. Dadi, ing apartemen karo router server aku duwe kacepetan sambungan Internet 30 Mbit / sec, lan ing apartemen liyane iku 5 Mbit / sec. Ing wektu sing padha, nalika nggunakake OpenVPN, aku ora bisa entuk kacepetan transfer data ing antarane jaringan luwih saka 3,8 Mbit / sec miturut maca iperf, nalika WireGuard "nyepetake" menyang 5 Mbit / sec sing padha.

Konfigurasi WireGuard ing VPS[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

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 kapindho, aku nunjukake klien WireGuard menyang port 51821. Ing teori, iki ora perlu, amarga klien bakal nggawe sambungan saka sembarang port sing ora duwe hak istimewa, nanging aku nggawe supaya bisa nglarang. kabeh sambungan mlebu ing antarmuka wg0 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 server lan klien OpenVPN

Server 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

klien 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

Aku digunakake gampang-rsa kanggo generate sertifikat

Source: www.habr.com

Add a comment