ఒక cgroup నుండి వచ్చే ట్రాఫిక్ను గుర్తించడం సులభమైన భాగం. ఒక అనువర్తనం భౌతిక ఇంటర్ఫేస్ ద్వారా బయటకు వెళ్లి మిగతావన్నీ సొరంగంలో ఉండాలంటే మూడు వేర్వేరు నిర్ణయాలు సరిపోలాలి: ఏ సాకెట్ మినహాయింపుకు చెందుతుంది, గుర్తు ఏ మార్గ శోధనను ప్రేరేపిస్తుంది, మరియు బయలుదేరేటప్పుడు ప్యాకెట్ ఏ మూల చిరునామాను మోసుకెళ్తుంది. విఫలమైన ప్రయత్నాలలో చాలావరకు మొదటిది సరిగ్గా చేస్తాయి, రెండవది సగం, మూడవది ఎప్పుడూ చూడవు.

మూడు నిర్ణయాలు, ఒకటి కాదు

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

ఇవి స్వతంత్రంగా విఫలమవుతాయి. ప్యాకెట్ వర్గీకరించబడి, భౌతిక ఇంటర్ఫేస్కు తిరిగి మార్గనిర్దేశం చేయబడి, ఏ ఎగువ రౌటర్ తిరిగి పంపలేని ప్రైవేట్ చిరునామాను మోసుకెళ్లవచ్చు; ఇది ఫైర్వాల్ బ్లాక్లాగానే కనిపించే సమయ ముగింపును కలిగిస్తుంది. వర్గీకరణ దశలో దీని గురించి ఏమీ హెచ్చరించదు. మార్గ దశలోనూ ఏమీ లేదు.

క్రమం కూడా ముఖ్యం. ప్యాకెట్ ఉత్పత్తి అయ్యేటప్పుడు వర్గీకరణ జరుగుతుంది, ఆ తర్వాత మార్గనిర్దేశం, మరియు బయటకు వెళ్లే స్థానంలో అనువాదం జరుగుతుంది.

మూడు దశలలో ఏది పాడైందో చెప్పలేకపోతే, మీరు డీబగ్ చేయడం లేదు, నియమాలను మళ్లీ అమర్చి ఆశిస్తున్నారు.

రేపూ ఉండే cgroupతో సరిపోల్చండి

nftables సాకెట్ యొక్క cgroup v2 సభ్యత్వాన్ని పరీక్షించగలదు; ఇది గమ్యస్థానాన్ని కాకుండా ప్రక్రియను అనుసరిస్తుంది కాబట్టి నిజంగా ఉపయోగకరం. ఉచ్చు గుర్తింపుదారులో ఉంది. మెనూ నుండి ప్రారంభించిన డెస్క్టాప్ అనువర్తనం తదుపరి ప్రారంభంలో పేరు మారే తాత్కాలిక scopeలో నివసిస్తుంది.

nft list ruleset
systemctl status session.slice 2>/dev/null
cat /proc/self/cgroup

ఒక సెషన్ నుండి scope పేరును కాపీ చేసి గట్టిగా రాయడం ఈరోజు పనిచేసి రేపు నిశ్శబ్దంగా సరిపోలని నియమాన్ని సృష్టిస్తుంది. బదులుగా అనువర్తనాన్ని మీరు నియంత్రించే ప్రత్యేక scope లేదా unit వంటి ఉద్దేశపూర్వక, స్థిరమైన అమలు సందర్భంలో ఉంచి దానితో సరిపోల్చండి. అప్పుడు నియమం రీబూట్లు మరియు ప్యాకేజీ నవీకరణలను తట్టుకుంటుంది. మీ సెషన్ చరిత్ర లేకుండా సహచరుడు దీని గురించి ఆలోచించగలిగే విషయం కూడా అవుతుంది.

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

రెండవ శోధనను ప్రేరేపించేది route గొలుసు

స్థానికంగా ఉత్పత్తి అయ్యే ట్రాఫిక్కు, గుర్తు పెట్టిన తర్వాత ఏదైనా జరుగుతుందా అనేది గొలుసు రకం నిర్ణయిస్తుంది. filter రకం output గొలుసు ప్యాకెట్ను గుర్తించగలదు మరియు కెర్నల్ ఇప్పటికే ఎంచుకున్న మార్గాన్నే కొనసాగిస్తుంది. route రకం గొలుసే కొత్త శోధనను కోరే యంత్రాంగం.

