Docker VPN కంటైనర్ ద్వారా హోస్ట్ ట్రాఫిక్ను ఎలా రూట్ చేయాలి
VPN కంటైనర్ నెట్వర్క్ నేమ్స్పేస్, ప్రాక్సీ కాదు। షేర్డ్ netns, నిజమైన SOCKS శ్రోత లేదా రూట్ చేసిన గేట్వే ఎంచుకుని, తర్వాత నిష్క్రమణ మార్గాన్ని ధృవీకరించండి।
మీ టన్నెల్ కంటైనర్ పనిచేస్తోంది, docker compose exec vpn curl -s https://ifconfig.me ప్రొవైడర్ చిరునామాతో సమాధానం ఇస్తోంది, అయినా మీ డెస్క్టాప్ బ్రౌజర్ ఇప్పటికీ మీ ISP ద్వారా బయటకు వెళ్తోంది। ఆ అంతరం ఆశించినదే। VPN క్లయింట్ను నడిపే కంటైనర్ నెట్వర్క్ నేమ్స్పేస్, మార్గాలు మరియు టన్నెల్ ఇంటర్ఫేస్ను ఉంచుతుంది, HTTP లేదా SOCKS మాట్లాడే ఏదీ ఉంచదు; దానిపై పోర్ట్ ప్రచురించడం ఎప్పుడూ లేని శ్రోతను సృష్టించలేదు।
క్లయింట్ ఎక్కడ నడుస్తుందో దానిపై డిజైన్ ఆధారపడుతుంది। పక్క కంటైనర్ టన్నెల్ నేమ్స్పేస్లోకి వెళ్లగలదు, డెస్క్టాప్ అప్లికేషన్ వెళ్లలేదు, రౌటర్కు ప్రాక్సీ ఫీల్డ్ కాదు, మార్గాలు కావాలి। మ్యాపింగ్ తప్పైతే లక్షణం అదే: కనెక్షన్ నిరాకరించబడింది, లేదా నిశ్శబ్దంగా పాత మార్గాన్ని తీసుకునే ట్రాఫిక్।
క్లయింట్ నడిచే ప్రదేశానికి అమరికను సరిపోల్చండి
Compose సవరించే ముందు ఒక ప్రశ్న అడగండి: క్లయింట్ను VPN కంటైనర్ నెట్వర్క్ నేమ్స్పేస్ లోపల ప్రారంభించవచ్చా? ఇప్పటికే Linux కంటైనర్గా నడుస్తున్న ఏదైనా చేయగలదు। మీ బల్లపై ఉన్న బ్రౌజర్, IDE లేదా CLI చేయలేదు, ఎందుకంటే దాని ప్రాక్సీ సెట్టింగ్ ప్రోటోకాల్ సేవను ఆశిస్తుంది, నేమ్స్పేస్ను కాదు।
| Client | Arrangement | What must already exist |
|---|---|---|
| Another Compose service | Shares the vpn namespace via network_mode: service:vpn | A working tunnel and correct start order |
| Host browser, IDE or CLI | Proxy listener inside the namespace, published to host loopback | A configured SOCKS or HTTP proxy and its access rules |
| Router, VM or phone | The container as a layer-3 gateway | Forwarding, NAT and a return route |
ఈ మూడూ కలవవు। కంటైనర్ బ్రిడ్జ్ చిరునామా వైపు చూపిన HTTP ప్రాక్సీ ఫీల్డ్ అక్కడ ప్రాక్సీ వినకపోతే ఏదాన్నీ చేరదు, ప్రాక్సీ శ్రోత రౌటర్ ట్రాఫిక్ను రూట్ చేయదు। మొదట నిర్ణయించి, తర్వాత సరిపోయే విభాగాన్ని అనుసరించండి।
టన్నెల్ నేమ్స్పేస్ను పక్క కంటైనర్తో పంచుకోండి
ప్రాక్సీ ప్రోటోకాల్ లేనందున ఇది చవకైన ఎంపిక। అప్లికేషన్ vpn సేవ నేమ్స్పేస్లో చేరి దాని ఇంటర్ఫేస్లు, మార్గాలు మరియు పోర్ట్ స్పేస్ను వారసత్వంగా పొందుతుంది:
services:
vpn:
image: your-vpn-client
cap_add:
- NET_ADMIN
healthcheck:
test: ["CMD-SHELL", "ip link show tun0 >/dev/null"]
interval: 10s
retries: 5
app:
image: your-app
network_mode: service:vpn
depends_on:
vpn:
condition: service_healthyనేమ్స్పేస్ మరో సేవకు చెందినందున మూడు పరిమితులు వస్తాయి। అప్లికేషన్కు దాని స్వంత networks కీ లభించదు, ఎందుకంటే కలవడానికి నేమ్స్పేస్ లేదు। పోర్ట్ ప్రచురణ vpn వద్ద ఉంది, ఎందుకంటే నేమ్స్పేస్ అక్కడే నివసిస్తుంది। మరియు vpn మళ్లీ సృష్టిస్తే అప్లికేషన్ చేరిన నేమ్స్పేస్ నాశనమవుతుంది, కాబట్టి docker compose up -d --force-recreate vpn appను కూడా మళ్లీ సృష్టించమని మిమ్మల్ని అనుమతిస్తుంది; సాధారణ పునఃప్రారంభం ఎప్పుడూ సరిపోదు। Compose సేవ సూచన ఈ అమరికను మరియు దాని పోర్ట్ ప్రచురణ పరిమితిని కవర్ చేస్తుంది।
రిజాల్వర్ తో పాటు వస్తుందని భావించకండి। /etc/resolv.conf ప్రతి కంటైనర్కు ఫైల్, నెట్వర్క్ నేమ్స్పేస్లో భాగం కాదు, కాబట్టి అప్లికేషన్ ప్యాకెట్లు టన్నెల్ ద్వారా బయటకు వెళ్తున్నప్పుడు కూడా అది హోస్ట్ రిజాల్వర్ను అడగగలదు। దాన్ని కంటైనర్ లోపలి నుంచి చదివి, ప్రైవేట్ పేర్లు టన్నెల్ ద్వారా పరిష్కరించాల్సి వచ్చినప్పుడు అప్లికేషన్పై dns: సెట్ చేయండి।
docker compose exec app ip route
docker compose exec app cat /etc/resolv.conf
docker compose exec app curl -s https://ifconfig.meమార్గాల జాబితాలో టన్నెల్ ఇంటర్ఫేస్ ఉండి, చిరునామా ప్రొవైడర్ది అయితే, అప్లికేషన్ టన్నెల్ లోపల ఉంది। ఇంటర్ఫేస్ లేకపోతే, vpn కు టన్నెల్ రాకముందే app ప్రారంభమైంది, కాబట్టి vpn ఆరోగ్యంగా ఉందని నివేదించిన తర్వాత appను మళ్లీ సృష్టించండి।
హోస్ట్ క్లయింట్ల కోసం నేమ్స్పేస్లో నిజమైన ప్రాక్సీ శ్రోతను ఉంచండి
డెస్క్టాప్ బ్రౌజర్ నేమ్స్పేస్లో చేరలేదు, కాబట్టి టన్నెల్ను సేవగా బహిర్గతం చేయాలి। vpn నేమ్స్పేస్ లోపల నిజమైన SOCKS లేదా HTTP ప్రాక్సీని నడిపి దాని పోర్ట్ను మాత్రమే ప్రచురించండి:
services:
vpn:
ports:
- "127.0.0.1:1080:1080"
proxy:
image: your-proxy
network_mode: service:vpn
command: ["--socks", "0.0.0.0:1080"]హోస్ట్ వైపు చిరునామా ఆ మ్యాపింగ్లో ముఖ్యమైన సగం। ఎడమవైపు 127.0.0.1:1080 శ్రోతను మీ LAN నుంచి బయట ఉంచుతుంది; బేరు "1080:1080" మీ మెషీన్ను చేరగల ప్రతి పరికరానికి తెరిచిన ప్రాక్సీని ప్రచురిస్తుంది।
కంటైనర్ వైపు దాని స్వంత ఉచ్చు ఉంది। ప్రచురించిన పోర్ట్లు కంటైనర్ బ్రిడ్జ్ చిరునామాకు అందించబడతాయి, దాని loopback కు కాదు, కాబట్టి నేమ్స్పేస్ లోపల --socks 127.0.0.1:1080 తో ప్రారంభించిన ప్రాక్సీ పక్క కంటైనర్ల కనెక్షన్లను అంగీకరించి ప్రచురించిన పోర్ట్ ద్వారా వచ్చేవన్నీ నిరాకరిస్తుంది। దాన్ని 0.0.0.0 కు కట్టి, వేరుచేయడానికి హోస్ట్ వైపు loopback బైండ్పై ఆధారపడండి। అదే నియమం ప్రాక్సీ కాన్ఫిగ్ ఫైల్లోని వినే చిరునామాకూ వర్తిస్తుంది।
తర్వాత పేర్లు ఎక్కడ పరిష్కరించబడతాయో నిర్ణయించండి। curlలో --socks5 హోస్ట్నామ్ను స్థానికంగా పరిష్కరిస్తుంది, --socks5-hostname పేరును ప్రాక్సీకి పంపుతుంది; బ్రౌజర్లు అదే స్విచ్ను మరో లేబుల్ కింద చూపుతాయి। స్థానిక పరిష్కారం పేజీ టన్నెల్ ద్వారా లోడ్ అయినా క్వెరీని లీక్ చేస్తుంది।
తిరిగి వచ్చే మార్గం ఉంటేనే కంటైనర్ను గేట్వేగా పరిగణించండి
రౌటర్లు, VMలు మరియు ఫోన్లు HTTP ప్రాక్సీ ఫీల్డ్ను ఉపయోగించవు, కొన్ని అప్లికేషన్లు ప్రాక్సీ వేరియబుల్స్ను పూర్తిగా విస్మరిస్తాయి। వాటి ట్రాఫిక్ను రూట్ చేయడం అంటే లేయర్ 3: కంటైనర్ ప్యాకెట్లను ముందుకు పంపి టన్నెల్ ఇంటర్ఫేస్పై చిరునామాలను అనువదిస్తుంది।
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADEరెండు విషయాలు సులభంగా తప్పిపోతాయి। క్లయింట్కు దాని డిఫాల్ట్ గేట్వేను ఈ హోస్ట్ వైపు చూపే మార్గం కావాలి, సమాధానాలు తిరిగి వచ్చే దారిని కనుగొనాలి, ఒకటి పై రౌటర్పై స్థిర మార్గం లేదా క్లయింట్ల వైపు ఉన్న ఇంటర్ఫేస్పై NAT। వాటిలో ఒకటి లేకపోతే టన్నెల్ అభ్యర్థనను బయటకు తీసుకెళ్తుంది, సమాధానం మాయమవుతుంది।
దాని ప్రభావ పరిధి కూడా అతి పెద్దది। మొత్తం LANకు గేట్వేగా ఉన్న హోస్ట్ తప్పుగా కాన్ఫిగర్ చేసిన ప్రతి క్లయింట్ను మీ VPN ఖాతా ద్వారా పంపుతుంది, టన్నెల్ పడితే kill switch ప్రకారం LAN చీకటవుతుంది లేదా ISPకి తిరిగి వెళ్తుంది।
నిష్క్రమణ మార్గాన్ని ధృవీకరించి, తర్వాత క్రమంగా వెనక్కి తిప్పండి
ఈ క్రమంలో తనిఖీ చేసి మొదటి వైఫల్యం వద్ద ఆగండి: నేమ్స్పేస్ లోపల నిష్క్రమణ చిరునామా, హోస్ట్ నుంచి ప్రాక్సీ ద్వారా నిష్క్రమణ చిరునామా, తర్వాత ప్రైవేట్ హోస్ట్ కోసం పేరు పరిష్కారం।
docker compose exec vpn curl -s https://ifconfig.me
curl -s -x socks5h://127.0.0.1:1080 https://ifconfig.me
curl -s -x socks5h://127.0.0.1:1080 http://internal.example/healthమొదటి రెండు చిరునామాలు ప్రొవైడర్తో సరిపోలాలి, మూడోది పేరు లోపంతో విఫలమవడం బదులు ప్రాక్సీ ద్వారా పరిష్కరించబడాలి। మొదటి పంక్తి సరిపోలి రెండోది విఫలమైతే శ్రోత లేదా ప్రచురించిన పోర్ట్ తప్పు, టన్నెల్ కాదు।
వెనక్కి తిప్పడం అమరికకు వ్యతిరేకం। షెల్ ప్రొఫైల్ మరియు ఏదైనా systemd యూనిట్ నుంచి ప్రాక్సీ పర్యావరణ వేరియబుల్స్ను తీసివేసి, తర్వాత స్టాక్ను దించండి, షేర్డ్ నేమ్స్పేస్ దాని యజమానితో మాయమవుతుంది। ప్రాక్సీ సేవను తొలగించే ముందు ప్రచురించిన పోర్ట్ను తొలగించండి, లేకపోతే హోస్ట్లో ఎవరూ చదవని loopback శ్రోత మిగిలిపోతుంది।
ముందుకు వెళ్లే ముందు నాలుగు విషయాలు నిర్ధారించండి: మీకు ముఖ్యమైన క్లయింట్ నిజంగా టన్నెల్ను చేరుతుంది, పోర్ట్లను నేమ్స్పేస్ యజమాని మాత్రమే ప్రచురిస్తాడు, ప్రైవేట్ పేర్లు మీరు ఉద్దేశించిన చోట పరిష్కరించబడతాయి, loopback కాని హోస్ట్ చిరునామాపై ఏదీ వినదు। వాటిలో ప్రతి ఒక్కటి ఉత్పత్తిలో నిశ్శబ్దంగా విఫలమవుతుంది, ప్రతి ఒక్కటి పైన ఉన్న ఒక-పంక్తి తనిఖీ।