ஒரு Linux ஹோஸ்டில் இரண்டாவது OpenVPN கிளையண்டைச் சேர்ப்பது இரண்டு இடங்களில் ஒன்றில் தோல்வியடைகிறது. ஒன்று உள்ளக கிளையண்ட் தன் சொந்த சேவையகத்தை அடைய முடியாது, ஏனெனில் வெளிப்புற சுரங்கம் அந்தப் போக்குவரத்தைப் பிடித்துக் கொண்டது, அல்லது இரண்டாவது கிளையண்ட் வழி அட்டவணையை மீண்டும் எழுதுகிறது, முதல் சுரங்கம் வேலை செய்வதை நிறுத்துகிறது. இரு சிக்கல்களும் வழிநடத்தலில் உள்ளன, மறையாக்கத்தில் அல்ல, இரண்டும் புதிய சுரங்கம் எந்தப் பயன்பாட்டுப் போக்குவரத்தையும் எடுத்துச் செல்வதற்கு முன்பே தீர்க்கப்படுகின்றன. இங்குள்ள முகவரிகள் விளக்கத்திற்கானவை: tun0 வெளிப்புற சுரங்கம், 203.0.113.9 உள்ளக சேவையகம், TCP 9999 உள்ளக வழியைப் பயன்படுத்த வேண்டிய ஓட்டம்.

இரு தோல்வி முறைகள், ஒரு வழி அட்டவணை

உள்ளக கிளையண்ட் தன் சேவையகத்திற்கு UDP சாக்கெட்டைத் திறக்கிறது, அந்தச் சாக்கெட் மற்றவை போலவே தற்போதைய வழி அட்டவணையைப் பின்பற்றுகிறது. வெளிப்புற சுரங்கம் ஏற்கனவே இயல்புநிலையை வைத்திருந்தால், கை குலுக்கல் பாக்கெட்டுகள் வெளிப்புற சுரங்கத்திற்குள் செல்கின்றன. வெளிப்புற சேவையகம் உள்ளக சேவையகத்தை அடைய முடிந்தால் மட்டுமே அது வேலை செய்யும், எதிர்ப்பக்கம் ஓட்டத்தை எடுத்துச் செல்ல ஒப்புக்கொண்டால் மட்டுமே; இல்லையேல் கை குலுக்கல் நின்றுவிடும், கிளையண்ட் மீண்டும் முயலும்.

இரண்டாவது தோல்வி சேவையகத்தின் push-இல் இருந்து வருகிறது. வழக்கமான push redirect-gateway def1 ஆகும், அது இயல்புநிலை வழியை மாற்றுவதற்குப் பதிலாக 0.0.0.0/1 மற்றும் 128.0.0.0/1 ஐ நிறுவுகிறது. எனவே தமது சொந்த /1 இணையை நிறுவும் இரு கிளையண்ட்களும் மோதுகின்றன, கிட்டத்தட்ட ஒவ்வொரு இலக்கிற்கும் புதிய இணை வெல்கிறது. இரண்டாவது இணைந்த பிறகு சுரங்கம் இறந்தால் அட்டவணையில் அந்த இரு முன்னொட்டுகளைப் பாருங்கள், ஏனெனில் இயல்புநிலை வழியே ஒருபோதும் மாறியிருக்காது.

ஓட்டத்தைக் குறிக்கவும், அதற்கு அட்டவணை கொடுக்கவும்

தேர்ந்தெடுத்த போக்குவரத்தை mangle அட்டவணையில் குறித்து, கொள்கை விதியில் அந்தக் குறியைப் பொருத்தி வழிநடத்துங்கள். விதி இயல்புநிலை வழி உள்ளக சாதனமாக உள்ள தனி அட்டவணையைச் சுட்டுகிறது, எனவே குறிக்கப்பட்ட பாக்கெட்டுகள் மட்டுமே உள்ளக வழியை எடுக்கின்றன.

iptables -t mangle -A PREROUTING -p tcp -m multiport --dport 9999 -j MARK --set-mark 0x9999
ip rule add fwmark 0x9999 table 200 pref 1000
ip route add default dev tun1 table 200

இந்த விதித் தொகுப்பில் பெரும்பாலான தோல்விகள் இரு தவறுகளில் இருந்து வருகின்றன. firewall அமைக்கும் குறி மதிப்பும் விதி பொருத்தும் மதிப்பும் ஒன்றாக இருக்க வேண்டும், ஏனெனில் வேறுபாடு பிழையையோ விளைவையோ தராது. மேலும் PREROUTING வெளியில் இருந்து வரும் பாக்கெட்டுகளை மட்டுமே பார்க்கிறது, எனவே இந்த ஹோஸ்டில் தொடங்கும் இணைப்பு குறிக்கப்படுவதற்கு முன்பே அதே பொருத்தம் கொண்ட OUTPUT விதி தேவை.

இரண்டாவது கிளையண்டிடம் இருந்து வழி உரிமையை எடுத்துக் கொள்ளுங்கள்

இரு விருப்பங்கள் இரண்டாவது கிளையண்ட் அட்டவணையைத் திருத்துவதைத் தடுக்கின்றன, அவை வெவ்வேறு இடங்களில் செயல்படுகின்றன. route-nopull push செய்யப்பட்ட வழி விருப்பங்களைப் புறக்கணிக்கிறது, எனவே எதுவும் நிறுவப்படுவதில்லை. route-noexec push செய்யப்பட்ட விருப்பங்களைக் கிளையண்டின் சூழலில் ஏற்கிறது, ஆனால் அட்டவணை மாற்றத்தை hook-க்கு விட்டுவிடுகிறது, சேவையகம் என்ன வழங்கியது எனப் பார்க்க வேண்டியபோது அதுவே உங்களுக்குத் தேவை.

