Lägg till en standardrutt genom tunneln och tunnelns egna paket följer den. Tabellen innehåller då en regel som besegrar sig själv. Den krypterade anslutningen till servern försöker färdas inuti den anslutning den försöker upprätta.

Två mekanismer förhindrar den slingan. Den ena syns i routingtabellen, den andra lever inuti applikationen.

Inre och yttre trafik är olika beslut

Ett applikationspaket går in i det virtuella gränssnittet och kapslas in. Resultatet är ett nytt paket adresserat till serverns publika adress. Det paketet behöver en rutt på det fysiska nätet, eftersom ingenting av det får gå in i tunneln.

Båda är routingbeslut, och bara det första hör till tunneln. När klienten installerar en standardrutt som också täcker servern fångas det yttre paketet också.

Symtomen är omedelbara och totala. Handskakningen slutförs och därefter flödar ingenting, eller anslutningen faller i samma ögonblick som rutten installeras. I båda fallen kan keepalive inte längre ta sig ut.

Alternativ ett: en värdrutt för endpunkten

Det direkta tillvägagångssättet lägger till en rutt för serverns adress via den ursprungliga gatewayen. Det tar en rad. Den syns för alla som läser tabellen. Den är också lätt att förklara i en ändringslogg.

Dess svaghet visar sig när den underliggande vägen ändras. Den sparade rutten namnger en gateway och ett gränssnitt från det gamla nätet. Efter ett Wi-Fi-byte finns kanske inte den gatewayen, och rutten blir kvar, ser korrekt ut och gör ingenting.

# before the tunnel: which path reaches the endpoint?
ip route get 198.51.100.7

# pin it through the current gateway
ip route add 198.51.100.7/32 via 192.168.1.1 dev wlan0

# after the tunnel is up, confirm the pin survived
ip route get 198.51.100.7

Ett värdnamn gör detta svårare. Om endpunkten är ett namn som löses upp till flera adresser måste undantaget täcka den adress som faktiskt används. En senare uppslagning kan returnera något som rutten aldrig täckte.

Alternativ två: skydda socketen

Det andra tillvägagångssättet rör aldrig routingtabellen. Klienten markerar eller skyddar socketen som bär tunneln, så operativsystemet skickar den socketens trafik utanför tunneln enligt policy. Android exponerar mekanismen direkt för VPN-applikationer. Skrivbordsklienter implementerar motsvarigheter med brandväggsmarkeringar eller bind-till-enhet-anrop.

Fördelen är att undantaget följer anslutningen i stället för en sparad gateway. Ett nätverksbyte skriver om den underliggande vägen, och den skyddade socketen flyttar med eftersom den aldrig fästs vid en adress. Routingtabellen förblir ren.

Priset är synlighet. Ingenting i routingtabellen visar undantaget, så en granskare som letar efter en värdrutt hittar ingenting och kan dra slutsatsen att designen är osäker. Skyddet lever i klientens kod och i de policyregler som koden installerar.

Att välja mellan dem

Välj socketmekanismen när klienten stöder den, eftersom den överlever de nätverksbyten som bryter en fäst rutt. Välj värdrutten när undantaget måste vara synligt för andra verktyg, eller när klienten inte erbjuder något bättre.

Ingen av mekanismerna tar bort behovet av att serveradressen överhuvudtaget är nåbar. En privat gateway har en publik lyssnaradress, och det är den adressen som måste stanna utanför tunneln. De interna nätverken bakom den blir först nåbara när tunneln finns.

Vad du än väljer, håll det hos komponenten som äger tunneln. En lös värdrutt tillagd för hand fungerar till nästa nätverk, och då blir den morgondagens mystiska avbrott.

Relaterade artiklar