రెండు నెట్వర్క్లు ఉన్న కంటైనర్ తప్పు గేట్వేను ఎంచుకుంటుంది
రెండు కనెక్షన్లు, ఒక డిఫాల్ట్ మార్గం, మరియు తప్పు నెట్వర్క్ ఎప్పుడూ గెలుస్తుంది. Compose gw_priority తో నిష్క్రమణను పిన్ చేసి కంటైనర్ లోపలి నుండి నిర్ధారించుకోండి.
మీ కంటైనర్ ఇప్పటికీ తన నియంత్రణ వంతెనపై సమాధానం ఇస్తుంది, కానీ ప్రతి బయటకు వెళ్లే ప్యాకెట్ ఆఫీస్ macvlan ద్వారా బయటకు వెళ్తుంది. ఏదీ విఫలం కాలేదు. రెండు కనెక్షన్లు ఒక్కొక్కటి గేట్వే ఇస్తాయి, ఏకైక డిఫాల్ట్ మార్గం మీరు ఉద్దేశించని నెట్వర్క్ వైపు వెళ్లింది, కాబట్టి సేవ పనిచేస్తూనే ఉంటుంది కానీ దాని ట్రాఫిక్ పొడవైన మార్గం తీసుకుంటుంది. ఎవరైనా గమనించే సరికి రుజువు లోపం సందేశం కాదు, రూటింగ్ పట్టిక.
సాధారణ వివరణ Docker నెట్వర్క్ను యాదృచ్ఛికంగా ఎంచుకుంది అని. ఆచరణలో పాత నిర్ణయం కనెక్ట్ చేసిన నెట్వర్క్ పేర్ల అక్షర క్రమాన్ని అనుసరించింది, ఇది రూటింగ్ను ఒక లేబుల్ యొక్క పార్శ్వ ప్రభావంగా మార్చింది. gw_priority దానిని మీరు ఉద్దేశపూర్వకంగా ఎంచుకునే సంఖ్యతో భర్తీ చేస్తుంది, మరియు లేఅవుట్ రాసిన తర్వాత దానిని స్వీకరించడానికి సుమారు ఒక నిమిషం పడుతుంది.
డిఫాల్ట్ మార్గం తప్పు నెట్వర్క్పై ఎందుకు పడుతుంది
ఒక సేవ చేరే ప్రతి నెట్వర్క్ తన సొంత గేట్వేను అందించగలదు, అయినా కంటైనర్కు సరిగ్గా ఒకే డిఫాల్ట్ మార్గం ఉంటుంది. Compose 2.33.1 కంటే ముందు సమతుల్యతను నెట్వర్క్ పేర్లను క్రమబద్ధీకరించి నిర్ణయించేవారు, కాబట్టి control వంటి లేబుల్ office కంటే ముందు వస్తే ట్రాఫిక్ ఎక్కడికి వెళ్తుందో అదే నిర్ణయించేది. కంటైనర్ లోపల నిర్ణయం ఏకపక్షమని ఏదీ నమోదు చేయదు, అందుకే అది కోడ్ సమీక్షను దాటి తర్వాత వింత మార్గంగా బయటపడుతుంది. compose ఫైల్లో విధానం పెట్టడమే ఎంపికను పరిశీలించగలిగేలా చేసే ఏకైక మార్గం.
ఏ నెట్వర్క్ గెలుస్తుందో నిజంగా రెండు విషయాలు మారుస్తాయి: మీరు కేటాయించే gw_priority విలువలు, మరియు ఏ నెట్వర్క్లు కనెక్ట్ అయ్యాయి. మూడవ నెట్వర్క్ జోడిస్తే అభ్యర్థుల సమితి పెరుగుతుంది; macvlan తీసేస్తే వంతెనతో పోటీ పడేది ఏమీ ఉండదు. రెండు చర్యలూ అప్లికేషన్ లాగ్లలో కనిపించవు, ఎందుకంటే తప్పు డిఫాల్ట్ మార్గం కనెక్షన్ను పూర్తిగా తెంచడం చాలా అరుదు. అది జవాబులు ఎదుటి వైపు ఊహించని చిరునామా నుండి రావడానికి మాత్రమే దారి తీస్తుంది.
gw_priority తో గేట్వేను పిన్ చేయండి
Compose 2.33.1 సంస్కరణ నుండి ప్రతి సేవ-నుండి-నెట్వర్క్ కనెక్షన్పై gw_priority ను బహిర్గతం చేస్తుంది, అతిపెద్ద సంఖ్య గెలుస్తుంది. ప్రతి సేవకు ప్రత్యేక గేట్వే కీ లేదు, కాబట్టి విలువ సేవ యొక్క networks బ్లాక్లో ఉంటుంది. క్రింది ఉదాహరణ డిఫాల్ట్ను control కు ఇస్తుంది, office తన నేరుగా కనెక్ట్ అయిన 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
బ్లాక్ను రెండు వేర్వేరు నియంత్రణలుగా చదవండి: gw_priority డిఫాల్ట్ మార్గాన్ని, ipam భాగం చిరునామాను నిర్ణయిస్తుంది. కేవలం subnet మార్చితే నిష్క్రమణ ఎంపిక తాకబడకుండా ఉంటుంది, మరియు ఈ సవరణ సగం మాత్రమే అమలవడానికి ఇదే సాధారణ మార్గం. ప్రాధాన్యతలను అవి పాలించే నెట్వర్క్ పక్కనే ఉంచండి, తదుపరి పాఠకుడు నిర్ణయం కోసం వెతకాల్సిన అవసరం లేకుండా.
gw_priority ను పక్కనున్న సాధారణ priority లక్షణంతో కలిపి confuse చేయవద్దు. అది కనెక్షన్ల సృష్టి క్రమాన్ని నిర్ణయిస్తుంది మరియు రూటింగ్ గురించి ఏమీ చెప్పదు, కాబట్టి డిఫాల్ట్ గేట్వేను ఎంచుకోలేదు మరియు ఇంటర్ఫేస్ పేర్లను సరిచేయదు. ట్రాఫిక్ను మళ్లించడానికి priority పెంచమని ఎవరైనా సూచిస్తే, ఫలిత క్రమం యాదృచ్ఛికంగా సరిగ్గా కనిపించినా సూచన తప్పు.
నిజంగా ఏ నెట్వర్క్ డిఫాల్ట్ మార్గాన్ని మోస్తుందో నిర్ధారించుకోండి
నడుస్తున్న కంటైనర్ లోపల తనిఖీ చేయండి, ఎందుకంటే హోస్ట్ యొక్క రూటింగ్ పట్టిక హోస్ట్ను వివరిస్తుంది, సేవ ఉపయోగించే నామస్థలాన్ని కాదు. మొదట కాన్ఫిగ్ తనిఖీ నడపండి, అప్పుడు టైపింగ్ పొరపాటు పునఃప్రారంభానికి ముందే పట్టుబడుతుంది, తర్వాత కంటైనర్ నిజంగా ఇన్స్టాల్ చేసిన మార్గాన్ని చదవండి.
docker compose config --quiet
docker exec vpn ip -4 route show default
docker exec vpn cat /proc/net/route
సరైన ఫలితం వంతెన పరికరాన్ని మరియు 172.30.50.1 ను పేర్కొంటుంది; తప్పు ఫలితం 192.168.120.1 మరియు macvlan పరికరాన్ని పేర్కొంటుంది. ఇమేజ్లో iproute2 ప్యాకేజీ లేకపోయినా /proc ఫైల్ డిఫాల్ట్ మార్గాన్ని నివేదిస్తుంది, గమ్యం 00000000 మరియు గేట్వే బైట్లు తలకిందులుగా. పరికరాల పేర్లు స్పష్టంగా లేనప్పుడు ఇంటర్ఫేస్ నిలువు వరుసను docker inspect తో పోల్చండి.
macvlan ఒక భౌతిక పోర్టు, వంతెన యొక్క ప్రతిరూపం కాదు
macvlan కంటైనర్కు తీగపై రెండవ గుర్తింపును ఇస్తుంది, మరియు స్థానిక పరికరాలకు ప్రవేశాన్ని పనిచేయించేది అదే. దీని అర్థం స్విచ్ పోర్టు మరియు హైపర్వైజర్ అదనపు MAC చిరునామాను అంగీకరించాలి, మరియు చాలా క్లౌడ్ నెట్వర్క్లు దానిని నిశ్శబ్దంగా తిరస్కరిస్తాయి. ఫ్లీట్ను ప్లాన్ చేయడానికి ముందు ఒక కంటైనర్ను పరీక్షించండి, ఎందుకంటే తిరస్కరించిన MAC సాధారణంగా పైన ఉన్నా ఏమీ పంపని లింక్గా కనిపిస్తుంది.
macvlan_mode: bridge సెట్టింగ్ macvlan డ్రైవర్ యొక్క మోడ్, Docker యొక్క సాఫ్ట్వేర్ వంతెన కాదు, మరియు passthru డిఫాల్ట్ కాదు, ప్రత్యేక మోడ్. Linux కూడా macvlan కంటైనర్ తన సొంత హోస్ట్ను చేరుకోకుండా నిరోధిస్తుంది అదే మాతృ ఇంటర్ఫేస్ ద్వారా, అందుకే ఒక కనెక్షన్ రెండు పనులను చేస్తుందని ఆశించకుండా నియంత్రణ వంతెన ఉంచబడుతుంది.
Compose చూసే ముందు VLAN మాతృకకు పేరు పెట్టండి
Docker eno1.120 వంటి చుక్క ఉన్న మాతృకను 802.1Q ఉప-ఇంటర్ఫేస్గా పరిగణించి VLAN పరికరాన్ని తానే సృష్టిస్తుంది. ఆ సౌలభ్యానికి పరిమితులు ఉన్నాయి: ఉత్పన్నమైన పేరు భౌతిక ఇంటర్ఫేస్ పేరుపై ఆధారపడుతుంది, పొడవైన పేర్లు ఫలితాన్ని చుట్టుపక్కల సాధనాల అంచనాలకు మించి నెట్టగలవు. హోస్ట్ నెట్వర్క్ కాన్ఫిగ్లో పేరు ఉన్న VLAN ఇంటర్ఫేస్ సృష్టించి parent ను దాని వైపు చూపితే రెండు చివరలూ అంచనా వేయగలిగేలా ఉంటాయి.
networks కింద ఉన్న కీ Compose పేరు, Linux పరికరం కాదు అని గుర్తుంచుకోండి. హోస్ట్లో office అనే ఇంటర్ఫేస్ వెతకడం విఫలమవుతుంది, ఎందుకంటే కర్నెల్ మాతృ ఇంటర్ఫేస్ మరియు కంటైనర్ వెనుక ఉన్న veth జోడీని మాత్రమే చూస్తుంది.
పైన VPN కోసం స్థలం చేయండి
VPN క్లయింట్ ఈ నెట్వర్క్లు ఉన్న తర్వాత కనెక్ట్ అవుతుంది, కాబట్టి gw_priority తో సంబంధం లేకుండా మరింత నిర్దిష్ట మార్గాలు, విధాన నియమాలు మరియు ఫిల్టర్లను జోడించగలదు. రెండు స్థానిక subnet లకు వ్యతిరేకంగా దూర ప్రీఫిక్స్లను ప్లాన్ చేయండి, నియంత్రణ మార్గానికి అవసరమైన జవాబులతో సహా. దూర ప్రీఫిక్స్ ఆఫీస్ LAN తో అతివ్యాప్తి చెందినప్పుడు, మొత్తం ప్రైవేట్ పరిధిని టన్నెల్ నుండి లాగేయడం బదులు చిరునామా ప్రణాళికను సరిచేయండి.
VPN ప్రారంభమైన తర్వాత మరియు మళ్లీ కనెక్ట్ అయిన తర్వాత చిరునామాలు, మార్గాలు మరియు సేవ మార్గాన్ని మళ్లీ తనిఖీ చేయండి, ఎందుకంటే చేతితో జోడించిన మార్గం మళ్లీ కనెక్ట్ అయినప్పుడే మాయమవుతుంది. మొదటి పరీక్షకు ముందు ఆశించిన పట్టికను రాసి పెట్టుకోండి, తద్వారా తర్వాతి పోలిక జ్ఞాపక వ్యాయామం కాదు, diff అవుతుంది. నెట్వర్క్ యొక్క శాశ్వత యాజమాన్యాన్ని Compose లో ఉంచండి మరియు VPN కాన్ఫిగ్ తన సొంత విధానాన్ని మాత్రమే కలిగి ఉండనివ్వండి.