VPN క్లయింట్ కనెక్ట్ అవుతుంది, బ్రౌజర్ పని చేస్తుంది, మరియు మీకు నిజంగా ముఖ్యమైన ఒకే కమాండ్ ఇప్పటికీ మీ ఇంటి కనెక్షన్ ద్వారానే బయటకు వెళ్తుంది. లేదా దీనికి విరుద్ధంగా జరుగుతుంది: టన్నెల్ డిఫాల్ట్ మార్గాన్ని తీసుకుంటుంది, లోకల్ ఫైల్ సర్వర్ డెస్క్టాప్ నుండి మాయమవుతుంది. అంతర్గత ఆర్టిఫాక్ట్ మిర్రర్ను చేరుకోవాల్సిన బిల్డ్ ఏజెంట్తో నేను ఇది ఎదుర్కొన్నాను, మిగిలిన హోస్ట్ ఆఫీస్ LANలో ఉంది, క్లయింట్ సరిగ్గా రెండు ఎంపికలను మాత్రమే ఇచ్చింది, మొత్తం ట్రాఫిక్ లేదా ఏమీ లేదు. రెండు వైపులా అభ్యర్థన ఒకటే, ఈ యాప్ మాత్రమే, మొత్తం మెషీన్ కాదు, చాలా క్లయింట్లలో దీనికి చెక్బాక్స్ లేదు, ఎందుకంటే రూటింగ్ పట్టికకు యాప్ అంటే ఏమిటో ఎప్పుడూ తెలియదు.

రూటింగ్ పట్టిక మీ యాప్ను ఎందుకు చూడలేదు

ఒక ప్రాసెస్ ప్యాకెట్ను పంపినప్పుడు, స్టాక్ రూటింగ్ పట్టికలో గమ్య చిరునామాను వెతుకుతుంది. ఎక్జిక్యూటబుల్ పేరు లేదా పోర్టు ఆ శోధనలోకి రావు. డొమైన్ పేర్లు కూడా అదే కారణంతో విఫలమవుతాయి: టన్నెల్ ట్రాఫిక్ను ఒక చిరునామాకు తీసుకువెళ్తుంది, పేరు చిరునామాగా పరిష్కరించబడినప్పుడు, కెర్నల్ వద్ద మిగిలిన ఏకైక లివర్ రూటింగ్ మాత్రమే. అందుకే "ఈ సైట్కు మాత్రమే VPN" అంటే చివరికి ప్రాక్సీ, "ఈ యాప్కు మాత్రమే VPN" అంటే కొన్ని మెకానిజమ్లలో ఒకటి.

మెకానిజంఏది ఎంచుకుంటుందిఏమి కవర్ చేస్తుందిటన్నెల్ పడిపోయినప్పుడు
సాకెట్ బైండింగ్మూల చిరునామామీరు నియంత్రించే క్లయింట్కనెక్షన్లు విఫలమవుతాయి
UID నియమం (Linux)యజమాని వినియోగదారుఒక ఖాతా యొక్క ప్రతి ప్రాసెస్కనెక్షన్లు విఫలమవుతాయి
ఫైర్వాల్ ప్రొఫైల్ (Windows)అడాప్టర్ ప్రొఫైల్ఒక యాప్మూసివేసిన స్థితిలో విఫలమవుతుంది
నెట్వర్క్ పేరుస్థలంపేరుస్థల సభ్యత్వంలోపల ప్రారంభించిన ప్రతిదీకనెక్షన్లు విఫలమవుతాయి
SOCKS హాప్యాప్ ప్రాక్సీ సెట్టింగ్ఒక యాప్ లేదా ఒక బ్రౌజర్ ప్రొఫైల్కనెక్షన్లు విఫలమవుతాయి

ఇవి ఏవీ ప్రాసెస్కు మార్గం కావు. ఒక్కొక్కటి నిర్ణయాన్ని యాప్ను, వినియోగదారుని లేదా యాప్ స్వంత కాన్ఫిగరేషన్ను చూడగల పొరకు మారుస్తుంది.