Hook push செய்யப்பட்ட மதிப்புகளுடன் தன் சூழலில் இயங்குகிறது, நீங்கள் அனுமதித்த பதிவுகளை மட்டுமே சேர்க்க வேண்டும். அதை idempotent ஆக்குங்கள்: மீண்டும் கட்டுவதற்கு முன் அது வைத்திருக்கும் அட்டவணையைக் காலி செய்யுங்கள், முந்தைய இயக்கம் சுத்தமான நிலையை விட்டதாகக் கருத வேண்டாம். மீண்டும் இணைவது hook-ஐ மீண்டும் அழைக்கிறது, சுத்தம் செய்யாமல் சேர்ப்பவர் நகல் வழிகளைக் குவிக்கிறது.

ஒரு உரிமையாளரைத் தேர்ந்தெடுத்து எழுதி வையுங்கள். இரு விருப்பங்களையும் அமைக்கும் சுயவிவரம், அல்லது கைமுறை ஸ்கிரிப்டுடன் போட்டியிடும் hook, பின்னர் யாரும் விளக்க முடியாத அட்டவணையை உருவாக்குகிறது.

இரு சேவையக முகவரிகளையும் பிணைக்கவும்

உள்ளக கிளையண்ட் இணைவதற்கு முன் உள்ளக சேவையகத்திற்கு வெளிப்புற சாதனம் வழியாக ஹோஸ்ட் வழி தேவை. அந்தப் பதிவே உள்ளகப் போக்குவரத்தை இயல்புநிலையைப் பின்பற்ற விடாமல் வெளிப்புற சுரங்கத்திற்குள் வைத்திருக்கிறது.

ip route add 203.0.113.9/32 dev tun0
ip route get 203.0.113.9

முதன்மை அட்டவணையில் வெளிப்புற சேவையகத்திற்கும் பொருந்தும் ஹோஸ்ட் வழியைச் சேர்க்கவும், இல்லையேல் மீண்டும் இணையும்போது வெளிப்புற கிளையண்டின் சொந்தப் போக்குவரத்து அதன் சொந்த சுரங்கத்திற்குள் வழிநடத்தப்படலாம். வரிசை விருப்பத்தேர்வல்ல: தொடர்புடைய இடைமுகம் இருந்த பிறகே இந்தப் பதிவுகளைச் சேர்க்கவும், அதாவது இணைப்புக்குப் பிறகு இயங்கும் hook அல்லது ஸ்கிரிப்ட். அணைக்கப்பட்ட சாதனத்தைச் சுட்டும் வழி நீக்கப்படும் அல்லது புறக்கணிக்கப்படும், எனவே தொடக்கத்தில் எழுதப்பட்ட பதிவு நீங்கள் கருதிய வரிசையைத் தாண்டாது.

முழு அட்டவணையையும் படிப்பதற்குப் பதிலாகத் தேடலைச் சரிபார்க்கவும். வழித் தேடலின் வெளியீடு kernel பயன்படுத்தும் சாதனத்தையும் மூல முகவரியையும் குறிப்பிடுகிறது, கிளையண்ட் தன் சாக்கெட்டைத் திறக்கும்போது அதையே பெறுகிறது.

சங்கிலியைச் சோதித்து தோல்வியைத் தெரியச் செய்யுங்கள்

உள்ளக கிளையண்ட் இணையும்போது வெளிப்புற இடைமுகத்தில் பதிவு செய்யுங்கள். உள்ளகக் கை குலுக்கல் வெளிப்புற சுரங்கத்திற்குள் மறையாக்கப்பட்ட சுமையாகத் தெரிய வேண்டும்; அது 203.0.113.9 நோக்கி சாதாரண UDP ஆகத் தெரிந்தால், ஹோஸ்ட் வழி இல்லை, சங்கிலி ஒருபோதும் கட்டப்படவில்லை.

இயற்பியல் அப்லிங்கிற்கு அமைதியாகத் திரும்பும் சங்கிலி மிக மோசமான முடிவு, ஏனெனில் இடைமுக நிலை எதையும் அறிவிக்கவில்லை, உள்ளகப் போக்குவரத்து தவறான மூல முகவரியிலிருந்து வெளியேறுகிறது. வெளிப்புற சுரங்கம் விழும்போது இரண்டாவது கிளையண்ட் நேரடியாக மீண்டும் இணைய முடிந்தால், அந்த வழியை முடக்கவும் அல்லது தோல்வி தெரியும்படி அதை வெளிப்புற இடைமுகத்துடன் பிணைக்கவும்.

இரு ஓட்டங்கள் மற்றும் ஒரு விதி டம்புடன் முடிக்கவும்: குறிக்கப்பட்ட மற்றும் குறிக்கப்படாத இணைப்பு வெவ்வேறு வழிகளை எடுக்க வேண்டும், ip rule show நீங்கள் நோக்கிய முன்னுரிமையைப் பட்டியலிட வேண்டும். இரு ஓட்டங்களும் ஒரே வழியை எடுத்தால், குறி நீங்கள் நினைக்கும் இடத்தில் பயன்படுத்தப்படவில்லை.

தொடர்புடைய கட்டுரைகள்