Bermigrasi dari OpenVPN ke WireGuard untuk bergabung dengan jaringan menjadi satu jaringan L2



Saya ingin berbagi pengalaman menggabungkan jaringan di tiga apartemen yang jauh secara geografis, di mana masing-masing router dengan OpenWRT digunakan sebagai gateway ke dalam satu jaringan umum. Ketika memilih metode untuk menggabungkan jaringan antara L3 dengan routing subnet dan L2 dengan bridging, ketika semua node jaringan akan berada di subnet yang sama, metode kedua lebih disukai, yang lebih sulit untuk dikonfigurasi, tetapi memberikan lebih banyak peluang, karena jaringan itu direncanakan untuk menggunakan teknologi transparan. Wake-on-Lan dan DLNA.

Bagian 1: Latar Belakang


OpenVPN pada awalnya dipilih sebagai protokol untuk mengimplementasikan tugas ini, karena, pertama, ia dapat membuat perangkat tap yang dapat dengan mudah ditambahkan ke bridge, dan kedua, OpenVPN mendukung operasi protokol TCP, yang juga penting, karena tidak ada apartemen yang memiliki alamat IP khusus, dan saya tidak dapat menggunakan STUN, karena karena alasan tertentu penyedia saya memblokir koneksi masuk melalui UDP dari jaringan mereka, sementara TCP memungkinkan saya untuk meneruskan port server VPN ke menyewa VPS menggunakan SSH. Ya, pendekatan ini memberikan beban besar, karena data dienkripsi dua kali, tetapi saya tidak ingin memasukkan VPS ke jaringan pribadi saya, karena ada risiko pihak ketiga mendapatkan kendali atas itu, oleh karena itu,memiliki perangkat seperti itu di jaringan rumah sangat tidak diinginkan dan diputuskan untuk membayar keamanan dengan overhead yang besar.

Untuk meneruskan port pada router di mana ia direncanakan untuk menyebarkan server, program sshtunnel digunakan. Saya tidak akan menjelaskan seluk beluk konfigurasinya - ini dilakukan dengan cukup mudah, saya hanya mencatat bahwa tugasnya adalah meneruskan port TCP 1194 dari router ke VPS. Selanjutnya, server OpenVPN dikonfigurasi pada perangkat tap0, yang berakhir di jembatan br-lan. Setelah memeriksa koneksi ke server yang baru saja Anda buat dari laptop, menjadi jelas bahwa gagasan port forwarding telah terbayar dan laptop saya menjadi anggota jaringan router, walaupun secara fisik saya tidak ada di sana.

Masalahnya tetap kecil: perlu untuk mendistribusikan alamat IP di apartemen yang berbeda sehingga mereka tidak konflik dan mengkonfigurasi router sebagai klien OpenVPN.
Alamat IP router dan rentang server DHCP berikut dipilih:

  • 192.168.10.1 dengan kisaran 192.168.10.2 - 192.168.10.80 untuk server
  • 192.168.10.100 dengan kisaran 192.168.10.101 - 192.168.10.149 untuk router di apartemen No. 2
  • 192.168.10.150 dengan kisaran 192.168.10.151 - 192.168.10.199 untuk router di apartemen No. 3

Itu juga perlu untuk menetapkan alamat-alamat ini ke router klien dari server OpenVPN dengan menambahkan baris berikut ke konfigurasinya:

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

dan menambahkan baris berikut ke file /etc/openvpn/ipp.txt:

flat1_id 192.168.10.100
flat2_id 192.168.10.150

di mana flat1_id dan flat2_id adalah nama perangkat yang ditentukan saat membuat sertifikat untuk menghubungkan ke OpenVPN

