Linux లో ఫార్వర్డింగ్ ఆన్ చేసిన తర్వాత IPv6 డిఫాల్ట్ మార్గం మాయమైంది
IPv6 ఫార్వర్డింగ్ ఆన్ చేసినప్పుడు kernel అప్లింక్లో router announcements ను విస్మరిస్తుంది, నేర్చుకున్న డిఫాల్ట్ మార్గం గడువు ముగుస్తుంది. accept_ra తో సరిచేయండి.
VPN క్లయింట్ల ట్రాఫిక్ను పంపగలిగేలా నేను ఒక Debian గేట్వేపై net.ipv6.conf.all.forwarding=1 పెట్టాను, సుమారు అరగంట తర్వాత యంత్రానికి ఏ IPv6 డిఫాల్ట్ మార్గం మిగలలేదు. పైనున్న రౌటర్ పనిచేస్తోంది, link-local పొరుగువాడు ఇంకా సమాధానం ఇస్తున్నాడు, అప్లింక్ ఇంకా తన ప్రపంచ చిరునామాను కలిగి ఉంది. ఆగినది ఆ ఇంటర్ఫేస్పై రౌటర్ ప్రకటనలను స్వీకరిస్తూ ఉండాలన్న kernel సన్నద్ధత. sysctl రాసిన క్షణంలో మార్గం మాయం కాలేదు; RA నుండి నేర్చుకున్న డిఫాల్ట్ మార్గ ఆయుష్షు తీరినప్పుడు మాయమైంది, ఏదీ దాన్ని పునరుద్ధరించలేదు.
మొదటి చూపులో ఏదీ పాడైనట్టు కనిపించలేదు. ఫార్వర్డింగ్ పనిచేసింది, పాత మార్గం క్యాష్లో ఉన్నంత వరకు క్లయింట్లు దాటుతున్నారు, మరియు వైఫల్యం దానిని కలిగించిన మార్పు తర్వాత ఆలస్యంగా వచ్చింది. ఆ ఆలస్యమే దీన్ని పై భాగం లేదా ఎప్పుడూ పాల్గొనని firewall నియమంపై నెట్టడానికి కారణం.
ఏ sysctl ను తాకే ముందు మార్గాల పట్టిక చదవండి
ip -6 route show default తో ప్రారంభించి గేట్వే మాత్రమే కాదు, లక్షణాలను కూడా చదవండి. RA నుండి నేర్చుకున్న డిఫాల్ట్ మార్గం proto ra తో గుర్తించబడి ఉంటుంది, ప్రాధాన్యత కలిగి ఉంటుంది, expires వెనుక లెక్కను చూపుతుంది. చేతితో జోడించిన మార్గంలో ఇవి ఏవీ ఉండవు, ఆ భేదమే మార్గానికి యజమాని ఏ యంత్రాంగమో చెబుతుంది.
$ ip -6 route show default
default via fe80::1 dev eth0 proto ra metric 1024 expires 1432sec hoplimit 64 pref mediumతర్వాత చిరునామా చూడండి: ip -6 addr show dev eth0. గంటల్లో కొలిచే ప్రాధాన్య మరియు చెల్లుబాటు ఆయుష్షు ఉన్న ప్రపంచ చిరునామా, రౌటర్ ఆయుష్షు నిమిషాల్లో కొలిచే డిఫాల్ట్ మార్గం కంటే ఎక్కువ కాలం జీవిస్తుంది. చిరునామా ఉంది కానీ డిఫాల్ట్ మార్గం లేదు అంటే అది ప్రకటన సమస్య సంతకం. చిరునామా కూడా లేకపోతే మొదట లింక్, ప్రిఫిక్స్ సమాచారం లేదా నకిలీ చిరునామా గుర్తింపును వెంబడించాలి.
ఫార్వర్డింగ్ RA ప్రాసెసింగ్ను ఎందుకు ఆపేస్తుంది
RA అనేది 134 రకం ICMPv6 ప్యాకెట్, link-local మూలం నుండి 255 హాప్ పరిమితితో పంపబడుతుంది. kernel దాన్ని వాడే ముందు ఇంటర్ఫేస్ accept_ra ను చూస్తుంది. డిఫాల్ట్ విలువ 1, 1 అంటే అవును కాదు. దాని అర్థం: ఈ హోస్ట్ ఫార్వర్డ్ చేయనంత వరకు మాత్రమే అంగీకరించు. forwarding=1 పెట్టండి, ఆ షరతు విఫలమవుతుంది, కాబట్టి అందులోని ఏ ప్రిఫిక్స్ లేదా డిఫాల్ట్ రౌటర్ పరిగణనలోకి రాకముందే ప్రకటన విస్మరించబడుతుంది.
మూడు విలువలు ఉన్నాయి, ఫార్వర్డింగ్ నుండి మూడవది మాత్రమే తప్పించుకుంటుంది:
accept_ra | forwarding=0 | forwarding=1 |
|---|---|---|
| 0 | ignored | ignored |
| 1 (default) | accepted | ignored |
| 2 | accepted | accepted |
మరో రెండు ఫ్లాగ్లు నిజంగా ఏది ఇన్స్టాల్ అవుతుందో నిర్ణయిస్తాయి. accept_ra_defrtr ప్రకటనలోని డిఫాల్ట్ రౌటర్ మార్గం అవుతుందా అని నియంత్రిస్తుంది, accept_ra_pinfo ప్రిఫిక్స్ సమాచారం చిరునామా కాన్ఫిగరేషన్కు ఉపయోగించబడుతుందా అని నియంత్రిస్తుంది. accept_ra_defrtr ఆఫ్ చేయడం ఫార్వర్డింగ్ హోస్ట్పై డిఫాల్ట్ మార్గం నేర్చుకోకుండా SLAAC చిరునామాలను ఉంచే సాధారణ మార్గం. ఇది accept_ra కంటే భిన్నమైన లివర్, చిరునామాలు కావాలి కానీ మార్గం వద్దనప్పుడు దీన్నే వాడతారు. kernel యొక్క IP sysctl సూచన మూడింటినీ జాబితా చేస్తుంది.
మూడు ఆదేశాలతో నిర్ధారించండి
మొదట, లోడ్ అయిందని మీరు భావించే ఫైల్కు బదులు ప్రస్తుత విలువలు చదవండి:
sysctl net.ipv6.conf.eth0.forwarding net.ipv6.conf.all.forwarding \
net.ipv6.conf.eth0.accept_ra net.ipv6.conf.eth0.accept_ra_defrtrరెండవది, ప్రకటనలు ఇంకా వస్తున్నాయని నిరూపించండి. ICMPv6 రకం బైట్పై ఫిల్టర్ చేయడం సరిపోతుంది, అది పొరుగు గుర్తింపు ట్రాఫిక్ గోడను చదవడం నుండి తప్పిస్తుంది:
tcpdump -ni eth0 'icmp6 and ip6[40] == 134'కొన్ని నిమిషాల్లో ఏమీ కనిపించకపోతే accept_ra మీ సమస్య కాదు. పై భాగం ప్రకటించడం ఆపేసింది, దారిలో ఏదో ICMPv6 ఫిల్టర్ చేస్తోంది, లేదా ఆ ఇంటర్ఫేస్ మీరు అనుకున్న సెగ్మెంట్లో నిజంగా లేదు. మూడవది, మీరే ఒక ప్రకటనను కోరి దాని ఫీల్డ్లు చదవండి:
rdisc6 eth0rdisc6 Debian మరియు Ubuntu లలో ndisc6 ప్యాకేజీలో వస్తుంది. అవుట్పుట్లో మరేదైనా మార్చే ముందు రౌటర్ ఆయుష్షు మరియు ప్రాధాన్యత చూడండి. రౌటర్ ఆయుష్షు 0 ఉన్న ప్రకటన డిఫాల్ట్ రౌటర్ను తీసివేయాలని ఆదేశం, accept_ra యొక్క ఏ విలువ దాన్ని వాడదగిన మార్గం చేయదు. ఇదే విధంగా బ్రిడ్జ్ మోడ్లో ఉన్న పై CPE ను కూడా పట్టుకోవచ్చు, అది ప్రిఫిక్స్లు పంచుతుంది కానీ తనను ఎప్పుడూ రౌటర్గా అందించదు.
అప్లింక్ను ఏకైక అనుమతించే ఇంటర్ఫేస్ చేయండి
పై భాగమే డిఫాల్ట్ రౌటర్ కావాలంటే, ఫార్వర్డింగ్ ఉన్నా అక్కడే ప్రకటనలు అంగీకరించండి, మరెక్కడా కాదు:
# /etc/sysctl.d/60-ipv6-router.conf
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.eth0.accept_ra = 2
net.ipv6.conf.eth0.accept_ra_defrtr = 1పరిమితి ముఖ్యం ఎందుకంటే Linux లో IPv6 ఫార్వర్డింగ్ ఒకే ప్రపంచ స్విచ్, ప్రతి లింక్కు ఒకటి కాదు. net.ipv6.conf.wg0.forwarding లో 1 రాయండి, తర్వాత net.ipv6.conf.all.forwarding చదవండి: ప్రపంచ విలువ తిరుగుతుంది, ప్రతి ఇంటర్ఫేస్ ఫార్వర్డ్ చేయడం మొదలుపెడుతుంది. మీరు టన్నెల్లో రౌటర్గానూ LAN లో సాధారణ హోస్ట్గానూ ఒకేసారి ఉండలేరు. మీరు పరిమితం చేయగలిగేది అంగీకారం. accept_ra=2 ను అప్లింక్పై ఉంచి టన్నెల్ మరియు LAN ఇంటర్ఫేస్లను 1 లేదా 0 పై వదిలేయండి, టన్నెల్ ద్వారా వచ్చిన దారి తప్పిన ప్రకటన అందులోకి చూపే డిఫాల్ట్ మార్గాన్ని ఇన్స్టాల్ చేయలేకుండా.
తాత్కాలిక sysctl -w తదుపరి బూట్ వరకు నిలవదు, systemd-networkd మరియు NetworkManager రెండూ ఈ విలువలను తమ సొంత కాన్ఫిగరేషన్ నుండి రాస్తాయి. networkd లో అప్లింక్ యొక్క .network ఫైల్లో IPv6Forwarding=yes మరియు IPv6AcceptRA=yes సెట్ చేయండి; kernel లోని అదే కారణంతో networkd IPv6Forwarding ను ప్రపంచ స్థాయిగా వివరిస్తుంది. NetworkManager లో అప్లింక్పై ipv6.method=auto నే accept_ra విలువను నడిపిస్తుంది, కాబట్టి మొదటి తనిఖీని నమ్మకుండా nmcli connection up తర్వాత sysctl మళ్లీ చదవండి.
స్థిర ప్రత్యామ్నాయం ip -6 route add default via fe80::1 dev eth0 నిజంగా పనిచేస్తుంది, పై రౌటర్కు స్థిరమైన link-local చిరునామా ఉన్నప్పుడు అది సమంజసమైన సమాధానం. మీరు ఏమి వదులుకుంటున్నారో స్పష్టంగా తెలుసుకోండి. స్థిర డిఫాల్ట్ మార్గం ఎప్పుడూ పునరుద్ధరించబడదు, ఎప్పుడూ ఉపసంహరించబడదు, కాబట్టి పై భాగం మార్చిన తర్వాత కూడా అది చనిపోయిన పొరుగువాడి వైపు చూపుతూనే ఉంటుంది. RA మార్గం సురక్షితంగా విఫలమవుతుంది; స్థిరమైనది నిశ్శబ్దంగా విఫలమవుతుంది.
ఫార్వర్డ్ చేసిన ప్యాకెట్ను పరీక్షించండి, గేట్వేది కాదు
గేట్వే సొంత ping లు ఏ క్లయింట్ వాడలేని మార్గంలో విజయవంతం కావచ్చు, గేట్వే మూలం కావడం వల్లనూ విజయవంతం కావచ్చు. కనెక్ట్ అయిన క్లయింట్ నుండి పరీక్షించండి, తర్వాత ఆ క్లయింట్ చిరునామా కోసం ఏమి చేస్తుందని గేట్వేను అడగండి:
# on the VPN client
ping -6 -c 3 2001:4860:4860::8888
# on the gateway, using a client address
ip -6 route get 2001:4860:4860::8888 from fd42:20::2తర్వాత ఒక రౌటర్ ఆయుష్షు వేచి మళ్లీ చూడండి. మీకు కావాల్సిన స్థిర స్థితి proto ra తో గుర్తించబడిన డిఫాల్ట్ మార్గం, దాని expires విలువ పదేపదే రీసెట్ అవుతుంది, దానితో పాటు all.forwarding=1. expires కేవలం వెనుక లెక్క మాత్రమే చేస్తుంటే, ప్రకటనలు ఇంకా ఎక్కడో విస్మరించబడుతున్నాయి, సాధారణ నిందితుడు బూట్ సమయ sysctl ఇప్పటికే నడిచిన తర్వాత accept_ra ను తిరిగి రాసే నెట్వర్క్ మేనేజర్.
దీన్ని మూసివేసే ముందు నాలుగు విషయాలు నిర్ధారించండి: డిఫాల్ట్ మార్గం proto ra మరియు పునరుద్ధరణ అవుతోంది, accept_ra=2 అప్లింక్కు మాత్రమే వర్తిస్తుంది, రీబూట్ తర్వాత మరియు మేనేజర్ రీస్టార్ట్ తర్వాత కూడా ఫార్వర్డింగ్ 1 గానే ఉంది, IPv6 ping ను గేట్వే కాదు క్లయింటే పూర్తి చేస్తుంది. ఆరోగ్యకరమైన మార్గంతో కూడా క్లయింట్ విఫలమైతే తదుపరి అనుమానం తిరిగి వచ్చే మార్గం లేదా పై firewall, ప్రకటన కాదు.