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 proxy ତାଲିକା proxy host ଓ port ପାଇଁ ପ୍ରାର୍ଥୀ ଯୋଗାଏ। onTransportError ଓ onResponseBytes ବିଦ୍ୟମାନ ଆପ୍ଲିକେସନର; ଦ୍ୱିତୀୟଟି HTTP response stream କୁ ବିଶ୍ଳେଷଣ କରିବ। TLS ଡାଟା ଖଣ୍ଡଗୁଡ଼ିକ ସ୍ୱାଧୀନ ଭାବରେ ସମ୍ପୂର୍ଣ୍ଣ HTTP ସନ୍ଦେଶ ନୁହେଁ।
servername ହେଉଛି destination ର DNS ନାମ। Node ର ନିମ୍ନ-ସ୍ତରୀୟ tls.connect ଡିଫଲ୍ଟ ଭାବରେ SNI ସକ୍ରିୟ କରେ ନାହିଁ, ଏବଂ proxy hostname ୱେବସାଇଟର ସାର୍ଟିଫିକେଟ୍ ପରିଚୟ ନୁହେଁ।
ସାର୍ଟିଫିକେଟ୍ ଯାଞ୍ଚ ଚାଲୁ ରଖନ୍ତୁ। ସଂଯୁକ୍ତ socket ଦେବା ଦ୍ୱାରା TLS ପରିଚୟ ରକ୍ଷା କରି ୱେବସାଇଟକୁ ଅଲଗା ସିଧା ସଂଯୋଗ ଖୋଲିବା ଏଡ଼ାଯାଏ।
SOCKS timeout ସେହି ଆଲୋଚନାକୁ ସୀମିତ କରେ। ପରବର୍ତ୍ତୀ TLS ଓ ଆପ୍ଲିକେସନ ବିନିମୟ ପାଇଁ ଏବେ ମଧ୍ୟ କଲରର ଉଦ୍ଦିଷ୍ଟ timeout, ବାତିଲ ଓ ସଫାଇ ନୀତି ଆବଶ୍ୟକ।