Selanjutnya, klien OpenVPN dikonfigurasikan pada router, perangkat tap0 pada keduanya ditambahkan ke br-lan bridge. Pada tahap ini, tampaknya semuanya beres, karena ketiga jaringan saling melihat dan bekerja secara keseluruhan. Namun, itu ternyata menjadi detail yang tidak terlalu menyenangkan: kadang-kadang perangkat tidak bisa mendapatkan alamat IP dari router mereka, dengan semua konsekuensi berikutnya. Untuk beberapa alasan, router di beberapa apartemen tidak punya waktu untuk menanggapi DHCPDISCOVER pada waktunya dan perangkat tidak menerima alamatnya. Saya menyadari bahwa saya perlu memfilter permintaan seperti itu di tap0 pada masing-masing router, tetapi, ternyata, iptables tidak dapat bekerja dengan perangkat jika itu merupakan bagian dari jembatan dan ebtable harus membantu saya. Sayangnya, itu tidak ada dalam firmware saya dan saya harus membangun kembali gambar untuk setiap perangkat.Setelah melakukan ini dan menambahkan baris-baris tersebut ke /etc/rc.local masing-masing router, masalahnya terpecahkan:

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 ini berlangsung selama tiga tahun.

Bagian 2: Memperkenalkan WireGuard


Baru-baru ini, di Internet, mereka mulai berbicara lebih banyak tentang WireGuard, mengagumi kesederhanaan konfigurasinya, kecepatan transmisi tinggi, ping rendah dengan keamanan yang sebanding. Pencarian untuk informasi tambahan tentang dia menjelaskan bahwa mereka tidak mendukung apakah bekerja sebagai anggota bridge atau bekerja dengan protokol TCP, yang membuat saya berpikir bahwa masih ada alternatif untuk OpenVPN bagi saya. Jadi saya menunda untuk mengenal WireGuard.

Beberapa hari yang lalu, melalui sumber daya, dengan satu atau lain cara terhubung dengan IT, berita muncul bahwa WireGuard akhirnya akan dimasukkan dalam kernel Linux, dimulai dengan versi 5.6. Artikel-artikel berita, seperti biasa, memuji WireGuard. Saya kembali mencari cara untuk mengganti OpenVPN yang lama dan bagus. Kali ini saya melihat artikel ini. Itu berbicara tentang membangun terowongan Ethernet lebih dari L3 menggunakan GRE. Artikel ini memberi saya harapan. Masih belum jelas apa yang harus dilakukan dengan protokol UDP. Pencarian membawa saya ke artikel tentang penggunaan socat bersama dengan terowongan SSH untuk meneruskan port UDP, namun, mereka mencatat bahwa pendekatan ini hanya bekerja dalam mode koneksi tunggal, yaitu, pekerjaan beberapa klien VPN tidak mungkin dilakukan. Saya datang dengan ide meningkatkan server VPN pada VPS, dan mengatur GRE untuk klien, tetapi ternyata, GRE tidak mendukung enkripsi, yang akan mengarah pada kenyataan bahwa dalam hal akses ke server oleh pihak ketiga, semua lalu lintas antara jaringan saya ada di tangan mereka. pada prinsipnya itu tidak cocok untukku.

Sekali lagi, keputusan dibuat untuk enkripsi yang berlebihan, dengan menggunakan VPN melalui VPN sesuai dengan skema berikut:

Tingkat Pertama VPN:
VPS adalah server yang dengan alamat internal 192.168.30.1
MS adalah sebuah VPS client dengan alamat internal 192.168.30.2
MK2 adalah sebuah VPS client dengan alamat internal 192.168.30.3
MK3 adalah sebuah VPS client dengan alamat internal 192.168.30.3 MK2 adalah sebuah

tingkat kedua VPN:
MS adalah server yang dengan alamat eksternal 192.168.30.2 dan internal 192.168.31.1
MK2 adalah klien MS dengan alamat 192.168.30.2 dan memiliki IP internal 192.168.31.2
MK3 adalah klien MSdengan alamat 192.168.30.2 dan memiliki IP internal 192.168.31.3

* MS - router-server di apartemen 1, MK2 - router di apartemen 2, MK3 - router di apartemen 3
* Konfigurasi perangkat diterbitkan dalam spoiler di akhir artikel.