ఒకే గమ్యం ఇప్పటికీ మార్గం, యాప్ నియమం కాదు. macOSలో సాధారణ పద్ధతి "VPN ద్వారా మొత్తం ట్రాఫిక్ పంపు" ఎంపికను తీసివేసి హోస్ట్ మార్గాన్ని జోడించడం: sudo route add -host internal-tuner.example -interface ppp0, తర్వాత దీనితో తొలగించబడుతుంది sudo route delete -host internal-tuner.example -interface ppp0. ముందుగా ifconfig నుండి ఇంటర్ఫేస్ పేరును చదవండి, ఎందుకంటే ppp0 కేవలం ఉదాహరణ. హోస్ట్ మార్గంలో వైల్డ్కార్డ్లు పని చేయవు, కాబట్టి అనేక పేర్లతో మాట్లాడే సేవకు ప్రతి పేరుకు ఒక ఎంట్రీ అవసరం, ఈ నియమం మెషీన్లోని ప్రతి ప్రాసెస్ను కవర్ చేస్తుంది, మీరు ఊహించిన దాన్ని మాత్రమే కాదు.

సాకెట్ను టన్నెల్ చిరునామాకు బైండ్ చేయండి

క్లయింట్ను మీరు నియంత్రించినప్పుడు, బైండింగ్ చవకైన ఎంపిక. టన్నెల్ లోకల్ చిరునామాకు బైండ్ చేసిన సాకెట్, గమ్యానికి మార్గం అక్కడ ఉన్నంత వరకు ఆ ఇంటర్ఫేస్ ద్వారా బయటకు వెళ్తుంది, మెషీన్లోని మిగతావన్నీ తమ సాధారణ మార్గాన్ని నిలుపుకుంటాయి. సూక్ష్మం ఏమిటంటే, బైండింగ్ మూల చిరునామాను ఎంచుకుంటుంది, రూటింగ్ పట్టిక ఇప్పటికీ నిష్క్రమణను ఎంచుకుంటుంది. బైండింగ్ మాత్రమే మార్గం లేని ట్రాఫిక్ను టన్నెల్లోకి కదిలించదు, "బైండ్ చేశాను, ఇప్పటికీ తప్పు మార్గంలో వెళ్తోంది" అనే చాలా నివేదికల వెనుక ఉన్న తప్పు ఇదే.

import socket
s = socket.socket()
s.bind(("10.8.0.2", 0))
s.connect(("build.internal.example", 443))

ఉన్నత స్థాయి సాధనాలు అదే ఆలోచనను చూపుతాయి: curl --interface 10.8.0.2, CURLOPT_INTERFACE PHPలో మరియు source_address అనే ఆర్గ్యుమెంట్ Python HTTP క్లయింట్లలో. చిరునామా టన్నెల్కు చెందాలి, ఇక్కడ టైపింగ్ తప్పు సాధారణ కనెక్షన్ లోపంగా విఫలమవుతుంది, రూటింగ్ ఫిర్యాదుగా కాదు. చిరునామాకు బదులు పరికరం పేరుకు బైండ్ చేయడం Linux ప్రత్యేకత, అది Windows లేదా macOSకు బదిలీ కాదు, అందుకే పోర్టబుల్ స్క్రిప్ట్లు చిరునామాను పంపుతాయి.

Linux: ప్రోగ్రామ్ పేరు కాదు, యజమానిని సరిపోల్చండి

కెర్నల్ సాకెట్ యజమాని వినియోగదారుని సరిపోల్చగలదు, కాబట్టి ప్రత్యేక ఖాతా ఎంపికగా మారుతుంది. టన్నెల్ను దాని స్వంత రూటింగ్ పట్టికలో ఉంచి ఆ ఖాతా ట్రాఫిక్ను మాత్రమే అక్కడికి పంపండి:

ip rule add uidrange 1001-1001 lookup 100
ip route add default dev tun0 table 100

టన్నెల్ ఇప్పటికే డిఫాల్ట్ మార్గం కాకపోతే మాత్రమే ఇది పని చేస్తుంది. క్లయింట్ను --route-nopull తో ప్రారంభించండి, లేదా నెట్టబడిన రీడైరెక్ట్ను --pull-filter ignore "redirect-gateway" తో OpenVPN 2.4 మరియు తర్వాత వడపోత చేయండి, ఆపై పట్టిక ఎంట్రీని మీరే జోడించండి. లేకపోతే రెండు డిఫాల్ట్లు ఉంటాయి, తక్కువ ప్రాధాన్యత ఉన్నది గెలుస్తుంది. దీని ఉద్దేశపూర్వక వెర్షన్ డిఫాల్ట్ మార్గాన్ని టన్నెల్ గేట్వేకు తిప్పడం, లేదా డిస్కనెక్ట్ స్క్రిప్ట్ నుండి చేయడం: టన్నెల్ పడిపోయినప్పుడు ట్రాఫిక్ను ఇంటర్నెట్ నుండి దూరంగా ఉంచుతుంది, కానీ అది కిల్ స్విచ్, ఎంపిక కాదు, ఎవరైనా తీసివేసే వరకు ఉంటుంది.

