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

DNAT নিয়মটি গন্তব্য নতুন করে লেখে এবং সেখানেই থেমে যায়

Linux গেটওয়েতে একটি সার্ভিস প্রকাশ করা মানে nat টেবিলের PREROUTING চেইনে একটি নিয়ম, বা nftables-এ সমতুল্য কিছু। নিয়মটি পাবলিক ঠিকানা ও পোর্টের সাথে মেলে, তারপর গন্তব্যকে অ্যাপ্লিকেশনের প্রাইভেট ঠিকানায় নতুন করে লেখে। উৎস ঠিকানা, উৎস পোর্ট ও পেলোড অপরিবর্তিত থাকে, আর conntrack ম্যাপিংটি লিখে রাখে যাতে বেরোনোর পথে উত্তরগুলো আবার নতুন করে লেখা হয়। এই আচরণ RFC 3022-এ বর্ণিত ঐতিহ্যবাহী ঠিকানা অনুবাদ মডেল।

sudo iptables -t nat -A PREROUTING -d 203.0.113.10 -p tcp --dport 443 \
  -j DNAT --to-destination 10.20.30.40:443
sudo iptables -t nat -L PREROUTING -n -v
sudo conntrack -L -p tcp --dport 443

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

নিয়মটি পরে যে ব্যর্থতার ধরনগুলো দেখবেন সেগুলোও ঠিক করে দেয়। যদি গেটওয়ে ফরওয়ার্ড করে কিন্তু অ্যাপ্লিকেশনের হোস্টের ক্লায়েন্টে ফেরার কোনো পথ নেই, উত্তরগুলো ভুল উৎস নিয়ে বেরোয় এবং হ্যান্ডশেক আটকে যায়। যদি দ্বিতীয় কোনো নিয়ম আগে মেলে, ক্রমই ফলাফল নির্ধারণ করে, আর iptables -t nat -L -n -v সেই কাউন্টার দেখায় যা প্রমাণ করে কোন নিয়ম প্যাকেটটি নিয়েছে।

টানেল প্যাকেটটিকে লিসেনার দেখার আগেই মোড়ায়

VPN অ্যাপ্লিকেশনটি আদৌ প্রকাশ করে না। ক্লায়েন্ট গেটওয়ের পাবলিক ঠিকানায় ঠিকানা দেওয়া একটি বাইরের প্যাকেট তৈরি করে, ভিতরের প্যাকেটটি তার ভিতরে এনক্রিপ্ট করে, আর গেটওয়ে ডিক্রিপ্ট করে ভিতরের প্যাকেটটি প্রাইভেট গন্তব্যে রুট করে। WireGuard-এ বাইরের পরিবহন UDP, সাধারণত উঁচু পোর্টে; OpenVPN TCP 443-এর উপর হলে বাইরের প্যাকেট পথ দেখছে এমন যেকোনো কিছুর কাছে TLS-এর মতো দেখায়।

টানেলের ভিতরে ভিতরের প্যাকেট প্রাইভেট ঠিকানা রাখে: ক্লায়েন্টের টানেল ঠিকানা, ধরুন 10.8.0.6, আর অ্যাপ্লিকেশন 10.20.30.40-এ। তাই লিসেনার টানেল পুল থেকে একটি উৎস দেখে, এবং প্রতিটি ক্লায়েন্ট ওই গেটওয়েটিকে পরবর্তী হপ হিসেবে ভাগ করে নেয়। VPN-এর পিছনে অ্যাক্সেস লগ প্রায়ই ব্যবহারকারীর বদলে গেটওয়ে দেখায় ঠিক এই কারণেই, যদি না গেটওয়ে মূল উৎস সংরক্ষণ করে।

মোড়ানো হেডার জায়গা খরচ করে, আর এটি হলো একমাত্র প্রক্রিয়া-স্তরের পার্থক্য যার পরিণাম মাপা যায়। একটি বাইরের IP হেডার যোগ UDP যোগ WireGuard-এর নিজের হেডার পথের MTU থেকে খেয়ে নেয়, তাই বড় প্যাকেট ফ্র্যাগমেন্ট করতে হয় বা ভিতরের TCP স্ট্যাককে তার MSS সীমিত করতে হয়। যে স্থানান্তর ফরওয়ার্ড করা পথে কাজ করে, সেটি টানেলের উপর আটকে যেতে পারে যখন কোনো মিডলবক্স ছোট MTU-র সংকেত দিত ICMP ফেলে দেয়।

ip route get 10.20.30.40
ping -M do -s 1400 10.20.30.40
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
  -j TCPMSS --clamp-mss-to-pmtu

প্রকাশ মাপা হয় প্রবেশপথে, সাইফার দিয়ে নয়