Maka, ping antara node jaringan 192.168.31.0/24 pergi, sekarang saatnya untuk beralih ke pengaturan terowongan GRE. Sebelum ini, agar tidak kehilangan akses ke router, ada baiknya mengatur terowongan SSH untuk meneruskan 22 port pada VPS, sehingga, misalnya, router dari apartemen 2 akan tersedia pada port VPS 10022, dan pada port 11122 VPS akan tersedia router berasal dari apartemen 3. Yang terbaik adalah mengkonfigurasi penerusan dengan sshtunnel yang sama, karena akan mengembalikan terowongan jika jatuh.

Terowongan dikonfigurasi, Anda dapat terhubung ke SSH melalui port yang diteruskan:

ssh root@_VPS -p 10022

Selanjutnya, nonaktifkan OpenVPN:

/etc/init.d/openvpn stop

Sekarang konfigurasikan terowongan GRE di router dari apartemen 2:

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

Dan tambahkan antarmuka yang dibuat ke jembatan:

brctl addif br-lan grelan0

Kami akan melakukan prosedur serupa pada router-server:

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

Dan, juga, tambahkan antarmuka yang dibuat ke jembatan:

brctl addif br-lan grelan0

mulai dari saat ini, ping mulai berhasil masuk ke jaringan baru dan saya, dengan kepuasan, akan minum kopi. Kemudian, untuk mengevaluasi cara kerja jaringan di ujung lain kabel, saya mencoba menghubungkan melalui SSH ke salah satu komputer di apartemen 2, tetapi klien ssh membeku tanpa meminta kata sandi. Saya mencoba untuk terhubung ke komputer ini melalui telnet ke port 22 dan saya melihat garis dari mana dapat dipahami bahwa koneksi sedang dibuat, server SSH merespons, hanya untuk beberapa alasan tidak menawarkan saya untuk masuk.

$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1

Saya mencoba menghubungkannya melalui VNC dan melihat layar hitam. Saya meyakinkan diri sendiri bahwa itu adalah komputer jarak jauh, karena saya dapat dengan mudah terhubung ke router dari apartemen ini di alamat internal. Namun, saya memutuskan untuk terhubung ke SSH komputer ini melalui router dan saya terkejut menemukan bahwa koneksi berhasil dan komputer jarak jauh berfungsi dengan baik, tetapi juga tidak dapat terhubung ke komputer saya.

Saya menghapus perangkat grelan0 dari jembatan dan menjalankan OpenVPN pada router di apartemen 2 dan memastikan bahwa jaringan berfungsi lagi seperti yang diharapkan dan koneksi tidak putus. Ketika saya mencari, saya menemukan forum di mana orang-orang mengeluh tentang masalah yang sama, di mana mereka disarankan untuk meningkatkan MTU. Namun, saya tidak dapat meningkatkan MTU untuk VPN tingkat pertama (wg0): dengan MTU di atas 1420, yang diatur secara otomatis, mulai rusak, tetapi pada saat yang sama, VPN tingkat kedua yang bekerja di atas wg0 bekerja dengan benar dengan MTU 1600. Ini cukup untuk menginstal MTU adalah 1500 untuk perangkat gretap, sehingga antarmuka ini memiliki nilai MTU yang sama dengan jembatan br-lan tempat gretap direncanakan akan ditambahkan. Seperti yang saya pahami, bridge menetapkan MTU sama dengan yang lebih kecil dari nilai yang tersedia di semua perangkat.

Saya membuat konfigurasi serupa pada router dari apartemen 3, dengan satu-satunya perbedaan adalah bahwa pada router server menambahkan antarmuka gretap kedua bernama grelan1, yang juga ditambahkan ke jembatan br-lan.

Semuanya berfungsi. Sekarang Anda dapat meletakkan perakitan gretap di startup. Untuk melakukan ini:

Masukkan baris-baris ini di /etc/rc.local pada router di apartemen 2:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set dev grelan0 mtu 1500
ip link set grelan0 up
brctl addif br-lan grelan0

