গেটওয়ে কলাম খালি থাকলেই রাউটিং টেবিলকে ভাঙা বলে পড়া হয়, অথচ লাইনটি সাধারণত নিজেই সম্পূর্ণ। via ফিল্ডটি কেবল তখনই দেখা যায় যখন কার্নেল প্যাকেটটি পরবর্তী হপ ঠিকানায় হস্তান্তর করে; কোনো ইন্টারফেসে যুক্ত রুট তার গন্তব্যে পৌঁছায় লিংক-লেয়ার রেজল্যুশন বা পয়েন্ট-টু-পয়েন্ট পিয়ার দিয়ে। কলামগুলো বাঁ থেকে ডানে পড়লে বোঝা যায় আপনি কোন ক্ষেত্রে আছেন, এবং সেই পড়াটি কারও ডিফল্ট রুট সম্পাদনার আগেই হওয়া উচিত। অনুপস্থিত গেটওয়ে নিয়ে বেশিরভাগ টিকিট এই পার্থক্যেই শেষ হয়।

রুট লাইন কলাম ধরে ধরে পড়ুন

প্রতিটি এন্ট্রি গন্তব্য ও তার প্রিফিক্স দৈর্ঘ্য দিয়ে শুরু হয়, তারপর নির্দিষ্ট শব্দভাণ্ডারে মডিফায়ার যোগ করে: via, dev, proto, scope, src এবং metric। 198.51.100.0/24 dev tun0 proto kernel scope link src 198.51.100.2 এর মতো একটি লাইন ঘন কিন্তু সম্পূর্ণ নির্দিষ্ট। এতে কিছুই অনুপস্থিত নেই, এবং কোনো রাউটার ঠিকানা অনুমেয় নয়।

via এর অনুপস্থিতিই মজার অংশ। পরবর্তী হপ না থাকলে কার্নেল গন্তব্যটি সরাসরি উল্লিখিত ইন্টারফেসে সমাধান করে, যার অর্থ টানেলের ক্ষেত্রে ফ্রেমটি টানেল ডিভাইসকে দেওয়া এবং এনক্যাপসুলেশনকে সেখান থেকে দায়িত্ব নিতে দেওয়া। proto kernel লিপিবদ্ধ করে যে ঠিকানা নির্ধারিত হওয়ার সময় এন্ট্রিটি স্বয়ংক্রিয়ভাবে ইনস্টল হয়েছিল, কোনো প্রশাসক টাইপ করেননি। scope link বলে গন্তব্যটি রাউটার অতিক্রম না করেই ওই লিংকে পৌঁছানো যায়, আর src সেই ঠিকানার নাম দেয় যা কার্নেল মিলে যাওয়া ট্র্যাফিকের উৎস হিসেবে পছন্দ করবে।

এখন একইভাবে একটি ডিফল্ট রুট পড়ুন: default via 192.0.2.254 dev eth0 proto static metric 100। এখানে via আছে কারণ প্যাকেটের সত্যিই পরবর্তী হপ দরকার, এবং সেই হপটিকেই eth0 এ পৌঁছানো যেতে হবে। দুটি লাইন একে অপরের রূপ নয়; ট্র্যাফিক কোথায় যায় সে সম্পর্কে তারা ভিন্ন প্রশ্নের উত্তর দেয়।

দুটি রুট আকৃতি যা পরস্পরের সঙ্গে গুলিয়ে ফেলা হয়

একটি টানেল সাবনেট রুট আর একটি ডিফল্ট রুট স্ক্রিনশটে একই রকম দেখায় কিন্তু আচরণে সম্পূর্ণ আলাদা। নিচের টেবিলটি ফিল্ডগুলো পড়ার সহায়ক হিসেবে ব্যবহার করুন, তারপর কোনো গাইডের নমুনায় ভরসা না করে আপনি যে মেশিন ডিবাগ করছেন সেখানেই প্রকৃত সংখ্যাগুলো যাচাই করুন।

Piece of the lineWhat it settlesWhat it says nothing about
The destination and maskWhich packets are eligible to matchWhere those packets leave the host
via plus its addressWhich next hop receives them, and therefore that a router is involvedWhether that router is reachable or sane
devWhich interface carries the encapsulated or raw packetWhether the interface is up or has a carrier
proto and scopeWho installed the entry and how far the destination is considered to beWhether a firewall later drops the traffic

টেবিলটি আপনাকে যা বলতে পারে না তা হলো অভিপ্রায়। টানেলের মাধ্যমে একটি প্রাইভেট রেঞ্জে সরাসরি রুট হলো সচেতন স্প্লিট-টানেল নকশা; যে হোস্টের সবকিছু VPN দিয়ে পাঠানো উচিত সেখানে একই আকৃতি দেখা দেওয়া একটি উপসর্গ। অভিপ্রায় বাস করে যে কনফিগারেশন এন্ট্রিটি তৈরি করেছে তার মধ্যে, তাই কার্নেল ভুল করেছে বলে সিদ্ধান্তে আসার আগে যে টুল এটি ইনস্টল করেছে তার দিকে তাকান।

