Kontaktuje WireGuard peera vždy?

Kontaktuje WireGuard peera vždy?
« kdy: 29. 08. 2023, 21:38:59 »
Měl bych takový dotaz k fungování wireguardu  v situacích, kdy druhý peer je nedostupný.  Mám modelový příklad: na VPS běží Wireguard a přes PREROUTING mám naforwardován vybraný port na koncové zařízení.


Pokud dojde k výpadku připojení koncového připojení, bude se ho VPS snažit kontaktovat  pokaždé, když přijde paket který má být forwardovaný? Nebo jsou tam nějaké timeouty (třeba vycházející z conntrack)?

Tím spíš, když koncové zařízení je za NATema výpadek trvá déle než  2 minuty. pak by vysílal VPS UDP do "černé dírky", jelikož NAT ISP už rozetnul spojení.


Zatímco v druhé situaci, kdy místo UDP je využit  (z koncového zařízení) ssh -w 1:2 prostě  root@vps.com "ip addr add x y peer z;ip link set tun2 up; ip r add x via y;", s vhodně zvolenými parametry Clieant/ServerAliveInterval/TCPKeepAlive prostě  ssh tunel zkolabuje jako magnetické pole po vypnutí proudu.

Vite o něčem. co by podobného chování docílilo u wireguardu (konfigurace, určo tam je nějaký keepalive, ale to je jen interval přeposílání "handshaku"), aspoň co by dalo interface do down. ???
« Poslední změna: 30. 08. 2023, 01:14:55 od Petr Krčmář »


Re:Kontaktuje WireGuard peera vždy?
« Odpověď #1 kdy: 30. 08. 2023, 17:51:43 »
WireGuard co vím, tak pouze balí pakety a posílá je na cílovou IP adresu a port. Pokud tam nikdo neposlouchá, tak se paket ztratí. Opakování paketů řeší vyšší síťová vrstva. WireGuard je normálně potichu, pokud neprobíhá síťová komunikace, nic se nikam neposílá.

Pokud je cíl za NATem, musí si neustále obnovovat kanál a optimálně pomocí

Kód: [Vybrat]
PersistentKeepalive = 15

... v konfiguráku (toho co je za NATem). Tím zajistíš, že klient bude neustále pingat na server pakety, takže i když se z nějakých důvodu NAT rozpadne a zavře ten kanál, po obnovení spojení se obnoví pingání a client se zase stane dostupný. Mělo by to zvládnout i případnou změnu IP adresy/portu toho clienta


Re:Kontaktuje WireGuard peera vždy?
« Odpověď #2 kdy: 30. 08. 2023, 21:53:47 »
Nejsem na Wireguard úplný odborník a ani se v tom moc do hloubky hrabat nechci, ale mám teď čerstvou zkušenost s Wireguard na Mikrotiku a ze sledování vidím, že Wireguard zkouší navázat spojení vždy, když je nějaký packet routován směrem k tomu peeru. Peer se buď volí podle Allowed address nebo pokud je 0.0.0.0/0, tak tam posílá vše - zde je problém pokud je nad jedním wireguard interface více peeru s 0.0.0.0/0, pak to nefugnuje, je tedy třeba mít co interface a listen port = to jeden tunel na jiné zařízení.

Klienty mám připojené přes LTE od TMobile a docela tam dělá problémy jejich CGNAT, za kterým mají ty maloobchodní data schovaná. Prakticky po každém resetu LTE nebo přepojení na jinou cellu to dostane novou IP adresu na interface, což vede k tomu, že se změní veřejka + srcport za který to schovává CGNAT a implementace Wireguard v Mikrotik si s tímto nedokáže poradit a komunikace zcela přestane fungovat. Jediný workaround je, že jsem tam udělal netwatch, který když shodí/nahodí wireguard peer, což vede k vyčištění klíčů u spojení a teprve pak se komunikace rozjede. Avšak co jsem tohle googloval, Linuxová implementace by tohle měla mít dnes opraveno. To LTE je vždy jen jako záložní linka, takže mě to zatím netrápí natolik, abych zkusil na straně serveru Mikrotik vyměnit za čistý Linux, jestli to bude dělat to samé nebo ne. Tenhle problém by taky vyřešila podpora IPv6, ale rámcovka je s TM a ten dnes jako jediný IPv6 na LTE neumí...

Chápu, že informace jsou to k ničemu, ale možná to v tom Linuxu zas tak opravené není a možná to alespoň nasměruje nějaký směr, kde pátrat.

RDa

  • *****
  • 2 476
    • Zobrazit profil
    • E-mail
Re:Kontaktuje WireGuard peera vždy?
« Odpověď #3 kdy: 31. 08. 2023, 11:18:29 »
Tím spíš, když koncové zařízení je za NATema výpadek trvá déle než  2 minuty. pak by vysílal VPS UDP do "černé dírky", jelikož NAT ISP už rozetnul spojení.