Menambahkan ini ke /etc/rc.local pada router di apartemen 3:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.3
ip link set dev grelan0 mtu 1500
ip link set grelan0 up
brctl addif br-lan grelan0

Dan pada router server:

ip link add grelan0 type gretap remote 192.168.31.2 local 192.168.31.1
ip link set dev grelan0 mtu 1500
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 1500
ip link set grelan1 up
brctl addif br-lan grelan1

Setelah me-reboot router klien, saya menemukan bahwa untuk beberapa alasan mereka tidak terhubung ke server. Setelah terhubung ke SSH mereka (untungnya, saya mengkonfigurasi sshtunnel untuk ini), ditemukan bahwa WireGuard sedang membuat rute untuk titik akhir karena alasan tertentu, tetapi itu tidak benar. Jadi, untuk 192.168.30.2, tabel rute menunjukkan rute melalui antarmuka pppoe-wan, yaitu, melalui Internet, meskipun rute ke sana seharusnya dialihkan melalui antarmuka wg0. Setelah menghapus rute ini, koneksi dipulihkan. Saya tidak dapat menemukan petunjuk di suatu tempat tentang cara membuat WireGuard tidak membuat rute ini. Selain itu, saya bahkan tidak mengerti, fitur adalah OpenWRT, atau WireGuard sendiri. Tidak harus berurusan dengan masalah ini untuk waktu yang lama, saya hanya menambahkan baris ke router ini ke skrip yang dilingkupi oleh timer untuk menghapus rute ini:

route del 192.168.30.2

Untuk meringkas


Saya belum mencapai penolakan lengkap terhadap OpenVPN, karena saya kadang-kadang perlu terhubung ke jaringan baru dari laptop atau telepon, dan menyiapkan perangkat gretap pada mereka secara umum tidak mungkin, tetapi meskipun demikian, saya mendapat keuntungan dalam kecepatan transfer data antara apartemen dan, misalnya, penggunaan VNC sekarang tidak menimbulkan ketidaknyamanan. Ping sedikit menurun, tetapi menjadi lebih stabil:

Saat menggunakan 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

Saat menggunakan 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

Ini lebih dipengaruhi oleh ping tinggi sebelum VPS, yaitu sekitar 61,5 ms.

Namun, kecepatannya meningkat secara signifikan. Jadi, di apartemen dengan router-server, saya memiliki kecepatan koneksi internet 30 Mbit / s, dan di apartemen lain - 5 Mbit / s. Pada saat yang sama, ketika menggunakan OpenVPN, saya tidak dapat mencapai kecepatan transfer data antara jaringan lebih dari 3,8 Mb / s menurut iperf, sementara WireGuard "dipompa" ke 5 Mb / s yang sama.

Konfigurasi WireGuard pada 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 pada MS (ditambahkan ke / 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'

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 '1600'

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 pada MK2 (ditambahkan ke / 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'

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 '1600'

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 pada MK3 (ditambahkan ke / 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'

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 '1600'

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'


Dalam konfigurasi yang dijelaskan untuk VPN tingkat kedua, saya tentukan port 51821 untuk klien WireGuard. Pada prinsipnya, ini tidak perlu, karena klien akan membuat koneksi dari port yang tidak diprivatisasi gratis, tapi saya membuatnya sehingga saya bisa memblokir semua koneksi yang masuk pada antarmuka WG0 semua router, kecuali koneksi UDP masuk ke port 51821.

Saya harap artikel ini bermanfaat bagi seseorang.

PS Juga, saya ingin membagikan skrip saya yang mengirimkan saya pemberitahuan PUSH di telepon ke aplikasi WirePusher ketika perangkat baru muncul di jaringan saya. Berikut ini tautan ke skrip: github.com/r0ck3r/device_discover .

PEMBARUAN: Mengkonfigurasi Server dan 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



Untuk menghasilkan sertifikat, gunakan rsa mudah

Source: https://habr.com/ru/post/undefined/


All Articles