
Her biri ağ geçidi olarak OpenWRT'li yönlendiriciler kullanan, coğrafi olarak birbirinden uzak üç dairedeki ağları tek bir ortak ağda birleştirme deneyimimi paylaşmak istiyorum. Alt ağ yönlendirmeli L3 ve köprülemeli L2 arasındaki ağları birleştirmek için bir yöntem seçerken, tüm ağ düğümleri aynı alt ağda olacaksa, yapılandırılması daha zor olan ancak şeffaf olduğu için daha fazla fırsat sağlayan ikinci yöntem tercih edildi. oluşturulan ağ Wake-on-Lan ve DLNA'da teknolojilerin kullanımı planlandı.
Bölüm 1: Arka Plan
Bu görevi uygulamak için seçilen protokol başlangıçta şuydu: OpenVPNÇünkü öncelikle, köprüye sorunsuz bir şekilde eklenebilen bir dokunmatik cihaz oluşturabiliyor ve ikincisi, OpenVPN TCP'yi desteklemesi de önemliydi çünkü dairelerin hiçbirinde özel bir IP adresi yoktu. İnternet servis sağlayıcım nedense ağlarından gelen UDP bağlantılarını engellediği için STUN kullanamadım. TCP, VPN sunucu portunu SSH kullanarak kiraladığım VPS'ye yönlendirmeme olanak sağladı. Bu yaklaşım, veriler çift şifrelendiği için önemli bir ek yük getirse de, üçüncü şahısların kontrolü ele geçirme riski nedeniyle VPS'yi özel ağım içine entegre etmek istemedim. Bu nedenle, ev ağımda böyle bir cihaza sahip olmak son derece istenmeyen bir durumdu, bu yüzden güvenlik için önemli bir ek maliyet ödemeye karar verdim.
Sunucunun kurulması planlanan yönlendiricide portu yönlendirmek için sshtunnel programını kullandım. Yapılandırmasının ayrıntılarına girmeyeceğim—oldukça kolay. Sadece amacının TCP 1194 portunu yönlendiriciden VPS'ye yönlendirmek olduğunu belirteceğim. Ardından sunucuyu yapılandırdım. OpenVPN br-lan köprüsüne bağlı olan tap0 cihazında, dizüstü bilgisayarımdan yeni oluşturulan sunucuya bağlantıyı test ettikten sonra, port yönlendirme fikrinin işe yaradığı ve dizüstü bilgisayarımın fiziksel olarak ağın bir parçası olmamasına rağmen yönlendiricinin ağının bir üyesi haline geldiği açıkça ortaya çıktı.
Geriye kalan tek şey, IP adreslerinin çakışmaması için farklı dairelere dağıtılması ve yönlendiricilerin yapılandırılmasıydı. OpenVPN-müşteriler.
Aşağıdaki yönlendirici IP adresleri ve DHCP sunucu aralıkları seçildi:
- 192.168.10.1 menzilli 192.168.10.2 - 192.168.10.80 sunucu için
- 192.168.10.100 menzilli 192.168.10.101 - 192.168.10.149 2 numaralı dairedeki bir yönlendirici için
- 192.168.10.150 menzilli 192.168.10.151 - 192.168.10.199 3 numaralı dairedeki bir yönlendirici için
Bu adreslerin istemci yönlendiricilerine atanması da gerekliydi. OpenVPN-sunucuya, yapılandırmasına aşağıdaki satırı ekleyerek:
ifconfig-pool-persist /etc/openvpn/ipp.txt 0ve /etc/openvpn/ipp.txt dosyasına şu satırları ekleyin:
flat1_id 192.168.10.100
flat2_id 192.168.10.150
flat1_id ve flat2_id, bağlantı kurmak için sertifikalar oluşturulurken belirtilen cihaz adlarıdır. OpenVPN
Ardından yönlendiriciler yapılandırıldı. OpenVPN- Her iki yönlendiricideki tap0 cihazları da br-lan köprüsüne eklendi. Bu noktada her şey yolunda görünüyordu, çünkü üç ağ da birbirini görebiliyor ve tek bir birim olarak çalışabiliyordu. Ancak oldukça tatsız bir ayrıntı ortaya çıktı: bazen cihazlar yanlış yönlendiriciden IP adresi alıyor ve bunun da sonuçları oluyordu. Bir nedenden dolayı, dairelerden birindeki yönlendirici DHCPDISCOVER'a zamanında yanıt veremedi ve cihaz yanlış adresi aldı. Her yönlendiricideki tap0'da bu tür istekleri filtrelemem gerektiğini fark ettim, ancak iptables'ın bir köprünün parçası olan bir cihazla çalışamayacağı ortaya çıktı, bu nedenle ebtables kullanmam gerekiyordu. Ne yazık ki, firmware'im bunu içermiyordu, bu nedenle her cihaz için imajları yeniden oluşturmam gerekti. Bunu yaptıktan ve her yönlendiricideki /etc/rc.local dosyasına aşağıdaki satırları ekledikten sonra sorun çözüldü:
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
Bu yapılandırma üç yıl sürdü.
Bölüm 2: Tanışma WireGuard
Son zamanlarda internette giderek daha fazla konuşuluyor, özellikle şu konu hakkında: WireGuardYapılandırmasının kolaylığı, yüksek aktarım hızı, düşük ping süresi ve karşılaştırılabilir güvenliği nedeniyle beğenmiştim. Hakkında daha fazla bilgi ararken, köprü üyesi veya TCP protokolü desteğinin olmadığını öğrendim, bu da başka bir alternatifin olmadığına inanmama yol açtı. OpenVPN Benim için henüz o noktaya gelmedi. Bu yüzden tanışmayı erteledim. WireGuard.
Birkaç gün önce, bilişim teknolojileriyle ilgili çeşitli kaynaklar aracılığıyla şu haber yayıldı: WireGuard Sonunda çekirdeğe dahil edilecek. Linux5.6 sürümünden itibaren başlayarak. Haber makaleleri, her zamanki gibi, övgüyle karşılandı. WireGuardEski güzel şeylerin yerini alacak yollar aramaya bir kez daha daldım. OpenVPNBu sefer karşılaştım . GRE kullanarak L3 üzerinden bir Ethernet tüneli oluşturmaktan bahsediyordu. Bu yazı bana umut verdi. UDP protokolü ile ne yapılacağı belirsizliğini koruyordu. Arama beni, bir UDP bağlantı noktasını iletmek için bir SSH tüneli ile birlikte socat kullanma hakkında makalelere götürdü, ancak, bu yaklaşımın yalnızca tekli bağlantı modunda çalıştığını, yani birden çok VPN istemcisinin imkansız olacağı anlamına geldiğini belirttiler. Bir VPS'de bir VPN sunucusu kurma ve istemciler için GRE kurma fikrini buldum, ancak ortaya çıktığı gibi, GRE şifrelemeyi desteklemiyor, bu da üçüncü tarafların sunucuya erişmesi durumunda , ağlarım arasındaki tüm trafik onların elinde ve bu bana hiç uymuyordu.
Yine, aşağıdaki şemaya göre VPN üzerinden VPN kullanılarak yedekli şifreleme lehine karar verildi:
Katman XNUMX VPN'i:
VPS olduğunu sunucu dahili adres 192.168.30.1 ile
MS olduğunu müşteri Dahili adresi 192.168.30.2 olan VPS
MK2 olduğunu müşteri Dahili adresi 192.168.30.3 olan VPS
MK3 olduğunu müşteri Dahili adresi 192.168.30.4 olan VPS
Katman XNUMX VPN'i:
MS olduğunu sunucu harici adres 192.168.30.2 ve dahili 192.168.31.1 ile
MK2 olduğunu müşteri MS 192.168.30.2 adresli ve 192.168.31.2 dahili IP'li
MK3 olduğunu müşteri MS 192.168.30.2 adresli ve 192.168.31.3 dahili IP'li
* MS - daire 1'deki yönlendirici-sunucu, MK2 - daire 2'deki yönlendirici, MK3 - daire 3'teki yönlendirici
* Cihaz konfigürasyonları yazının sonundaki spoiler kısmında yayınlanmıştır.
Ve böylece, 192.168.31.0/24 ağının düğümleri arasındaki pingler gider, GRE tünelini kurmaya geçme zamanı. Bundan önce, yönlendiricilere erişimi kaybetmemek için, 22 numaralı bağlantı noktasını VPS'ye iletmek için SSH tünelleri kurmaya değer, böylece, örneğin, VPS'nin 10022 numaralı bağlantı noktasında daire 2'den bir yönlendirici mevcut olacaktır Daire 11122'deki yönlendirici, VPS'nin 3 numaralı bağlantı noktasında mevcut olacaktır. Daire XNUMX'teki yönlendirici. Düşmesi durumunda tüneli geri yükleyeceğinden, yönlendirmeyi aynı sshtunnel ile yapılandırmak en iyisidir.
Tünel yapılandırıldı, yönlendirilen bağlantı noktası üzerinden SSH'ye bağlanabilirsiniz:
ssh root@МОЙ_VPS -p 10022Ardından devre dışı bırakmalısınız. OpenVPN:
/etc/init.d/openvpn stopŞimdi daire 2'deki yönlendiricide bir GRE tüneli oluşturalım:
ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set grelan0 up
Ve oluşturulan arayüzü köprüye ekleyin:
brctl addif br-lan grelan0
Sunucu yönlendirici üzerinde benzer bir prosedür gerçekleştirelim:
ip link add grelan0 type gretap remote 192.168.31.2 local 192.168.31.1
ip link set grelan0 up
Ayrıca, oluşturulan arayüzü köprüye ekleyin:
brctl addif br-lan grelan0
bu andan itibaren pingler yeni ağa başarıyla gitmeye başlıyor ve ben memnuniyetle kahve içmeye gidiyorum. Ardından, kablonun diğer ucundaki ağın nasıl çalıştığını görmek için, apartman 2'deki bilgisayarlardan birine SSH girmeye çalışıyorum, ancak ssh istemcisi bana parola sormadan donuyor. Bu bilgisayara 22 numaralı bağlantı noktasında telnet üzerinden bağlanmaya çalışıyorum ve bağlantının kurulduğunu anlayabileceğiniz bir satır görüyorum, SSH sunucusu yanıt veriyor ama nedense girmemi teklif etmiyor.
$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1
VNC üzerinden bağlanmaya çalışıyorum ve siyah bir ekran görüyorum. Sorunun uzaktaki bilgisayarda olduğuna kendimi ikna ediyorum çünkü dahili adresi kullanarak bu daireden yönlendiriciye kolayca bağlanabiliyorum. Ancak, yönlendirici aracılığıyla bu bilgisayara SSH yapmaya karar verdim ve bağlantının başarılı olduğunu ve uzak bilgisayarın iyi çalıştığını ancak bilgisayarıma da bağlanamadığını görünce şaşırdım.
Grelan0 aygıtını köprüden çıkarıp çalıştırıyorum. OpenVPN 2 numaralı dairedeki yönlendiricide, ağın tekrar düzgün çalıştığını ve bağlantıların kesilmediğini doğruladım. Araştırma yaparken, aynı sorunlardan şikayet eden ve MTU'yu yükseltmeleri tavsiye edilen kişilerin olduğu forumlara rastladım. Hemen uyguladım. Ancak, MTU yeterince yüksek bir değere (gretap cihazları için 7000) ayarlanana kadar, ya TCP bağlantılarında kesintiler yaşadım ya da düşük aktarım hızları elde ettim. Gretap için yüksek MTU nedeniyle, bağlantılar için MTU değeri... WireGuard Birinci ve ikinci seviyeler sırasıyla 8000 ve 7500 olarak belirlendi.
Daire 3'teki yönlendiricide benzer bir kurulum yaptım, tek fark, br-lan köprüsüne de eklenen sunucu yönlendiricisine grelan1 adlı ikinci bir gretap arabiriminin eklenmesiydi.
Her şey çalışıyor. Artık gretap düzeneğini otomatik yüklemeye koyabilirsiniz. Bunun için:
Bu satırları, daire 2'deki yönlendiricide /etc/rc.local dizinine yerleştirdim:
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
Bunu apartman 3'teki yönlendiricide /etc/rc.local dosyasına ekledi:
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
Ve sunucu yönlendiricisinde:
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
İstemci yönlendiricilerini yeniden başlattıktan sonra, bir nedenden dolayı sunucuya bağlanmadıklarını keşfettim. SSH'lerine bağlandıktan sonra (neyse ki, bunun için önceden sshtunnel'ı yapılandırmıştım), şunu fark ettim: WireGuard Nedense, uç nokta için yanlış bir rota oluşturuyor. Örneğin, 192.168.30.2 için, rota tablosu pppoe-wan arayüzü üzerinden, yani internet üzerinden bir rota belirtiyor, oysa bu rotaya wg0 arayüzü üzerinden yönlendirilmesi gerekiyordu. Bu rotayı sildikten sonra bağlantı yeniden kuruldu. Bunu nasıl zorla düzeltebileceğime dair bir talimat bulabilir miyim? WireGuard Bu rotaları oluşturmaktan kaçınamadım. Dahası, bunun OpenWRT'nin mi yoksa başka bir sistemin mi özelliği olduğunu bile anlamadım. WireGuardSorunu çözmek için fazla zaman harcamadan, her iki yönlendiricideki zamanlayıcı döngüsü komut dosyasına bu rotayı silen bir satır ekledim:
route del 192.168.30.2
Özetleme
Tamamen reddedildi OpenVPN Henüz bunu başaramadım, çünkü zaman zaman dizüstü bilgisayar veya telefondan yeni bir ağa bağlanmam gerekiyor ve bunlarda gretap cihazı kurmak genellikle imkansız. Ancak buna rağmen, daireler arası veri aktarım hızında bir avantaj elde ettim ve örneğin VNC kullanımı artık sorunsuz. Ping biraz azaldı ama daha istikrarlı hale geldi:
Kullanırken 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
Kullanırken 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
Çoğunlukla, yaklaşık 61.5 ms olan yüksek VPS pinginden etkilenir.
Ancak hız önemli ölçüde arttı. Yani, yönlendirici-sunucunun bulunduğu dairede internet bağlantı hızım 30 Mbps iken, diğer dairelerde 5 Mbps. Dahası, kullanım sırasında OpenVPN iperf test sonuçlarına göre ağlar arasında 3,8 Mbps'nin üzerinde veri aktarım hızı elde edemedim. WireGuard Hızı aynı 5 Mbit/sn'ye "yükselttim".
Yapılandırma WireGuard VPS üzerinde[Interface]
Address = 192.168.30.1/24
ListenPort = 51820
PrivateKey = <ЗАКРЫТЫЙ_КЛЮЧ_ДЛЯ_VPS>
[Eş]
PublicKey = <VPN_1_MS_PUBLIC_KEY>
İzin Verilen IP'ler = 192.168.30.2/32
[Eş]
PublicKey = <VPN_2_MK2_PUBLIC_KEY>
İzin Verilen IP'ler = 192.168.30.3/32
[Eş]
PublicKey = <VPN_2_MK3_PUBLIC_KEY>
İzin Verilen IP'ler = 192.168.30.4/32
Yapılandırma WireGuard MS üzerinde ( /etc/config/network dosyasına eklendi)
#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'
Yapılandırma WireGuard MK2'de ( /etc/config/network dosyasına eklendi)
#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'
Yapılandırma WireGuard MK3'de ( /etc/config/network dosyasına eklendi)
#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'
İkinci seviye VPN için açıklanan yapılandırmalarda, istemcilere şunu belirtiyorum: WireGuard 51821 numaralı port. İstemci herhangi bir boş, ayrıcalıksız porttan bağlantı kuracağı için buna gerek olmamalıydı, ancak ben bunu, 51821 numaralı porta gelen UDP bağlantıları hariç, tüm yönlendiricilerin wg0 arayüzlerindeki tüm gelen bağlantıları reddedebilmek için bu şekilde yaptım.
Umarım makale birileri için faydalı olur.
PS Ayrıca, ağımda yeni bir cihaz göründüğünde WirePusher uygulamasında telefonuma PUSH bildirimi gönderen scriptimi paylaşmak istiyorum. İşte betiğin bağlantısı: .
GÜNCELLEME: Yapılandırma OpenVPN-sunucular ve istemciler
OpenVPN-sunucu
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- müşteri
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 Sertifika oluşturmak için easy-rsa kullandım.
Kaynak: habr.com
