WireGuard సొరంగం వెలుపల ఒక Linux ప్రక్రియను ఎలా నడపాలి
ఒక ప్రోగ్రామ్కు దాని స్వంత నెట్వర్క్ సందర్భాన్ని ఇవ్వండి, అది పూర్తి సొరంగం ఉన్న WireGuard హోస్ట్ నుండి బయటకు వెళ్తుంది, ఆపై దాన్ని అడ్డుకునే ఫార్వర్డింగ్ మరియు మార్కింగ్ నియమాలను సరిచేయండి.
మార్గాలను సవరించడం ద్వారా ఒక ప్రోగ్రామ్ను పూర్తి సొరంగం ఉన్న WireGuard హోస్ట్ నుండి మినహాయించలేరు. మార్గాలు గమ్యస్థానం ప్రకారం దారిని ఎంచుకుంటాయి, మరియు మీరు మినహాయించాలనుకునేది ఒక ప్రక్రియ, కాబట్టి కెర్నల్కు సరిపోల్చడానికి ఏమీ లేదు. పనిచేసే విధానం ఆ ప్రక్రియకు దాని స్వంత నెట్వర్క్ సందర్భాన్ని ఇవ్వడం: దాని స్వంత ఇంటర్ఫేస్, చిరునామాలు మరియు డిఫాల్ట్ మార్గంతో ఒక నేమ్స్పేస్, veth జంట ద్వారా హోస్ట్కు కలుపబడింది. నేను దీన్ని Ubuntu 24.04 లో wireguard-tools 1.0.20210914 తో నడిపాను, మరియు నేమ్స్పేస్ ఎప్పుడూ సమస్య కాదు — హోస్ట్ యొక్క ఫార్వర్డింగ్ విధానం మరియు సొరంగం యొక్క మార్కింగ్ నియమాలే సమస్య.
మొదట మీకు అవసరమైన సందర్భ రకాన్ని ఎంచుకోండి
ఆచరణలో రెండు రూపాలు కనిపిస్తాయి. హోస్ట్ పూర్తి సొరంగాన్ని నడిపిస్తూ ఒక ప్రోగ్రామ్ ISP మార్గం ద్వారా బయటకు వెళ్లాల్సి ఉంటే, మీరు రెండవ నేమ్స్పేస్ను నిర్మించి, దాన్ని హోస్ట్కు కలిపి, దాని కోసం ట్రాఫిక్ను ఫార్వర్డ్ చేయడానికి మరియు అనువదించడానికి హోస్ట్ను అనుమతిస్తారు. ఒక నేమ్స్పేస్ ఇప్పటికే VPN ఇంటర్ఫేస్ను కలిగి ఉండి, దాని లోపల ప్రారంభించే ఆదేశం మాత్రమే మీకు కావాలంటే, అది సాధారణ ip netns exec కేసు మరియు రూటింగ్ పనిలో ఎక్కువ భాగం ఇప్పటికే పూర్తయింది.
ఏ రూపం కూడా ఒకే ప్రక్రియ ID కి పరిమితమైన నియమాన్ని ఇవ్వదు. Netfilter చిరునామాలు, పోర్టులు, మార్కులు మరియు ఇంటర్ఫేస్లను సరిపోల్చుతుంది; ప్రతి ప్రక్రియకు రూటింగ్ పట్టిక లేదు. మార్కింగ్ ట్రాఫిక్ను దారి మళ్లించగలదు, కానీ మీరు ఇప్పటికే గుర్తించిన ప్యాకెట్లపై మార్కు పెట్టాలి, మరియు అది ఒక పొర కింద ఉన్న అదే సమస్య. నేమ్స్పేస్ ఆ ప్రక్రియ చెట్టు కోసం మొత్తం స్టాక్ను వేరు చేస్తుంది, అందుకే ఇది సాధారణ సమాధానం.
అవసరం నిజంగా సొరంగం నుండి ఏమీ బయటకు వెళ్లకూడదు అని ఉంటే, బదులుగా సొరంగాన్ని ఆపండి. నేమ్స్పేస్ మిశ్రమ సందర్భం కోసం ఉంది: ఒక ప్రోగ్రామ్ బయటకు, మిగతావన్నీ లోపలకు, అదే యంత్రంలో, అదే సమయంలో.
రెండవ సందర్భాన్ని నిర్మించి దాన్ని హోస్ట్కు కలపండి
ఒక ఉదాహరణ అమరిక: హోస్ట్లో డిఫాల్ట్ మార్గాన్ని మోసే WireGuard ఇంటర్ఫేస్ ఉంది, మరియుclearnet అనే నెట్వర్క్ నేమ్స్పేస్ ఉంది, అది veth జంట ద్వారా హోస్ట్కు కలుపబడింది. క్రింది చిరునామాలు ఉదాహరణలు.
ip netns add clearnet
ip link add veth-clear-out type veth peer name veth-clear-in
ip addr add 192.168.100.1/24 dev veth-clear-out
ip link set veth-clear-out up
ip link set veth-clear-in netns clearnet
ip netns exec clearnet ip addr add 192.168.100.2/24 dev veth-clear-in
ip netns exec clearnet ip link set veth-clear-in up
ip netns exec clearnet ip route add default via 192.168.100.1
ఈ నేమ్స్పేస్ ఇప్పుడు హోస్ట్ను చేరగలదు, మరెక్కడికీ కాదు. హోస్ట్ ట్రాఫిక్ను ఫార్వర్డ్ చేయాలి మరియు మూల చిరునామాను తిరిగి రాయాలి, ఎందుకంటే 192.168.100.0/24 ప్రైవేట్ మరియు పైన ఉన్న రౌటర్కు దానిలోకి తిరిగి వెళ్లే మార్గం లేదు:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o <wan-interface> -j MASQUERADE
ముందుకు వెళ్లే ముందు నేమ్స్పేస్ వైపును నిర్ధారించుకోండి.ip netns exec clearnet ip route veth మార్గాన్ని మరియు 192.168.100.1 ద్వారా డిఫాల్ట్ మార్గాన్ని చూపాలి, ఆ చిరునామాకు ping సమాధానం ఇవ్వాలి. హోస్ట్ చిరునామాకు ping విఫలమైతే, చిరునామాలు లేదా లింక్ స్థితి తప్పు మరియు ఏ firewall నియమం సహాయపడదు.
పేర్లు పరిష్కారమైనా ఏమీ తిరిగి రాకపోతే, FORWARD చదవండి
సాంప్రదాయ వైఫల్యం రూటింగ్ బగ్లా కనిపిస్తుంది: నేమ్స్పేస్ పేరును పరిష్కరిస్తుంది, ప్యాకెట్ బయటకు వెళ్తుంది, మరియు సమాధానం ఎప్పటికీ రాదు. FORWARD విధానం DROP ఉన్న హోస్ట్లలో — అనేక పంపిణీలు మరియు చాలా కఠినమైన ఇమేజ్లు అలా చేస్తాయి — ప్యాకెట్ దారిలోనే విసిరివేయబడుతుంది, మరియు ప్రోగ్రామ్ ముద్రించే లోపం ఫిల్టరింగ్ గురించి ఏమీ చెప్పదు.
ఏదైనా జోడించే ముందు గొలుసును చదవండి:
iptables -S FORWARD
nft list chain inet filter forward
తర్వాత ట్రాఫిక్ను రెండు దిశలలో అనుమతించండి, కౌంటర్లతో, నియమం ఎప్పుడైనా సరిపోలిందో లేదో తెలుసుకోవడానికి:
iptables -A FORWARD -i veth-clear-out -o <wan-interface> -j ACCEPT
iptables -A FORWARD -i <wan-interface> -o veth-clear-out -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
watch -n1 'iptables -L FORWARD -v -n'
సున్నా ప్యాకెట్ కౌంటర్ ఉన్న నియమం మార్గంలో లేదు. ఒకటి ఇంటర్ఫేస్ పేర్లు మీరు ఊహించిన దానికి భిన్నంగా ఉన్నాయి, లేదా గొలుసులో మునుపటి నియమం ప్యాకెట్ను మొదట ఆమోదించింది, విసిరింది లేదా తిరిగి పంపింది. క్రమాన్ని సరిచేయండి, నియమం పాఠ్యాన్ని కాదు.
సమాధాన ట్రాఫిక్ అనేది ప్రజలు మరచిపోయే సగం. తిరిగి వచ్చే నియమానికి అదే veth పేరు మరియు కనెక్షన్ స్థితి సరిపోలిక అవసరం, లేదా విధానాన్ని తెరిచి ఉంచితే సాధారణ ఇంటర్ఫేస్ ఆమోదం. బయటకు వెళ్లే నియమాన్ని మాత్రమే జోడించండి, అసలు లక్షణం తిరిగి వస్తుంది, మీ కొత్త నియమం అక్కడ సరిగ్గా కనిపిస్తుంది.
సొరంగం యొక్క మార్కింగ్ నియమాలను కొత్త మార్గానికి దూరంగా ఉంచండి
ఈ దశ పనిచేస్తున్న నేమ్స్పేస్ను లీక్ అయ్యే నేమ్స్పేస్గా మారుస్తుంది. WireGuard సెటప్లు సాధారణంగా firewall మార్క్ విధానాన్ని తమ స్వంత రూటింగ్ నియమాలతో మరియు ప్రత్యేక పట్టికతో ఇన్స్టాల్ చేస్తాయి, కాబట్టి మార్క్ లేని ప్యాకెట్లు ప్రధాన పట్టికలోకి తిరిగి పడతాయి, మార్క్ చేసినవి సొరంగం పట్టికను ఉపయోగిస్తాయి. నేమ్స్పేస్ నుండి ఫార్వర్డ్ చేసిన ట్రాఫిక్ బయటకు వెళ్లేటప్పుడు విధాన రూటింగ్కు వ్యతిరేకంగా మూల్యాంకనం చేయబడుతుంది, మరియు ఆ నియమాలు ఎలా రాయబడ్డాయనే దానిపై ఆధారపడి అది సొరంగం పట్టికలో పడవచ్చు.
రెండు జోడింపులు మార్గాలను వేరు చేస్తాయి. నేమ్స్పేస్ సబ్నెట్ కోసం mangle గొలుసులో ముందుగానే తిరిగి రండి, మరియు ఆ సబ్నెట్ను ప్రధాన పట్టికలో ఉంచే మూల ఆధారిత నియమాన్ని జోడించండి:
iptables -t mangle -I PREROUTING -s 192.168.100.0/24 -j RETURN
ip rule add from 192.168.100.0/24 lookup main priority 100
నా హోస్ట్లో ప్రాధాన్యత 100 సొరంగం నియమాలకు ముందు క్రమబద్ధీకరించబడుతుంది, కాబట్టి ఆ మూలానికి సాధారణ పట్టిక నిర్ణయిస్తుంది. సంఖ్యను గుడ్డిగా కాపీ చేయవద్దు: ఏ ప్రాధాన్యతలనుwg-quick ఇన్స్టాల్ చేస్తుందో అవి వెర్షన్ల మధ్య మరియు IPv4 మరియు IPv6 సెటప్ల మధ్య భిన్నంగా ఉంటాయి, కాబట్టి అమలు చేయండిip rule show మరియు మీ యంత్రంలో సొరంగం నియమాలకు ముందు పడే ప్రాధాన్యతను ఎంచుకోండి.
నియమాల జాబితాను నమ్మడం బదులుమూల-నిర్దిష్ట శోధనతో ధృవీకరించండి:
ip route get 1.1.1.1 from 192.168.100.2
ip netns exec clearnet ip route get 1.1.1.1
మొదటి ఆదేశం WireGuard ఇంటర్ఫేస్ను నివేదిస్తే, కొత్త నియమం ఇంకా సొరంగం విధానానికి ముందు లేదు. అది WAN ఇంటర్ఫేస్ను నివేదిస్తూ రెండవది ఇంకా veth డిఫాల్ట్ను చూపిస్తే, హోస్ట్ మరియు నేమ్స్పేస్ ఏకీభవించవు, మీరు రెండు రూటింగ్ పట్టికలను తిరిగి చదవాలి.
కనెక్షన్ను తెరిచే ప్రక్రియను ప్రారంభించండి
ఆదేశాన్ని ప్రారంభించడం ఒక పంక్తి, కానీ సాకెట్ను నిజంగా సృష్టించే ప్రక్రియను ప్రారంభించండి.ip netns exec clearnet curl -s https://ifconfig.me చిన్న నిజాయితీ పరీక్ష: ఇది నేమ్స్పేస్ ప్రపంచానికి అందించే చిరునామాను చూపిస్తుంది, హోస్ట్ ఉపయోగించే దాన్ని కాదు.
సేవ కోసం, ప్రక్రియ తన మొత్తం జీవితకాలం అందులో ఉండేలా నేమ్స్పేస్ను మార్గం ద్వారా జోడించండి:
[Service]
NetworkNamespacePath=/run/netns/clearnet
గ్రాఫికల్ అప్లికేషన్లు ఒక-పంక్తి విధానం నిశ్శబ్దంగా విఫలమయ్యే చోటు. మెనూ నుండి ప్రారంభించిన బ్రౌజర్ తరచుగా అభ్యర్థనను ఇప్పటికే నేమ్స్పేస్ వెలుపల నడుస్తున్న ఇన్స్టాన్స్కు అప్పగిస్తుంది, కాబట్టి కొత్త విండో కనిపిస్తుంది మరియు ట్రాఫిక్ ఇంకా సొరంగం ద్వారా బయటకు వెళ్తుంది. నిజంగా కొత్త ఇన్స్టాన్స్ సృష్టించబడేలా దానికి ప్రత్యేక ప్రొఫైల్ ఇవ్వండి, తర్వాత ఊహించడం బదులు ప్రక్రియ సందర్భాన్ని తనిఖీ చేయండి:
readlink /proc/$(pgrep -f clearnet-profile | head -1)/ns/net
readlink /run/netns/clearnet
రెండు అవుట్పుట్లు సరిపోలాలి. అదే తనిఖీ ఏదైనా దీర్ఘకాలం నడిచే ప్రోగ్రామ్కు పనిచేస్తుంది, లాంచర్ మీ ఉద్దేశాన్ని నెరవేర్చిందని ఊహించడం బదులు ప్రతి అప్లికేషన్కు ఒకసారి చేయడం విలువైనది.
పేరు పరిష్కారానికి దాని స్వంత నిర్ణయం అవసరం. నేమ్స్పేస్ సృష్టించడం దానికి రిజాల్వర్ కాన్ఫిగరేషన్ ఇవ్వదు; ప్రతి నేమ్స్పేస్ కోసం ఫైళ్లు దీని ద్వారా మద్దతు ఇవ్వబడతాయి/etc/netns/<name>/resolv.conf, అది లేకుండా తప్పుగా చదవడం సులభమైన ప్రవర్తనను వారసత్వంగా పొందుతారు. IPv6 కి కూడా అదే చికిత్స కావాలి: నేమ్స్పేస్కు v6 డిఫాల్ట్ మార్గం లేకపోతే మరియు అప్లికేషన్ v6 ను ఇష్టపడితే, అభ్యర్థనలు వెనక్కి తగ్గే ముందు నిలిచిపోవచ్చు, అది విరిగిన సొరంగంలా కనిపిస్తుంది.
నిష్క్రమణ చిరునామానే కాదు, చట్రాన్ని తనిఖీ చేయండి
పనిచేసే పబ్లిక్ చిరునామా మార్గాన్ని నిరూపిస్తుంది, మొత్తం అవసరాన్ని కాదు. మిగిలినవి ఈ క్రమంలో చేయండి:
ip netns exec clearnet ip route get 1.1.1.1veth డిఫాల్ట్ను చూపిస్తుంది, WireGuard ఇంటర్ఫేస్ను కాదు.- అభ్యర్థన నడుస్తున్నప్పుడు రెండు నియమాల FORWARD కౌంటర్లు పెరుగుతాయి.
- అప్లికేషన్ ప్రక్రియ మీరు ఆశించే నేమ్స్పేస్ inode ను నివేదిస్తుంది.
- పునఃప్రారంభం తర్వాత సేవ ప్రారంభమయ్యే ముందు నేమ్స్పేస్ ఉంటుంది; ముందుగా నడిచే unit విఫలమవుతుంది, లేదా అంతకంటే దారుణంగా, నేమ్స్పేస్ వెలుపల నడుస్తుంది.
తర్వాత సొరంగం పడిపోయినప్పుడు ఏమి జరగాలో నిర్ణయించండి. నేమ్స్పేస్ పని చేస్తూనే ఉంటుంది, అదే ఈ వ్యాయామం యొక్క లక్ష్యం మరియు అదే సమయంలో ప్రమాదం: మినహాయించిన ప్రోగ్రామ్ కనెక్ట్ అయి ఉంటుంది, మిగతావన్నీ ఆగిపోతాయి. దీన్ని విధాన ఎంపికగా నమోదు చేయండి మరియు మినహాయింపు ఏమి కవర్ చేయదో స్పష్టం చేయండి — ఖాతా గుర్తింపు, సేవ్ చేసిన బ్రౌజర్ స్థితి మరియు మీ DNS ప్రదాత అన్నీ నెట్వర్క్ నేమ్స్పేస్ పరిధికి వెలుపల ఉన్నాయి, మరియు మినహాయింపును అనామకత్వంగా పరిగణించడం కాన్ఫిగరేషన్ కంటే ఎక్కువ కాలం జీవించే తప్పు.