দুই নকশাই একই TLS লিসেনারে শেষ হয়, তাই দুটোই একই সার্টিফিকেট, একই প্রোটোকল সংস্করণ এবং একই অ্যাপ্লিকেশন লগইন উত্তরাধিকার পায়। যা বদলায় তা হলো কে হ্যান্ডশেক শুরু করার অনুমতি পায়। পাবলিক ফরওয়ার্ডে, যে কোনো হোস্ট 203.0.113.10:443-এ পৌঁছাতে পারলে TCP হ্যান্ডশেক ও TLS ClientHello পায়, আপনার অ্যাপ্লিকেশন অনুমোদন আদৌ দেখা হওয়ার আগেই। শুধু টানেল অ্যাক্সেসে, লিসেনারে পৌঁছানো যায় কেবল সেই ঠিকানা থেকে যা গেটওয়ে টানেলে রুট করে, আর অপরিচিতের SYN গেটওয়ে নীতিতে মারা যায়।

এই পার্থক্য পৌঁছানোর সক্ষমতা নিয়ে, গোপনীয়তা নিয়ে নয়। ফরওয়ার্ড করা HTTPS সার্ভিস প্লেইনটেক্সট নয়, আর VPN অ্যাপ্লিকেশন প্রমাণীকরণের প্রয়োজন মেটায় না: টানেল ভর্তি হওয়া উত্তর দেয় কোনো ডিভাইস এই নেটওয়ার্কে প্যাকেট পাঠাতে পারে কি না, আর ফাইল অ্যাপ্লিকেশন উত্তর দেয় কোনো ব্যবহারকারী নথি পড়তে পারে কি না। দুটোকে গুলিয়ে ফেলাই দলগুলোকে একটি VPN এনে দেয় যা পুরো LAN দেয় আর একটি অ্যাপ্লিকেশন দেয় একটিমাত্র ভাগ করা পাসওয়ার্ড দিয়ে।

লিসেনার আর নীতি আলাদা করে দেখুন, কারণ দুটোর যেকোনোটি আপনার ধারণার চেয়ে প্রশস্ত হতে পারে:

sudo ss -ltnp 'sport = :443'
sudo nft list ruleset
openssl s_client -connect 203.0.113.10:443 -servername files.example.com </dev/null

যদি ss দেখায় লিসেনার 0.0.0.0-এ বাঁধা, তবে অ্যাপ্লিকেশনটি সেখানে থেকেই পৌঁছানো যায় যেখানে রাউটিং ও ফায়ারওয়াল নীতি অনুমতি দেয়, আর ফরওয়ার্ড কেবল ঢোকার একটি উপায়। প্রাইভেট ঠিকানায় বাঁধা, বা ফায়ারওয়ালে উৎসের পরিসর সীমিত করা, VPN বেছে নেওয়ার থেকে আলাদা সিদ্ধান্ত, এবং সেটিই প্রকৃতপক্ষে প্রকাশ কমায়।

পথ মাপুন, লেবেল নয়

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

curl -sS -o /dev/null -w '%{time_connect} %{time_appconnect} %{time_total}\n' \
  https://files.example.com/report.pdf
mtr -rwc 20 203.0.113.10
mtr -rwc 20 10.20.30.40

এই সংখ্যাগুলো সংযোগ স্থাপনকে স্থানান্তরের সময় থেকে আলাদা করে, যা গুরুত্বপূর্ণ কারণ দুটি পথ সাধারণত সাইফার খরচে নয়, রাউন্ড-ট্রিপ বিলম্ব ও MTU-তে আলাদা হয়। TLS-এর কাজ দুই নকশাতেই প্রান্তে ঘটে, আর টানেল এনক্যাপসুলেশন, ভিন্ন রুট এবং সম্ভবত ব্যস্ততর গেটওয়ে যোগ করে। টানেলের পথ দীর্ঘ হলে বা তার গেটওয়ে বোঝাই হলে, পার্থক্যটি পথের, এনক্রিপশন শব্দের নয়।

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

নকশাকে সমাপ্ত বলার আগে চারটি বিষয় নিশ্চিত করুন: লিসেনার কোন ঠিকানায় বাঁধা, কোন নিয়ম বা রুট প্যাকেটটিকে ভিতরে নেয়, ক্লায়েন্টের প্রকৃত ঠিকানা থেকে ফেরার পথ কাজ করে কি না, এবং বড় পেলোড MTU পার হয় কি না। এগুলোর প্রতিটির জন্য উপরে একটি কমান্ড আছে, আর কোনোটিরই উত্তর «নিরাপদ» শব্দ বা ব্যান্ডউইথ চার্ট নয়।

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