curl socks5h বনাম socks5: হোস্টনেম কে রিজলভ করে
অতিরিক্ত অক্ষরটি DNS লুকআপ সরায়, এনক্রিপশন নয়। দুই ফর্মই তুলনা করুন, তারপর দেখুন কোন হোস্টনেমের এখনও স্থানীয় রিজলভার দরকার।
মানুষ socks5h কে socks5 এর আরও সহজ বানান হিসেবে ধরে নেয়, এবং আশা করে দুটোই একই অনুরোধ একই জায়গায় পাঠাবে। অতিরিক্ত অক্ষরটি বরং DNS লুকআপ সরিয়ে দেয়। যে মেশিনে রিজলভার আর প্রক্সি আলাদা নেটওয়ার্কে থাকে, সেখানে এটি কাজ করা অনুরোধ আর ব্যর্থ হওয়া অনুরোধের মধ্যে পার্থক্য।
একটি অক্ষর, দুই রিজলভার
স্কিমটি ঠিক করে গন্তব্যের নামটি কোথায় ঠিকানায় পরিণত হয়। স্থানীয় রিজলিউশন আপনার মেশিনে কনফিগার করা রিজলভার ব্যবহার করে। দূরবর্তী রিজলিউশন হোস্টনেমটি SOCKS অনুরোধের ভিতরে রাখে, এবং প্রক্সি তার নিজের রিজলভার ও নেটওয়ার্ক সম্পর্কে নিজের দৃষ্টিভঙ্গি দিয়ে সেটি খোঁজে। দুই ফর্মই এখনও একই পোর্টে একই প্রক্সি ঠিকানায় সংযোগ করে, তাই পার্থক্যটি অনুরোধের বডিতে, পথে নয়।
স্কিমে কিছুই এনক্রিপশন বা প্রমাণীকরণ বদলায় না; শুধু DNS পথটি সরে। তাই অক্ষরটি উপেক্ষা করা সহজ আর ভুল করা ব্যয়বহুল।
একই প্রক্সি, ভিন্ন অনুরোধ
দুই কল একটিমাত্র অক্ষরে আলাদা। বাকি সব দিক থেকে তারা অভিন্ন:
curl --proxy socks5://proxy.example:1080 https://service.example/
curl --proxy socks5h://proxy.example:1080 https://service.example/The curl প্রক্সি রেফারেন্স এই স্কিমগুলো আলাদাভাবে নথিভুক্ত করে, আর এটাই তাদের উপনাম হিসেবে না ধরার প্রামাণ্য কারণ। আপনার ব্যবহারের অনুমতি আছে এমন নিরীহ একটি এন্ডপয়েন্টের বিরুদ্ধে দুটোই চালান এবং পার্থক্যটি পড়ুন। সফল দূরবর্তী লুকআপ অন্য অ্যাপ্লিকেশন সম্পর্কে কিছুই বলে না, কারণ ব্রাউজার, প্যাকেজ ম্যানেজার আর ভাষার রানটাইম প্রত্যেকে নিজের জন্য বেছে নেয়।
প্রক্সির নিজের নাম স্থানীয়ভাবে রিজলভ হয়
সেই কমান্ডে অন্য কিছুর আগে proxy.example-কে ঠিকানায় পরিণত হতে হয়, আর সেই লুকআপ সবসময় স্থানীয়। service.example-এর রিজলিউশন প্রক্সিতে সরালে প্রক্সির নিজের নামের জন্য কিছুই হয় না, কারণ তার এখনও এমন রিজলভার দরকার যা আপনার মেশিন পৌঁছাতে পারে। এখানেই VPN চিত্রটি বদলায়।
প্রক্সির নাম যদি শুধু টানেলের ভিতরে রিজলভ হয়, তাহলে curl শুরুর আগে টানেল চালু থাকার উপর সংযোগটি নির্ভর করে। তখন কোন স্কিম জিতবে তা নির্ভর করে কোন পক্ষ উত্তর দিতে পারে তার উপর। যখন আপনার মেশিন গন্তব্য রিজলভ করতে পারে না কিন্তু প্রক্সি পারে, তখন socks5 ব্যর্থ হয় আর socks5h সফল হয়। যখন আপনার মেশিন টানেলের মাধ্যমে সেটি রিজলভ করে কিন্তু প্রক্সি পারে না, তখন socks5 কাজ করে আর socks5h ব্যর্থ হয়।
স্কিমটি প্রক্সির সাথে সংযোগকে VPN-এর ভিতরে বা বাইরে রাখে না; রাউটিং টেবিল সেটি করে, আর স্কিম তা কখনও দেখে না। তাই একটি টানেল একই মেশিনে একটি স্কিম ঠিক করতে পারে আর অন্যটি ভাঙতে পারে। অক্ষরটি শুধু ঠিক করে কে প্রশ্নটি করবে।
প্রতিটি পক্ষ কী রিজলভ করতে পারে
একটি পাবলিক প্রক্সি কেবল-কোম্পানির নাম রিজলভ করতে পারে না, তাই তাকে হোস্টনেম পাঠালে প্রক্সিতে ব্যর্থ হয় এবং স্থানীয় DNS ত্রুটি হিসেবে নয়, প্রক্সি ত্রুটি হিসেবে প্রকাশ পায়। একই প্রাইভেট নেটওয়ার্কের ভিতরের প্রক্সি সাধারণত সেই নামগুলো রিজলভ করতে পারে, আর এখানেই socks5h নিজের জায়গা করে নেয়। আপনি যে নীতিটি সত্যিই দরকার সেটি থেকেই রিজলভারের অবস্থান বেছে নিন, কারণ দূরবর্তী DNS স্বয়ংক্রিয়ভাবে বেশি সক্ষম নয় এবং এটি নামটি তৃতীয় পক্ষের কাছে দিয়ে দেয়। পাবলিক গন্তব্যের জন্য দুই ফর্মই কাজ করে, তাই আপনার অন্য টুলগুলো ইতিমধ্যে যেটি ব্যবহার করে সেটিকেই প্রাধান্য দিন।
সেই সিদ্ধান্তটি মন্তব্যে নয়, রানবুকে লিখুন, এবং শংসাপত্রগুলো ভাগ করা হিস্ট্রি ও ডায়াগনস্টিক আউটপুটের বাইরে রাখুন। তারপর একবারে একটি ভেরিয়েবল বদলান: একই গন্তব্য, একই বাইনারি, একই রিজলভার, একটি অক্ষর।
কোন বাইনারি উত্তর দিল
একই মেশিনে দুটি curl বাইনারি সংস্করণ ও বিল্ড বৈশিষ্ট্যে আলাদা হতে পারে। Unix-সদৃশ শেলে type -a curl পথের প্রতিটি মিল তালিকাভুক্ত করে আর curl --version যে বাইনারিটি চলবে তার বৈশিষ্ট্য দেখায়। পথের আগে থাকা একটি মোড়ক স্ক্রিপ্ট বা উপনামই সাধারণ কারণ যার জন্য ফলাফল আপনার পরীক্ষা করার কথা ভাবা বাইনারির সাথে মেলে না।
অসমর্থিত স্কিম, যে প্রক্সি নামটি রিজলভ করতে পারে না, আর যে গন্তব্যে পৌঁছানো যায় না — এগুলো তিনটি ভিন্ন ত্রুটি, তাই অক্ষর বদলানোর আগে বার্তাটি পড়ুন। socks5h সিনট্যাক্স ছাড়া বিল্ড প্রক্সি স্ট্রিংটিকে অসমর্থিত হিসেবে রিপোর্ট করে, যা রিজলভ করতে ব্যর্থ নামের সমান নয়। সিস্টেম curl সম্পর্কে একটি পুরোনো প্রতিবেদনকে প্রতিটি প্ল্যাটফর্মের স্থায়ী নিয়মে পরিণত করবেন না।