VPN প্রবাহে ক্লায়েন্টের উৎস পোর্ট বনাম সার্ভারের লিসেনার
একটি টানেলে দুটি পোর্ট নম্বর তুলনা করুন: সার্ভারের স্থির লিসেনার ও ক্লায়েন্টের স্বল্পস্থায়ী উৎস, এবং মাঝখানে রাউটারের অনুবাদ।
একই কথোপকথনে দুটি সংখ্যা দেখা যায়, এবং দুটির কোনোটিই ভুল নয়। সার্ভারের লগ পরিষেবা দেওয়া লিসেনারটি দেখায়, ল্যাপটপ ডেটাগ্রাম পাঠানো সকেটটি দেখায়, আর মাঝখানের রাউটার বাইরে যাওয়ার পথে দ্বিতীয়টি আবার লিখতে পারে। সংখ্যাগুলো তুলনা করার চেয়ে কথোপকথনের দুই প্রান্ত তুলনা করা বেশি কাজে দেয়। নিচের তুলনাটি লিসেনার, ক্লায়েন্ট সকেট ও অনূদিত উৎসকে আলাদা রাখে, কারণ তারা ভিন্ন প্রশ্নের উত্তর দেয়।
বিপরীত প্রান্ত বর্ণনা করা দুটি সংখ্যা
সার্ভারের কনফিগার করা পোর্ট হলো সেই গন্তব্য যেখানে ক্লায়েন্ট ডায়াল করে। এটি নীতিতে স্থির, প্রোফাইলে দেখা যায় এবং সার্ভারের দিকে খোলা থাকতে হয়। ক্লায়েন্টের উৎস পোর্ট স্থানীয়ভাবে বেছে নেওয়া হয়, সাধারণত স্বল্পস্থায়ী রেঞ্জ থেকে, এবং এর অস্তিত্ব আছে যাতে উত্তর কোথাও পৌঁছাতে পারে। এটি প্রতিটি পুনঃসংযোগে বদলাতে পারে, আর ডিজাইনের কিছুই এর স্থিরতার উপর নির্ভর করে না।
মাঝখানের রাউটার সেই উৎসকে নিজের 'NAT' ম্যাপিংয়ে আবার লিখতে পারে। এজন্যই সার্ভারে দেখা যাওয়া সংখ্যার সঙ্গে ল্যাপটপ যে সংখ্যা বেছেছিল তার প্রায়ই কোনো সম্পর্ক থাকে না।
বাইরে যাওয়ার পথে উৎস সংখ্যাটি কোথায় বদলায়
একটি বানানো IPv4 উদাহরণ নিন: অনুবাদকারী রাউটারের পিছনে একটি ক্লায়েন্ট, একটি 'UDP' লিসেনারযুক্ত সার্ভার, এবং দুটিকে অতিক্রম করা একটি ডেটাগ্রাম। টেবিলটি তিনটি পর্যবেক্ষণ বিন্দুতে প্যাকেট পুনরায় চালানোর বদলে প্রতিটি প্রান্ত এবং তার সঙ্গে কী ঘটে তা নাম দেয়।
| Endpoint | What stays fixed | What changes on reconnect | Who owns it |
|---|---|---|---|
| Server listener | The service port and the address the profile names | Nothing; the listener does not follow the client | The server operator |
| Client socket | The destination it dials | The local source port, chosen per socket | The client, or its operating system |
| Translated source | Usually the public address of the router | The port, and sometimes the address after a network switch | The NAT device or the upstream carrier |
গন্তব্য প্রতিটি সারিতে অপরিবর্তিত, এবং কেবল উৎসের পরিচয় বদলায়। UDP NAT-এর প্রয়োজনীয়তা অভ্যন্তরীণ ঠিকানা ও পোর্টকে বাইরের ম্যাপিং থেকে আলাদা করে, আর এটাই দ্বিতীয় ও তৃতীয় সারির মধ্যে পার্থক্য। রাউটার ক্লায়েন্টের উৎস পোর্ট ধরে রাখতে পারে বা অন্য একটি নিতে পারে; ধরে রাখা এমন কিছু নয় যা অ্যাপ্লিকেশন ধরে নেবে।
তিনটি প্রান্ত হোস্ট থেকেই পড়ুন
নিচের তালিকাগুলো তিনটি ভিন্ন মেশিন থেকে এসেছে এবং একসঙ্গে পুরো কথোপকথন দেখায়। প্রথমটি সার্ভারে, দ্বিতীয়টি ক্লায়েন্টে, আর তৃতীয়টি যেখানে ম্যাপিং আছে সেখানে চালান। একটি লগ লাইন কখনোই তিনটিই দেখায় না।
ss -lunp 'sport = :1194'
ss -unp | grep 1194
conntrack -L -p udp | grep 1194
প্রথম তালিকা প্রমাণ করে সার্ভার পরিষেবা পোর্টে বাঁধা এবং কোন প্রসেস সেটি ধরে আছে তা দেখায়। দ্বিতীয়টি ক্লায়েন্টের স্থানীয় সকেট ও সে যে গন্তব্যে ডায়াল করেছিল তা দেখায়। তৃতীয়টি রাউটার তৈরি করা ম্যাপিং দেখায়, যেখানে কেবল অনূদিত উৎসটিই দেখা যায়। এই ক্রমে পড়ুন, দুই সংখ্যা আর পরস্পরবিরোধী মনে হবে না।
পুনঃসংযোগ কী বদলায়, আর কী বদলায় না
কিছু রাউটার ক্লায়েন্টের উৎস পোর্ট খালি থাকলে ধরে রাখে, আবার কিছু প্রতিবার আলাদা একটি বরাদ্দ করে। দুটি আচরণই স্বাভাবিক, আর যে অ্যাপ্লিকেশন প্রথমটি দাবি করে সেটি দ্বিতীয়টিতে ভেঙে পড়বে। পুনঃসংযোগ বা নেটওয়ার্ক বদলের পরে ম্যাপিং বদলানো সার্ভারের ত্রুটি নয়: ক্লায়েন্ট নতুন সকেট খোলে, রাউটার যা আছে তা দেয়, আর সার্ভার একই লিসেনারে নতুন উৎস দেখে। ত্রুটি হতো যদি কেউ আশা করত সার্ভার ইচ্ছামতো ক্লায়েন্ট পোর্টে পাঠানো ট্র্যাফিক গ্রহণ করবে।
কমিউনিটি OpenVPN ক্লায়েন্টরা এই আচরণ পায় nobind দিয়ে, যা অপারেটিং সিস্টেমকে স্থানীয় পোর্ট বেছে নিতে দেয়; দূরবর্তী পোর্ট তবুও প্রোফাইল থেকেই আসে। স্পষ্টভাবে বাইন্ড করা সচেতন সিদ্ধান্ত, প্রোটোকলের বাধ্যবাধকতা নয়। সার্ভার একটি প্রান্ত দিতে থাকে, আর ক্লায়েন্টরা নিজেদের স্থানীয় পরিচয় বেছে নেয়।
রেকর্ডে স্তরগুলো আলাদা করে চিহ্নিত করুন
টানেলের ভিতরে নিজস্ব পোর্টযুক্ত দ্বিতীয় কথোপকথন আছে। টানেলে বহন করা HTTPS অনুরোধের গন্তব্য TCP 443, আর বাইরের এনক্রিপ্টেড সংযোগ ব্যবহার করে UDP 1194, তাই বাইরের উৎস পোর্ট বদলালে ভিতরের পরিষেবায় কিছুই বদলায় না।
এমনকি বাইরের স্তরেও প্রোটোকল গুরুত্বপূর্ণ। UDP 1194 ও TCP 1194 ভিন্ন প্রান্ত, আর একটি 'TCP' লিসেনার কখনো UDP ডেটাগ্রাম পাবে না, কারণ নম্বর মিলে যায়। কোনো ডিপ্লয়মেন্ট নথিভুক্ত করার সময় সার্ভার লিসেনার, ক্লায়েন্ট সকেট ও অনূদিত উৎসকে তিনটি আলাদা জিনিস হিসেবে চিহ্নিত করুন এবং প্রতিটির সঙ্গে ট্রান্সপোর্ট যোগ করুন।
তারপর নীতি ভূমিকা অনুসরণ করুক। সার্ভার তার লিসেনারে অভীষ্ট ট্রান্সপোর্ট খোলে এবং তবুও পিয়ারকে প্রমাণীকরণ করে; ক্লায়েন্টের ফায়ারওয়াল কোনো ইনবাউন্ড পরিষেবা প্রকাশ না করেই নিজের আউটবাউন্ড আদানপ্রদানের উত্তরগুলো গ্রহণ করে। স্টেটলেস ফিল্টারের ফেরত দিকটি স্পষ্টভাবে লিখতে হয়, আর সাজানো ডায়াগ্রামের বাইরে এই পার্থক্যটি গুরুত্বপূর্ণ হওয়ার ব্যবহারিক কারণ এটাই।