VPN నేమ్స్పేస్ లోపలి యాప్ LAN నుండి చేరుకోలేము
నెట్వర్క్ నేమ్స్పేస్ ఒక ప్రోగ్రామ్కు దాని సొంత సొరంగం మరియు దాని సొంత లూప్బ్యాక్ను ఇస్తుంది. హోస్ట్కు బదులు దాని పోర్టును మాత్రమే socat హాప్ లేదా veth జోడితో ప్రచురించండి.
మీ సేవ యంత్రంలో నడుస్తోంది, సొరంగం పైన ఉంది, అయినా మీ డెస్క్పై ఉన్న బ్రౌజర్ ఇంకా సమాధానం కోసం వేచి ఉంది. సాధారణ అర్థంలో ఏదీ పగిలిపోలేదు: అప్లికేషన్ నెట్వర్క్ నేమ్స్పేస్ లోపల వింటోంది, ఆ స్టాక్ LANకు కనిపించదు. దాని లూప్బ్యాక్ నేమ్స్పేస్కు చెందుతుంది, కాబట్టి మరో యంత్రంలోని క్లయింట్కు పోర్టును చేరే చిరునామా ఏదీ లేదు. ఒక ఉద్దేశపూర్వక హాప్, లేదా ఒక veth జోడి, హోస్ట్ మిగిలిన భాగాన్ని కదిలించకుండా దీన్ని సరిచేస్తుంది.
LAN చిరునామాలో ఏదీ సమాధానం ఇవ్వకపోవడానికి కారణం
నేమ్స్పేస్ అనేది పూర్తి నెట్వర్క్ స్టాక్: ఇంటర్ఫేస్లు, మార్గాలు, ఫైర్వాల్ నియమాలు మరియు ప్రైవేట్ లూప్బ్యాక్. ip netns exec ద్వారా ప్రారంభించిన ప్రక్రియ ఆ స్టాక్ను మాత్రమే చూస్తుంది, కాబట్టి అది బంధించే చిరునామా నేమ్స్పేస్ లోపల మాత్రమే పరిష్కరించబడుతుంది. హోస్ట్ సొంత 127.0.0.1 పూర్తిగా వేరే లూప్బ్యాక్.
అందుకే హోస్ట్లో curl విఫలమవుతుంది, నేమ్స్పేస్ లోపల అదే ఆదేశం విజయవంతమవుతుంది. అప్లికేషన్ ఆరోగ్యంగా ఉంది; చిరునామా హోస్ట్ స్టాక్లో లేదు, అంతే.
socat హాప్తో ఒక పోర్టును ప్రచురించండి
socat వినియోగదారు స్థలంలో రెండు స్టాక్లను కలుపుతుంది, ఒకే TCP పోర్టు దాటాల్సినప్పుడు ఇది సరిపోతుంది. హోస్ట్ వైపు LANలో విని, ఆమోదించిన ప్రతి కనెక్షన్కు నేమ్స్పేస్ లోపల రెండో socatను ప్రారంభిస్తుంది, అది యాప్ లూప్బ్యాక్కు కలుపుతుంది. లోపలి ప్రక్రియ స్థానిక క్లయింట్ లాగానే అప్లికేషన్ను చేరుతుంది. నేమ్స్పేస్ రూటింగ్లో ఏదీ మారదు, కాబట్టి యాప్ సొరంగాన్ని తన ఏకైక నిష్క్రమణగా ఉపయోగిస్తూనే ఉంటుంది.
socat TCP-LISTEN:9100,reuseaddr,fork EXEC:'ip netns exec vpn socat STDIO tcp-connect:127.0.0.1:9100',nofork
బయటి ప్రక్రియకు root లేదా నేమ్స్పేస్లోకి ప్రవేశించే సామర్థ్యం కావాలి. VPN పడిపోతే యాప్ తన మార్గాన్ని కోల్పోతుంది, ప్రచురించిన పోర్టు మూసుకున్న స్థితిలో విఫలమవుతుంది, జైలు నుండి మీరు కోరుకునే ప్రవర్తన అదే.
ఒకటి కంటే ఎక్కువ పోర్టులు దాటినప్పుడు veth జోడిని ఉపయోగించండి
అనేక పోర్టులు లేదా ప్రోటోకాల్లు దాటాల్సి వచ్చినప్పుడు, లేదా ఇతర హోస్ట్లు కనెక్షన్లు ప్రారంభించాల్సి వచ్చినప్పుడు veth జోడి సరైన సమాధానం. ఒక చివర హోస్ట్లో ఉంటుంది, మరొకటి నేమ్స్పేస్లోకి వెళ్తుంది, చిన్న /30 రెండు వైపులకు స్థిరమైన చిరునామా ఇస్తుంది. తర్వాత హోస్ట్ మార్గం నేమ్స్పేస్ చిరునామాను జోడి ద్వారా పంపుతుంది.
ip link add veth0 type veth peer name veth1
ip link set veth1 netns vpn
ip addr add 10.77.0.1/30 dev veth0
ip link set veth0 up
ip netns exec vpn ip addr add 10.77.0.2/30 dev veth1
ip netns exec vpn ip link set veth1 up
జైలును పగలగొట్టాలని అనుకోకపోతే హోస్ట్ ద్వారా డిఫాల్ట్ మార్గాన్ని జోడించవద్దు. సొరంగమే నిష్క్రమణగా ఉండాలి, కాబట్టి జోడి ద్వారా ప్రచురించిన సేవా చిరునామా మాత్రమే చేరుకోగలము. నేమ్స్పేస్కు దాని సొంత రిజాల్వర్ ఫైల్ను కూడా ఇవ్వండి, ఎందుకంటే ip netns exec /etc/netns/vpn/resolv.conf చదువుతుంది, అది లేకుండా జైలు లోపల పేర్ల పరిష్కారం ఖాళీగా ఉంటుంది.
హోస్ట్ నుండి కాదు, మరో యంత్రం నుండి పరీక్షించండి
పరీక్షను రెండో యంత్రం నుండి నడపండి, ఎందుకంటే హోస్ట్ LAN గురించి ఏమీ చెప్పని మార్గాల ద్వారా స్థానిక శ్రోతను చేరుకోగలదు. మొదట యాప్ నేమ్స్పేస్ లోపల నిజంగా దేనికి బంధించబడిందో తనిఖీ చేయండి, తర్వాత బయటి నుండి ప్రచురిత చిరునామాకు కనెక్ట్ అవ్వండి. అక్కడ ప్రతి చిరునామాకు బంధించినా జైలు విస్తరించదు, ఎందుకంటే వైల్డ్కార్డ్ ఇంకా నేమ్స్పేస్కే చెందుతుంది మరియు LAN దాన్ని చూడలేదు.
ip netns exec vpn ss -lntp
హోస్ట్ నుండి కనెక్షన్ పనిచేసి LAN నుండి పనిచేయకపోతే, లేని భాగం హాప్ లేదా మార్గం, బంధన చిరునామా కాదు. నడుస్తున్న tun పరికరాన్ని లోపలికి తరలించడం బదులు నేమ్స్పేస్ లోపల OpenVPN ను ప్రారంభించండి, ఎందుకంటే ఇంటర్ఫేస్ను తరలించడం దాన్ని ఆపేస్తుంది మరియు తర్వాత బయటి నుండి సరిచేయలేని మార్గాలను తొలగించవచ్చు. పునరుద్ధరణ ఆదేశాలను జైలు లోపల కాదు, కన్సోల్లో ఉంచండి.