Containeren din svarar framleis på kontrollbrua si, men kvar utgåande pakke forlèt nettverket via kontor-macvlanen. Ingenting har svikta. To tilkoplingar gjev kvar si gateway, og den einaste standardruta gjekk til nettverket du ikkje meinte, så tenesta held fram med å verke medan trafikken tek ein lengre veg. Når nokon oppdagar det, er provet ei rutetabell og ikkje ei feilmelding.

Den vanlege forklaringa er at Docker valde nettverket ved eit uhell. I praksis følgde den gamle avgjerda den alfabetiske rekkjefølgja til dei tilkopla nettverksnamna, noko som gjorde ruting til ein biverknad av ei etikett. gw_priority byter det ut med eit tal du vel med vilje, og å ta det i bruk tek omtrent eitt minutt når oppsettet er skrive ned.

Kvifor standardruta hamnar på feil nettverk

Kvart nettverk ei teneste blir med i kan by på sin eigen gateway, og containeren endar likevel med nøyaktig éi standardrute. Før Compose 2.33.1 vart uavgjort avgjort ved å sortere nettverksnamna, så ei etikett som control som kjem før office avgjorde kvar trafikken gjekk. Ingenting inne i containeren registrerer at avgjerda var vilkårleg, og difor overlever ho kodegjennomgang og dukkar seinare opp som ein merkeleg veg. Å leggje ei policy i compose-fila er den einaste måten å gjere valet etterprøvbart på.

To ting endrar faktisk kva nettverk som vinn: gw_priority-verdiane du tildeler, og kva nettverk som i det heile er tilkopla. Legg til eit tredje nettverk og kandidatsettet veks; fjern macvlanen og det er ingenting att å konkurrere med brua. Ingen av dei to grepa synest i applikasjonsloggen, fordi ei feil standardrute sjeldan bryt sambandet heilt. Ho gjer berre at svar kjem frå ei adresse den andre sida kanskje ikkje ventar.

Fest gatewayen med gw_priority

Compose eksponerer gw_priority på kvar teneste-til-nettverk-tilkopling frå versjon 2.33.1, og det høgaste talet vinn. Det finst ingen gateway-nøkkel per teneste, så verdien høyrer under networks-blokka til tenesta. Dømet nedanfor gjev standardruta til control medan office blir verande tilgjengeleg for sitt direkte tilkopla LAN.

services:
  vpn:
    networks:
      control:
        gw_priority: 1
      office:
        gw_priority: 0

networks:
  control:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.50.0/24
  office:
    driver: macvlan
    driver_opts:
      parent: eno1.120
      macvlan_mode: bridge
    ipam:
      config:
        - subnet: 192.168.120.0/24
          ip_range: 192.168.120.192/27
          gateway: 192.168.120.1

Les blokka som to separate kontrollar: gw_priority avgjer standardruta, og ipam-delen avgjer adresseringa. Å endre berre subnettet lèt utgangsvalet stå urørt, og det er den vanlegaste måten denne rettinga blir halvvegs brukt på. Hald prioritetane attmed nettverket dei styrer, slik at neste lesar ikkje må leite etter avgjerda.

Ikkje blande gw_priority med den vanlege priority-eigenskapen attmed. Han ordnar opprettinga av samband og seier ingenting om ruting, så han kan ikkje velje ein standardgateway og rettar ikkje opp grensesnittnamn. Viss nokon tilrår å heve priority for å styre trafikken, er tilrådinga feil sjølv når den resulterande rekkjefølgja tilfeldigvis ser rett ut.

Stadfest kva nettverk som faktisk ber standardruta

Sjekk inne i den køyrande containeren, fordi rutetabellen til verten skildrar verten og ikkje namnerommet tenesta brukar. Køyr konfigurasjonssjekken først slik at ein skrivefeil feilar før ein omstart, og les deretter ruta containeren faktisk installerte.

docker compose config --quiet
docker exec vpn ip -4 route show default
docker exec vpn cat /proc/net/route

Eit rett resultat namngjev bru-eininga og 172.30.50.1; eit gale namngjev 192.168.120.1 og macvlan-eininga. Viss image ikkje inneheld iproute2-pakken, rapporterer /proc-fila framleis standardruta, med mål 00000000 og gateway-byta reverserte. Samanlikn grensesnittkolonnen med docker inspect når einingnamna er uklare.

Macvlan er ein fysisk port, ikkje ein klone av brua

Macvlan gjev containeren ein annan identitet på kabelen, og det er nettopp dette som gjer tilgang til lokale einingar mogleg. Det tyder òg at svitsjporten og hypervisoren må godta ei ekstra MAC-adresse, og mange skynettverk avviser det i stillheit. Test éin container før du planlegg ein flåte, fordi ein avvist MAC vanlegvis syner seg som ei lenkje som er oppe og ikkje slepp noko gjennom.

Innstillinga macvlan_mode: bridge er ein modus i macvlan-drivaren, ikkje programvarebrua til Docker, og passthru er ein eigen spesialisert modus og ikkje ein standard. Linux hindrar òg ein macvlan-container i å nå sin eigen vert gjennom same forelder, og det er grunnen til å halde på kontrollbrua i staden for å vente at éi tilkopling gjer begge jobbane.

Namngje VLAN-forelderen før Compose ser han

Docker handsamar ein forelder med punktum som eno1.120 som eit 802.1Q-undergrensesnitt og opprettar VLAN-eininga sjølv. Den bekvemmelege løysinga har grenser: det avleidde namnet avheng av namnet på det fysiske grensesnittet, og lange namn kan skyve resultatet ut over det verktøya rundt ventar. Å opprette eit namngjeve VLAN-grensesnitt i nettverkskonfigurasjonen til verten og peike parent dit held begge endane føreseielege.

Hugs at nøkkelen under networks er eit Compose-namn, ikkje ei Linux-eining. Å leite etter eit grensesnitt som heiter office på verten vil feile, fordi kjernen berre ser foreldregrensesnittet og veth-paret bak containeren.

Lag plass til VPN-en på toppen

Ein VPN-klient koplar seg til etter at desse nettverka finst, så han kan leggje til meir spesifikke ruter, policyreglar og filter uavhengig av gw_priority. Planlegg fjernprefiksa mot begge lokale subnett, inkludert svara kontrollvegen treng. Når eit fjernprefiks overlappar kontor-LAN-et, rett opp adresseplanen i staden for å rive eit heilt privat område ut av tunnelen.

Kontroller adresser, ruter og tenestebanen på nytt etter at VPN-en startar og igjen etter at han koplar til på nytt, fordi det er ved ein gjenoppkopling ei handlagd rute forsvinn. Skriv ned den venta tabellen før første test, slik at samanlikninga etterpå er ein diff og ikkje ein hugseøving. Hald den varige nettverkseigarskapen i Compose og lat VPN-konfigurasjonen berre eige si eiga policy.

Relaterte artiklar