table inet bypass {
  chain mark {
    type route hook output priority mangle; policy accept;
    socket cgroupv2 level 2 "app.slice" meta mark set 0x1 comment "app bypass"
  }
}
ip rule add fwmark 0x1 lookup 200
ip route add default via 203.0.113.1 dev wlan0 table 200

తర్వాత గుర్తుకు దానిని పట్టికకు పంపే విధాన నియమం అవసరం, ఆ పట్టిక పూర్తిగా ఉండాలి: డిఫాల్ట్ మార్గం, అనువర్తనానికి ఇంకా అవసరమైన స్థానిక గమ్యస్థానాలు, నిజంగా సమాధానం ఇచ్చే ఎగువ గేట్వే.

గుర్తు విలువను ఉద్దేశపూర్వకంగా ఎంచుకోండి. WireGuard బాహ్య రవాణా ట్రాఫిక్కు తన స్వంత fwmark ఉపయోగిస్తుంది, ప్రమాదవశాత్తు అదే సంఖ్యపై దిగడం సొరంగం యొక్క స్వంత మార్గ మినహాయింపును నిర్ధారణ కష్టమైన విధాలుగా భంగపరచవచ్చు.

మూల చిరునామా మార్గాన్ని అనుసరించదు

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

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

సన్నని సవరణ అనేది ఆ అనువర్తనం యొక్క గుర్తు మరియు దాని నిజమైన అవుట్పుట్ ఇంటర్ఫేస్కు పరిమితమైన, ఇప్పటికే ఉన్న NAT తో సమన్వయపరచిన, దానిని భర్తీ చేయని మూల అనువాద నియమం:

table inet bypass {
  chain postrouting {
    type nat hook postrouting priority srcnat; policy accept;
    meta mark 0x1 oifname "wlan0" masquerade
  }
}

మినహాయింపును మాత్రమే అనువదించండి, మరేమీ కాదు. సర్వవ్యాప్త masquerade నియమం లక్షణాన్ని సరిచేసి ఏ ట్రాఫిక్ ఏ మార్గం తీసుకుందో తెలుసుకునే సామర్థ్యాన్ని నాశనం చేస్తుంది. గుర్తు, నిజమైన అవుట్పుట్ ఇంటర్ఫేస్ మరియు వీలైతే అనువర్తనం యొక్క స్వంత చిరునామాతో సరిపోల్చండి. విశాలమైన నియమాలు రాయడం సులభం, తర్వాత ఆడిట్ చేయడం దాదాపు అసాధ్యం.

ఇంకా మినహాయింపు నుండి తప్పించుకునేది

పేరు పరిష్కారం మరో cgroup లోని ప్రత్యేక resolver ప్రక్రియ నుండి రావచ్చు, కాబట్టి బ్రౌజర్ సాకెట్ను వర్గీకరించడం దాని శోధనలను వర్గీకరించదు. resolver ప్రశ్నలు సొరంగంలో ఉండి కనెక్షన్ దాని బయటకు వెళ్తే, split-horizon సమాధానాలు మార్గంతో సరిపోలకపోవచ్చు. ఆ అసమానత DNS బగ్లలా కనిపించే కానీ కాని లోపాలను కలిగిస్తుంది.

చాలా సెటప్లలో చైల్డ్ ప్రక్రియలు cgroup ను వారసత్వంగా పొందుతాయి, కానీ తనను తాను సొంత scope లోకి తరలించుకునే సహాయకుడు పొందదు. ఊహించకుండా తనిఖీ చేయండి, ముఖ్యంగా తనను తాను మళ్లీ అమలు చేసుకునే ప్రతిదానికీ.

చివరగా, సొరంగం కింద ఉన్నప్పుడు ఏమి జరగాలో నిర్ణయించండి. నిశ్శబ్దంగా పూర్తి బైపాస్ అయ్యే మినహాయింపు, వైఫల్యంలో మూసుకుపోయే మినహాయింపు కంటే భిన్నమైన భద్రతా భంగిమ, మరియు వాటిలో ఒకటి మాత్రమే మీరు ఉద్దేశించింది.

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