బలమైన వెర్షన్ నెట్వర్క్ పేరుస్థలం. దాన్ని సృష్టించి, క్లయింట్ను లోపల నడపండి, యాప్ను ip netns exec తో ప్రారంభించండి. పేరుస్థలం వెలుపల ఏదీ టన్నెల్ ఇంటర్ఫేస్ను చూడదు, కాబట్టి యాప్ ప్రమాదవశాత్తు హోస్ట్ మార్గానికి తిరిగి వెళ్లలేదు. ఖర్చు నిజం: పేరుస్థలానికి భౌతిక నెట్వర్క్ను చేరుకోవడానికి veth జంట మరియు దాని స్వంత రిజాల్వర్ ఫైల్ అవసరం, ఎందుకంటే మౌంట్ పేరుస్థలం హోస్ట్ రిజల్యూషన్ సెట్టింగ్లను పంచుకోదు.

రెండు వైఫల్య విధానాలు చాలా లీక్లను వివరిస్తాయి. పేరు రిజల్యూషన్ ఇప్పటికీ హోస్ట్ రిజాల్వర్లో జరుగుతుంది, కాబట్టి TCP కనెక్షన్ లోపలికి వెళ్లినా క్వెరీ టన్నెల్ వెలుపలికి వెళ్తుంది. IPv6కు దాని స్వంత ip -6 rule అవసరం, ఎందుకంటే v4 నియమం దాన్ని కవర్ చేయదు.

Windows మరియు macOS: ఫైర్వాల్ను పరిమితం చేయండి లేదా ప్రాక్సీని అప్పగించండి

Windowsకు కూడా యాప్కు మార్గ ఎంపిక లేదు, కానీ దాని ఫైర్వాల్ నియమాలను ప్రొఫైల్కు పరిమితం చేయవచ్చు, VPN అడాప్టర్ను పబ్లిక్ అని వర్గీకరించవచ్చు, ఇంటి LAN ప్రైవేట్గానే ఉంటుంది. ప్రైవేట్ మరియు డొమైన్ ప్రొఫైల్లలో యాప్కు అవుట్బౌండ్ బ్లాక్ నియమాలను సృష్టించి, పబ్లిక్ను తెరిచి ఉంచండి, యాప్ టన్నెల్ ద్వారా మాత్రమే నెట్వర్క్ను చేరుకోగలదు. ముందుగా కనెక్షన్ నెట్వర్క్ వర్గాన్ని సెట్ చేయండి, ఆపై ఫైర్వాల్ మానిటర్ పేన్లో నియమం సరిపోలిందని నిర్ధారించండి. ఇది బ్లాక్, మార్గం కాదు: టన్నెల్ పడిపోయినప్పుడు మూసివేసిన స్థితిలో విఫలమవుతుంది, ఫైర్వాల్ను పట్టించుకోని యాప్ను ఆపలేదు.

macOS అదే తర్కాన్ని వేరే సాధనాలతో అనుసరిస్తుంది. SSH ద్వారా చేరగల SOCKS లిజనర్ అతి తక్కువ జోక్యం ఎంపిక, ఎందుకంటే ssh -D 1080 user@host ఒక లోకల్ పోర్టును సృష్టిస్తుంది, దాన్ని ఉపయోగించడానికి కాన్ఫిగర్ చేసిన యాప్లు మాత్రమే ఆ మార్గాన్ని తీసుకుంటాయి. ఒక pf నియమం యాప్ను వినియోగదారు లేదా సమూహం ద్వారా బ్లాక్ చేయగలదు, కానీ ఆ యాప్కు మాత్రమే టన్నెల్ను ఎంచుకోలేదు. Tunnelblick డొమైన్ ద్వారా ఫిల్టర్ చేయలేదు, ఎందుకంటే మార్గాలు చిరునామాలతో పని చేస్తాయి; OpenConnect వినియోగదారులు vpn-slice వైపు చూస్తారు, సర్వర్ చాలా విశాలమైన ప్రిఫిక్స్ జాబితాను నెట్టినప్పుడు.

