Linux இல் ஃபார்வர்டிங்கை இயக்கிய பிறகு IPv6 இயல்புநிலை வழி மறைந்தது
IPv6 ஃபார்வர்டிங்கை இயக்கினால் kernel அப்லிங்கில் ரவுட்டர் அறிவிப்புகளை புறக்கணிக்கிறது, கற்ற இயல்புநிலை வழி காலாவதியாகிறது. accept_ra மூலம் சரிசெய்யுங்கள்.
VPN வாடிக்கையாளர்களின் போக்குவரத்தை அனுப்ப முடியும் என்பதற்காக ஒரு Debian நுழைவாயிலில் net.ipv6.conf.all.forwarding=1 அமைத்தேன், சுமார் அரை மணி நேரம் கழித்து இயந்திரத்தில் எந்த IPv6 இயல்புநிலை வழியும் இல்லை. மேலுள்ள ரவுட்டர் இயங்கியது, link-local அண்டை இன்னும் பதில் அளித்தது, அப்லிங்க் இன்னும் அதன் உலகளாவிய முகவரியை வைத்திருந்தது. நின்றது அந்த இடைமுகத்தில் ரவுட்டர் அறிவிப்புகளைத் தொடர்ந்து ஏற்கும் kernel இன் தயார்நிலை. sysctl எழுதிய நொடியில் வழி மறையவில்லை; RA வில் இருந்து கற்ற இயல்புநிலை வழியின் ஆயுள் முடிந்தபோது மறைந்தது, எதுவும் அதைப் புதுப்பிக்கவில்லை.
முதல் பார்வையில் எதுவும் உடைந்ததாகத் தெரியவில்லை. ஃபார்வர்டிங் வேலை செய்தது, பழைய வழி தற்காலிகச் சேமிப்பில் இருக்கும் வரை வாடிக்கையாளர்கள் கடந்து சென்றார்கள், தோல்வி அதை ஏற்படுத்திய மாற்றத்திற்குப் பிறகு வந்தது. அந்தத் தாமதம்தான் குற்றத்தை மேலுள்ள பக்கம் அல்லது ஒருபோதும் சம்பந்தப்படாத ஃபயர்வால் விதியின் மீது சுமத்தக் காரணம்.
எந்த 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 ஐ நுழைவாயில் அல்ல வாடிக்கையாளரே முடிக்கிறார். ஆரோக்கியமான வழியுடன் வாடிக்கையாளர் இன்னும் தோல்வியடைந்தால் அடுத்த சந்தேகம் திரும்பும் பாதை அல்லது மேலுள்ள ஃபயர்வால், அறிவிப்பு அல்ல.