একইভাবে, অনুপস্থিত গেটওয়ে মানে একটি বানিয়ে ফেলার অনুমতি নয়। যদি রুটের সত্যিই পরবর্তী হপ দরকার হয়, পরবর্তী হপটিকে অবশ্যই যে ইন্টারফেস বহন করে সেখানেই পৌঁছানো যেতে হবে, এবং পয়েন্ট-টু-পয়েন্ট টানেলে পিয়ার ঠিকানা স্থানীয় ঠিকানার মতো একই বস্তু নয়। স্থানীয় টানেল ঠিকানাকে ইথারনেট রাউটার হিসেবে গণ্য করা এমন একটি রুট তৈরি করার সাধারণ উপায় যা সঠিক দেখায় কিন্তু কিছুই ফরোয়ার্ড করে না।

কার্নেলকে জিজ্ঞাসা করুন আসলে কোন লাইনটি ব্যবহার করবে

টেবিল পড়া আর লুকআপ সম্পাদন করা এক কথা নয়, কারণ উত্তর দেওয়ার আগে কার্নেল নীতি-নিয়ম, কয়েকটি টেবিল ও ক্যাশ করা এন্ট্রি দেখে। আসল লুকআপ সম্পাদনকারী ক্রিয়াটি হলো ip route get, এবং এটি সেই রুটটি ছাপিয়ে দেয় যা ওই বৈশিষ্ট্যের প্যাকেট নেবে।

ip route get 203.0.113.37 from 198.51.100.2 iif tun0

আপনি যে গন্তব্য নিয়ে সত্যিই ভাবছেন সেটি বসান, তারপর ট্র্যাফিক উৎস-নির্বাচিত বা ফরোয়ার্ডেড হলে from বা iif যোগ করুন, কারণ সাধারণ স্থানীয় লুকআপ ফরোয়ার্ডেড ক্লায়েন্টের চেয়ে ভিন্ন পথ বেছে নিতে পারে। উত্তরটি ইন্টারফেস, নির্বাচিত উৎস ঠিকানা ও যেকোনো পরবর্তী হপের নাম দেয়, যা সেই মুহূর্তে প্যাকেট যে তথ্য দিয়ে রাউট হবে তারই সমান।

উত্তর যদি আপনাকে অবাক করে, কিছু সম্পাদনার আগে নিয়মগুলো ছাপুন: ip -4 rule show সেগুলো অগ্রাধিকার ক্রমে তালিকা করে, আর যে VPN ক্লায়েন্ট নিজের টেবিল বা চিহ্নিত প্যাকেটের জন্য নিয়ম ইনস্টল করে সে মূল টেবিলে একেবারেই দেখা যাবে না। প্রতিটি টেবিল তালিকা করলে সেই ফাঁক বন্ধ হয়।

ip -4 route show table all | grep -E 'tun|default'

ডিফল্ট প্রতিস্থাপনের আগে আন্ডারলে যাচাই করুন

টানেলের নিজের প্যাকেটকে দূরবর্তী এন্ডপয়েন্টে পৌঁছাতে হবে, এবং তারা তা করে ভৌত ইন্টারফেস দিয়ে সেই রুট ব্যবহার করে যা VPN ওঠার আগে ছিল। ওই এন্ডপয়েন্ট পিন না করে পুরো ডিফল্ট রুট প্রতিস্থাপন করলে এনক্যাপসুলেটেড প্যাকেট সেই টানেলেই চলে যায় যা তাদের তৈরি করার কথা, এবং সংযোগটি ভেঙে পড়ে। প্রথমে শুধু এন্ডপয়েন্ট ঠিকানার জন্য একটি লুকআপ দিয়ে এন্ডপয়েন্ট পথটি নিশ্চিত করুন।

পরিবর্তন করার সময় তিনটি জিনিস আলাদা রাখুন: এন্ডপয়েন্ট রুট যা ভৌত ইন্টারফেসে থাকতে হবে, প্রাইভেট রেঞ্জগুলো যা টানেলে ঢুকবে, এবং ডিফল্ট যা বাকি সবকিছু নির্ধারণ করে। এই ক্রমে সেগুলো আলাদা করুন, একবারে একটি প্রয়োগ করুন, এবং প্রতিটি ধাপের পর লুকআপ আবার চালান। পরে ব্যর্থ পিং নিজে থেকে খুব কম প্রমাণ করে, কারণ অনুমতি, রিপ্লাই রাউটিং, DNS এবং সেবাটি নিজেই সঠিক রুটের নিচের দিকে বসে আছে।

সম্পাদনার আগে লাইনটি আপনাকে যে চারটি মান দিয়েছে তা লিখে রাখুন: গন্তব্য, পরবর্তী হপ বা তার অনুপস্থিতি, ডিভাইস এবং নির্বাচিত উৎস। পরবর্তী কোনো পরিবর্তন এর যেকোনোটি সরালে আপনি জানবেন কোন সিদ্ধান্তটি সত্যিই বদলেছে, এবং পুরো টেবিল নিয়ে অনুমান না করে একটি এন্ট্রি পুনরুদ্ধার করতে পারবেন।

সম্পর্কিত নিবন্ধ