రెండు పరిష్కారాలు ప్లాట్ఫారమ్ సాధనాలు మిస్ అయ్యేవాటిని కవర్ చేస్తాయి. డొమైన్ వారీగా ప్రాక్సీని మార్చే బ్రౌజర్ పొడిగింపులు "ఈ సైట్ మాత్రమే"కు ఆచరణాత్మక సమాధానం, ఎందుకంటే అవి పేర్లు ఇంకా ఉన్న యాప్ పొరలో పని చేస్తాయి; ఒక బ్రౌజర్ను మాత్రమే కవర్ చేస్తాయి, మరేదీ కాదు. మొరటు మార్గం విక్రేత క్లయింట్ను వర్చువల్ మెషీన్లో నడపడం, అతిథి మార్గ మార్పును కలిగి ఉంటుంది, హోస్ట్ తన మార్గాన్ని నిలుపుకుంటుంది, రెండు నెట్వర్క్ స్టాక్లను నిర్వహించే ఖర్చుతో.

బైండ్ ఎంపిక లేని సాధనాలకు SOCKS హాప్

చాలా యాప్లను HTTP లేదా SOCKS ప్రాక్సీకి తిప్పవచ్చు, ఇంటర్ఫేస్ల గురించి ఏమీ తెలియకపోయినా. SSH క్లయింట్ సర్వర్ వైపు ఎలాంటి మార్పు లేకుండా ఒకదాన్ని అందిస్తుంది:

ssh -N -D 127.0.0.1:9999 [email protected]

ఆ పోర్టును ఉపయోగించడానికి కాన్ఫిగర్ చేసిన ప్రతిదీ బాస్టియన్ వద్ద బయటకు వెళ్తుంది, మిగిలిన డెస్క్టాప్ తన సాధారణ కనెక్షన్ను నిలుపుకుంటుంది. టన్నెల్ చిరునామాకు బైండ్ చేసిన లోకల్ 3proxy ఇన్స్టాన్స్ SSH లేకుండా ఒక పోర్టుకు ఇదే చేస్తుంది, stunnel TLSతో చుట్టబడిన ఒకే పోర్టును కవర్ చేస్తుంది. పరిమితులు ఆచరణాత్మకం: ప్రాక్సీ దాన్ని ఉపయోగించడం తెలిసిన ప్రోటోకాల్లను మాత్రమే మోస్తుంది, UDPకు SOCKS5 UDP అసోసియేషన్ అవసరం, చాలా క్లయింట్ల "SOCKS5" సెట్టింగ్ దాన్ని ఎనేబుల్ చేయదు, DNS ప్రాక్సీ ద్వారా పరిష్కరించబడాలి (socks5h curlలో) లేకపోతే పేరు లోకల్ రిజాల్వర్కు లీక్ అవుతుంది.

మరో మెషీన్కు అవసరం లేకపోతే లిజనర్ను లూప్బ్యాక్లో ఉంచండి.

మార్గాన్ని స్టేటస్ సందేశంతో కాదు, క్యాప్చర్తో ధృవీకరించండి

యాప్ స్టేటస్ విండోలు సెట్టింగ్ను వివరిస్తాయి, ప్యాకెట్ను కాదు. రెండు ఇంటర్ఫేస్లపై ట్రాఫిక్ను క్యాప్చర్ చేసి పోల్చండి:

tcpdump -i any -n port 443
ss -tnp | grep 443

కనెక్షన్ భౌతిక ఇంటర్ఫేస్పై కనిపించి, టన్నెల్పై సరిపోలే ఎంట్రీ లేకపోతే, క్లయింట్ ఏమి నివేదించినా ఎంపిక అమలులో లేదు. IPv6 మరియు రిజాల్వర్ను విడిగా తనిఖీ చేయండి, సహాయక ప్రాసెస్ లేదా వారసత్వ వ్యవస్థ ప్రాక్సీ వంటి రెండవ మార్గం కోసం చూడండి.

ఆపై అవసరానికి సరిపోయే సరిహద్దును ఎంచుకోండి: ఒక సైట్కు ప్రాక్సీ సరిపోతుంది, ఒక ఖాతాకు UID నియమం సరిపోతుంది, కనెక్షన్ మూసివేసిన స్థితిలో విఫలం కావాల్సినప్పుడు ఫైర్వాల్ ప్రొఫైల్ సరిపోతుంది, పేరుస్థలం మాత్రమే టన్నెల్ను దాని వెలుపల ఉన్న ప్రతిదాని నుండి దాచే ఏకైక ఎంపిక.

సంబంధిత వ్యాసాలు