Routa ett LAN-undernät genom OpenVPN och behåll standardvägen
Behåll LAN-standardvägen medan ett undernät går genom tunneln. Jämför en policytabell med ändringar i huvudtabellen och välj sedan NAT eller en väg på serversidan.
Maskiner som routar för ett LAN och samtidigt ringer upp en VPN hamnar i samma diskussion med sig själva: tunneln vill äga standardvägen, och LAN:et behöver den tillbaka. När OpenVPN ansluter kan det installera en standardväg genom tunneln eller ett par halva standardvägar, vilket är rätt för en bärbar dator och fel för en gateway vars grannar förväntar sig svar från dess LAN-adress. Svaret är inte att hoppa över VPN:en. Svaret är att ge de två besluten olika tabeller.
En standardväg, två ägare
Vidarebefordrad trafik och lokalt uppkommen trafik behöver inte ta samma väg. LAN-klienter behöver tunneln bara för de destinationer du väljer, medan värdens egna administrationssessioner och dess svar till dessa klienter behöver LAN-standardvägen. Att blanda båda i huvudtabellen tvingar fram ett enda svar på två olika frågor.
OpenVPN har en brytare just för detta. route-noexec hindrar klienten från att röra huvudtabellen överhuvudtaget, och de värden den skulle ha använt exporteras till ett route-up-skript som route_vpn_gateway, dev och gränssnittets adresser. Sedan bestämmer du vilken tabell som får vilken väg, i kod du kan läsa senare.
Policytabell kontra att skriva om huvudtabellen
| Approach | What it buys | What it costs |
|---|---|---|
| Separate table plus source rule | LAN traffic and host traffic keep independent defaults | Every lookup now depends on rule order |
| Editing the main table only | Fewer moving parts on a single-purpose host | One mistake takes the gateway offline entirely |
| Two half-default routes | Works for a full-tunnel client | Ambiguous on a host that must answer on its LAN address |
Den separata tabellen är det enda alternativet som skalar bortom ett undernät. Namnge den en gång och hänvisa sedan till den vid namn så att ingen behöver komma ihåg ett nummer:
echo "10 vpn" >> /etc/iproute2/rt_tables
ip rule add from 192.168.50.0/24 table vpn
ip route add default via 10.8.0.1 dev tun0 table vpnAdresserna här är platshållare. Byt ut LAN-prefixet, tunnelns gateway och enhetsnamnet från din egen driftsättning innan du kör något.
Regeln måste också passa värden
En regel som bara passar LAN-prefixet täcker vidarebefordrade paket. Den täcker inte trafik som gatewayen själv skapar, och inte heller svaren den skickar tillbaka till LAN-klienter, som bär gatewayens LAN-adress som källa. De uppslagningarna faller till main och kan fortfarande gå ut genom tunneln.
Lägg till en andra regel för gatewayens egen LAN-adress, eller bredda den första regeln till en mängd som omfattar båda. Ordningen spelar roll: sätt den mer specifika regeln först och kontrollera resultatet med en uppslagning som namnger källan uttryckligen.
ip route get 203.0.113.9 from 192.168.50.1Om det rapporterar tunneleinheten för en destination som borde stanna lokalt är regeluppsättningen fel oavsett vad tabellen innehåller.
NAT eller en väg på andra sidan
VPN-servern känner till tunnelns undernät och ingenting annat. Paket som anländer med en LAN-källadress har ingen returväg om ingen tillhandahåller en, och det finns exakt två sätt att tillhandahålla den. Att lägga till en väg för LAN-prefixet på servern håller den ursprungliga källan synlig hela vägen, vilket en granskad design vanligtvis vill. Maskering på gatewayen skriver om källan till tunneladressen och kräver inget samarbete från servern.
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o tun0 -j MASQUERADEVälj NAT när du inte kontrollerar servern och inte kan lägga till vägar där. Välj vägen på serversidan när loggar, åtkomstkontroll eller returvägens symmetri spelar roll, eftersom maskering suddar ut den ursprungliga adressen från allt den andra sidan registrerar.
Hur som helst måste vidarebefordran vara påslagen, och strikt reverse-path-filtrering kan släppa svaret när main inte skulle ha valt tunneln för den källan. Kontrollera det faktiska värdet innan du skyller på tunneln.
Låt uppdelningen överleva en återanslutning
Regler och vägar som lagts till för hand försvinner när gränssnittet skapas på nytt, och en inaktuell tabellpost kan överleva den session som motiverade den. Lägg tabellregeln, tunnelvägen och maskeringsposten i klientens route-up-skript, och töm tabellen högst upp i skriptet så att en gammal gateway inte kan överleva in i den nya sessionen.
Kontrollera från båda ändar: en uppslagning på gatewayen med LAN-källan, och en riktig begäran från en LAN-klient till en destination som ska gå genom tunneln. En väg som finns men aldrig väljs beter sig precis som ingen väg alls, tills du läser räknarna.