Node.js-এ SOCKS সকেট TLS দিয়ে মোড়ানো
socks প্যাকেজের ফেরত দেওয়া destination stream কে tls.connect দিয়ে মোড়ান এবং SNI ও সার্টিফিকেট যাচাইয়ের জন্য ওয়েবসাইটের hostname সংরক্ষণ করুন।
SocksClient.createConnection অনুরোধ করা destination-এ সংযুক্ত একটি stream ফেরত দেয়। HTTPS-এর জন্য সেই stream কে HTTP অনুরোধ বহনের আগে এখনও TLS handshake দরকার।
import { SocksClient } from 'socks';
import tls from 'node:tls';
const targetHost = 'service.example';
const info = await SocksClient.createConnection({
proxy: { host: 'proxy.example', port: 1080, type: 5 },
command: 'connect',
destination: { host: targetHost, port: 443 },
timeout: 10000,
});
const secure = tls.connect({
socket: info.socket,
servername: targetHost,
});
secure.on('error', onTransportError);
secure.on('data', onResponseBytes);
secure.once('secureConnect', () => {
secure.write(
`GET /data HTTP/1.1\r\nHost: ${targetHost}\r\nConnection: close\r\n\r\n`
);
});
SOCKS5 প্রক্সি তালিকা প্রক্সি host ও port-এর জন্য প্রার্থী জোগায়। onTransportError ও onResponseBytes বিদ্যমান অ্যাপ্লিকেশনের অংশ; দ্বিতীয়টিকে HTTP response stream পার্স করতে হবে। TLS ডেটা খণ্ডগুলি স্বাধীনভাবে সম্পূর্ণ HTTP বার্তা নয়।
servername হলো destination-এর DNS নাম। Node-এর নিম্ন-স্তরের tls.connect ডিফল্টভাবে SNI সক্রিয় করে না, আর প্রক্সি hostname ওয়েবসাইটের সার্টিফিকেট পরিচয় নয়।
সার্টিফিকেট যাচাই সক্রিয় রাখুন। সংযুক্ত সকেট সরবরাহ করলে TLS পরিচয় সংরক্ষণ করে ওয়েবসাইটে আলাদা সরাসরি সংযোগ খোলা এড়ানো যায়।
SOCKS টাইমআউট সেই আলোচনাকে সীমাবদ্ধ করে। পরবর্তী TLS ও অ্যাপ্লিকেশন বিনিময়ের জন্য এখনও কলারের নির্ধারিত টাইমআউট, বাতিলকরণ ও পরিষ্কার নীতি দরকার।