UID నియమాలతో ఒక Linux యాప్ను VPNకు కట్టడం
UID నియమం స్థానిక సాకెట్లను మాత్రమే చూస్తుంది, మరియు సాధారణ loopback మినహాయింపు సొరంగాన్ని చంపుతుంది. మొదట ఖాతాకు మార్గం ఇవ్వండి, తర్వాత ప్రతి దశను ఫిల్టర్ చేసి ధృవీకరించండి.
Linux లో ఒక ప్రోగ్రామ్ను VPNకు కట్టడం ప్రధానంగా రూటింగ్ సమస్య, మరియు ఫైర్వాల్ నియమం మార్గం ఎంపికైన తర్వాత ఏమి జరుగుతుందో మాత్రమే నిర్ణయిస్తుంది. సొరంగం డిఫాల్ట్ మార్గాన్ని పొందకముందే మీరు OUTPUT లో ప్రోగ్రామ్ UIDని సరిపోల్చినట్లయితే, నియమం మీరు రక్షించాలనుకున్న ఆ ట్రాఫిక్నే విసిరేస్తుంది. అదే నియమం ప్రోగ్రామ్ DNS ప్రశ్నలకు సమాధానమిచ్చే resolver ప్రక్రియను కూడా చూడదు. క్రమాన్ని సరిచేయండి, అప్పుడు అధికారాలు లేని ఒక ఖాతా నమ్మదగిన విభజిత సొరంగ ఎంపికకర్త అవుతుంది.
తీర్పు ముందు ఖాతాకు మార్గం ఇవ్వండి
యజమాని సరిపోలిక ఒక ప్రశ్నకు సమాధానమిస్తుంది: ఈ UIDకి చెందిన స్థానిక సాకెట్ ప్యాకెట్ను నిర్మించిందా? ఇది ఇంటర్ఫేస్ను ఎంచుకోదు, మరియు ప్రధాన పట్టిక ఇప్పటికే భౌతిక NIC ద్వారా పంపుతున్న ట్రాఫిక్ను కదిలించలేదు. అందుకే సరిపోలే మార్గం లేని UID నియమం ప్రోగ్రామ్ను మళ్లించే బదులు నిరోధిస్తుంది.
ఖాతాను మొదట దాని స్వంత పట్టిక ద్వారా పంపండి, తర్వాత ఫైర్వాల్ ఫలితాన్ని నిర్ధారించనివ్వండి. ఇది iproute2 uidrange అర్థం చేసుకునే హోస్ట్లో పనిచేస్తుంది, దానిని ip rule help ఒకే వరుసలో నివేదిస్తుంది. పట్టిక 100 సొరంగం ద్వారా డిఫాల్ట్ మార్గాన్ని ఉంచుతుంది, మరియు నియమం UID 1000ని మాత్రమే ఆ పట్టికకు పంపుతుంది. మిగతావన్నీ ప్రధాన పట్టికలోనే ఉండి భౌతిక లింక్ను ఉపయోగిస్తూనే ఉంటాయి.
ip rule add uidrange 1000-1000 table 100 ip route add default dev tun0 table 100
వేరే సొరంగం అవసరమయ్యే రెండవ ఖాతాకు పట్టిక 101 మరియు దాని స్వంత నియమం లభిస్తాయి, ఎందుకంటే రెండు ప్రొఫైళ్లు ఒకే పట్టికలో డిఫాల్ట్ మార్గాన్ని కలిసి కలిగి ఉండలేవు. NetworkManager ప్రొఫైళ్లు సిస్టమ్-వ్యాప్తం, కాబట్టి ఈ భాగం చేతితోనే ఉంటుంది, మరియు రీబూట్లో నియమాలు మాయమవుతాయి, ఏదైనా వాటిని పునరుద్ధరించకపోతే. సొరంగ నిర్వచనం పక్కన బూట్ స్క్రిప్ట్లో పట్టికలను రాయండి, తద్వారా తిరిగి కనెక్ట్ కావడం ఒక ఖాతాను తప్పు మార్గంలో వదిలిపెట్టదు.
loopback మినహాయింపు సొరంగాన్ని ఎందుకు చంపుతుంది
నియమం యొక్క చాలా కాపీ చేసిన సంస్కరణలు loopback ద్వారా బయటకు వెళ్లని ప్రతి ప్యాకెట్ను విసిరేస్తాయి. సొరంగం loopback కాదు, కాబట్టి ఆ రూపం సొరంగ ట్రాఫిక్ను కూడా విసిరేస్తుంది, మరియు ఫలితం ఫైర్వాల్ పొరపాటుగా కాకుండా చనిపోయిన VPN లాగా కనిపిస్తుంది.
OUTPUT నడుస్తున్నప్పుడు కెర్నల్ ఇప్పటికే నిష్క్రమణ ఇంటర్ఫేస్ను ఎంచుకుంది, కాబట్టి -o ప్యాకెట్ హెడర్తో కాకుండా మార్గం యొక్క సమాధానంతో పోల్చబడుతుంది. యజమాని సరిపోలిక OUTPUT మరియు POSTROUTING లో మాత్రమే పరిగణించబడుతుంది, మరియు ఫార్వార్డ్ చేసిన ప్యాకెట్లలో అది చదవగల సాకెట్ ఉండదు. ఈ కలయిక అర్థం, మినహాయింపు loopbackను తిరస్కరించే బదులు సొరంగ ఇంటర్ఫేస్ను పేర్కొని ఆ సరిపోలికను తిరస్కరించాలి.
loopback ఇప్పటికీ DROP పైన తన స్వంత ACCEPT కు అర్హం, ఎందుకంటే ప్రోగ్రామ్ మొదటి DNS ప్యాకెట్ lo ద్వారా స్థానిక stubకు వెళ్తుంది. రెండు నియమాలను ఈ క్రమంలో ఉంచండి, ఖాతా stub చేరుకుంటుంది, తర్వాత సొరంగాన్ని, మరెక్కడా కాదు.
iptables -I OUTPUT 1 -o lo -m owner --uid-owner vpnapp -j ACCEPT iptables -A OUTPUT -m owner --uid-owner vpnapp ! -o tun0 -j DROP
IPv6 వేరే నియమ సముదాయం, v4 కోసం మాత్రమే ఉన్న జోడీ ip6tables ను తాకకుండా వదిలివేస్తుంది. AAAA రికార్డులను ఇష్టపడే ప్రోగ్రామ్ అప్పుడు DROP ను ఎప్పటికీ చేరకుండా భౌతిక లింక్ ద్వారా బయటకు వెళ్తుంది. రెండు నియమాలను ip6tables లో ప్రతిబింబించండి, లేదా సొరంగం v6 చిరునామా ఏదీ తీసుకెళ్లనప్పుడు హోస్ట్లో IPv6 ను నిలిపివేయండి. చేతితో జోడించిన నియమాలు కూడా రీబూట్లో మాయమవుతాయి, కాబట్టి వాటిని netfilter-persistent save తో సేవ్ చేయండి లేదా అదే తర్కాన్ని బూట్ యూనిట్ లోడ్ చేసే nftables పట్టికగా తిరిగి నిర్మించండి.
DNS సమాధానాలు మరో ప్రక్రియ నుండి వస్తాయి
ప్రోగ్రామ్ 127.0.0.53 కు పంపే ప్రశ్న loopback ACCEPT ను దాటుతుంది, అక్కడే UID సరిపోలిక ఆగుతుంది. stub resolver తన సేవా ఖాతా నుండి పైకి పంపుతుంది, కాబట్టి vpnapp కు ముడిపడిన నియమం రెండవ ప్రశ్నను ఎప్పటికీ చూడదు. resolver లింక్ కోసం LAN సర్వర్ను ఎంచుకుంటే, సమాధానాలు భౌతిక NIC ద్వారా తిరిగి వస్తాయి, ప్రోగ్రామ్ స్వంత ప్యాకెట్లు సొరంగంలోనే ఉంటాయి. కనిపించే ఫలితం విరిగిన పేర్లతో పనిచేసే సొరంగం, లేదా మీరు ఎంచుకోని సర్వర్ సమాధానమిచ్చే పేర్లు.
పేర్ల పరిష్కారాన్ని ప్రోగ్రామ్లో కాకుండా సొరంగ లింక్లో సరిచేయండి. సొరంగ ప్రొఫైల్కు DNS సర్వర్ మరియు రూటింగ్ డొమైన్ ఇవ్వండి, తర్వాత resolvectl query మరియు resolvectl status tun0 తో ముఖ్యమైన పేర్లకు resolver దానిని ఉపయోగిస్తుందని నిర్ధారించండి. నెట్వర్క్ నామస్థలం లోపల సమస్య మాయమవుతుంది, ఎందుకంటే నామస్థలం resolver సొరంగాన్ని మాత్రమే తెలుసు.
ఖాతా నుండే నియమాన్ని తనిఖీ చేయండి
UID ఏ మార్గాన్ని పొందుతుందో కెర్నల్ను అడగండి, తర్వాత ఆ ఖాతాగా అభ్యర్థన చేసి నిష్క్రమణ చిరునామాను మీ స్వంత ఖాతా చిరునామాతో పోల్చండి. రెండూ ఒకే చిరునామాను నివేదిస్తే, నియమం మీరు పరీక్షించిన ట్రాఫిక్ కాకుండా మరేదో సరిపోలుస్తోంది. క్రింది మొదటి ఆదేశం ప్యాకెట్ పంపకుండా మార్గ అన్వేషణను చూపుతుంది, ఇది రూటింగ్ పొరపాటును ఫైర్వాల్ పొరపాటు నుండి వేరు చేస్తుంది.
ip route get 1.1.1.1 uid 1000 sudo -u vpnapp curl -s https://ifconfig.co
కౌంటర్లు నియమం ఎప్పుడైనా పనిచేసిందా అని చూపుతాయి. iptables -vnL OUTPUT అమలు చేయండి, ప్రతి నియమం పక్కన ప్యాకెట్ లెక్కను చదవండి, మరియు నిజమైన ట్రాఫిక్ తర్వాత DROP పక్కన సున్నాను సరిపోలిక పొరపాటుగా పరిగణించండి.
ఫార్వార్డ్ చేసిన ట్రాఫిక్ ఈ రూపకల్పన వెలుపల ఉంది. వంతెన వెనుక ఉన్న కంటైనర్ లేదా VM vpnapp కు చెందిన స్థానిక సాకెట్ కలిగి ఉండదు, కాబట్టి యజమాని సరిపోలిక ఎప్పటికీ పనిచేయదు మరియు ఆ ప్యాకెట్లు FORWARD విధానాన్ని అనుసరిస్తాయి. ఆ పనిభారాన్ని కవర్ చేయాలంటే, దానిని విడిగా పరీక్షించి వంతెన లేదా కంటైనర్ చిరునామాకు ముడిపడిన విధానాన్ని రాయండి. పట్టిక, ఇంటర్ఫేస్ మినహాయింపు, resolver మరియు v6 నియమాలు అన్నీ ఒకే దిశను చూపినప్పుడే రూపకల్పన నిలబడుతుంది; వాటిలో ఏదైనా వదిలేస్తే ఖాతా లీక్ అవుతుంది లేదా కనెక్టివిటీని కోల్పోతుంది.