U UDP se neresi spojeni, to jsou individualni pakety - datagramy.

Vrat se do skolky.

Re:Kontaktuje WireGuard peera vždy?
« Odpověď #4 kdy: 31. 08. 2023, 11:39:11 »
WireGuard používá transportní protokol UDP. Na začátku komunikace se provede jednocestný handshake, přičemž se bezpečně vymění klíče pro relaci a můžou se začít přenášet data. Když přijde nová komunikace na vnitřní rozhraní, WireGuard podle cílové IP adresy uvnitř VPN vybere z interní směrovací tabulky správný klíč, najde správnou cílovou IP a vytvoří nový UDP paket. Ten odešle a celá akce pro něj končí. Pokud je druhá strana nedostupná, paket se někde ztratí, ale to už WireGuard neřeší. Opakování si má udělat protokol vyšší vrstvy.

Partneři se bez potřeby přenášet data kontaktují jen při nutnosti nového handshaku, kdy se mění klíče relace. V dokumentaci jsou popsány timeouty a počty paketu, po kterém se provede rekey. Pokud to není potřeba, nic kromě zašifrovaných dat neproudí.

WireGuard používá tichý protokol, takže když není co posílat, je na lince ticho. Po cestě můžou být překlady adres (NAT), které si po nějaké době nepoužívání čistí tabulku spojení. V takové situaci pak není schopen partner zvenčí doručit UDP pakety za NAT. Typicky se tak třeba ze serveru nedostanete ke klientovi v privátní síti. K tomu slouží pakety keepalive, které se v pravidelných intervalech posílají. WireGuard na ně nereaguje, ty pakety neobsahují žádná data a slouží jen k udržování záznamu v tabulkách překladu.

Pokud je partner nedostupný, WireGuard to neřeší a vlastně to ani nemá jak zjistit. Předpokládá se, že se může kdykoliv v budoucnu třeba ozvat z jiné IP adresy. Uživatel například uspal notebook, převáží ho do jiného města a odtamtud se ozve. WireGuard v sobě má z principu zabudovaný roaming. Komunikace se posílá na poslední IP adresu, ze které se partner někdy ozval.


RDa

  • *****
  • 2 476
    • Zobrazit profil
    • E-mail
Re:Kontaktuje WireGuard peera vždy?
« Odpověď #5 kdy: 31. 08. 2023, 23:38:09 »
Krasne zhrnuti od Petra.

Mozna tazatel hleda funkci podobnou k OpenVPN, kdy pri neaktivnim spojeni na server se rozhrani tvarilo ve stavu "kabel odpojen" (link down), na coz mohl primo reagovat routovaci system z OS, pripadne aplikace.

Treba v nejake dalsi revizi :)

_Jenda

  • *****
  • 1 552
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Kontaktuje WireGuard peera vždy?
« Odpověď #6 kdy: 01. 09. 2023, 06:08:54 »
Tím spíš, když koncové zařízení je za NATema výpadek trvá déle než  2 minuty. pak by vysílal VPS UDP do "černé dírky", jelikož NAT ISP už rozetnul spojení.

U UDP se neresi spojeni, to jsou individualni pakety - datagramy.

Vrat se do skolky.
Ale aby fungovalo přes NAT, tak si connection tracking NATu drží UDP „pseudospojení“. Jak jinak by věděl, když přijde „odpověď“ na nějaký UDP paket, komu ve vnitřní síti ji má doručit?

Re:Kontaktuje WireGuard peera vždy?
« Odpověď #7 kdy: 01. 09. 2023, 20:56:27 »
Pokud dojde k výpadku připojení koncového připojení, bude se ho VPS snažit kontaktovat  pokaždé, když přijde paket který má být forwardovaný?
Ano.
Nebo jsou tam nějaké timeouty (třeba vycházející z conntrack)?
Ne.

Vite o něčem. co by podobného chování docílilo u wireguardu (konfigurace, určo tam je nějaký keepalive, ale to je jen interval přeposílání "handshaku"), aspoň co by dalo interface do down.
Pokud je jisté, že každý klient má nastavený keepalive třeba na 30 sekund, dá se nějakým skriptem z konfigurace Wireguardu odstranit IP adresu z hodnoty endpoint od všech peerů, jejichž handshake proběhl víc než třeba před pěti minutami. Trošku to komplikuje fakt, že Wireguard podle všeho nepodporuje odstranění jen IP adresy, takže je potřeba buď ji nastavit na nějakou neplatnou jako 100::1, nebo odstranit celého peera a znovu ho do konfigurace zavést. Bez nastavené adresy endpointu bude každý pokus o odeslání dat směrem ke klientovi končit chybou sendmsg: Destination address required až do chvíle, než přijde první paket od klient, který hodnotu zase nastaví.