在nodejs上通过代理的TCP套接字客户端

问题描述 投票:0回答:4

我需要与 smtp 服务器建立 tcp 套接字连接。是否可以通过nodejs上的代理服务器连接?有可用的 npm 模块吗?我根本没找到。

var net = require('net');

var HOST = '127.0.0.1';
var PORT = 6969;

var client = new net.Socket();
client.connect(PORT, HOST, function() {
    console.log('CONNECTED TO: ' + HOST + ':' + PORT);
    client.write('I am here!');
});

// Add a 'data' event handler for the client socket
// data is what the server sent to this socket
client.on('data', function(data) {

    console.log('DATA: ' + data);

});

// Add a 'close' event handler for the client socket
client.on('close', function() {
    console.log('Connection closed');
});
node.js network-programming
4个回答
1
投票

net.socket
tls.connect
dgram
没有代理支持。

将其与代理一起使用的最简单方法是将一些 libc 函数替换为

proxychains
或类似的东西。

var client = require('tls')
.connect(443, 'www.facebook.com', function() {
  console.log('connected');
  client.write('hello');
})
.on('data', function(data) {
  console.log('received', data.toString());
})
.on('close', function() {
  console.log('closed');
});

代理链节点 fit.js

connected
received HTTP/1.1 400 Bad Request
...
closed

0
投票

除了“net”之外,只要代理服务器支持 HTTPS 流量,您不需要另一个模块来使套接字通过代理服务器连接到主机。

  1. 创建与代理服务器的套接字连接
  2. 发送 HTTP CONNECT 消息,通知代理服务器您要连接的主机和端口
  3. 如果代理服务器响应 HTTP 200 响应,则代理服务器与所需目标建立了套接字连接,并且现在正在中继套接字之间的流量
  4. 如果代理服务器响应的 HTTP 响应不是 200,则连接未建立。

尽管此过程以 HTTP 开始,但这并不意味着它不适用于 SMTP 流量。初始 HTTP 消息仅用于协商连接,之后只是原始流量。代理服务器可能会查看您想要连接的端口或主机并禁止它。例如,阻止与低于 80 或低于 443 的端口(例如端口 25)的连接,因此是否允许连接实际上取决于代理服务器。


0
投票

我将this文章改造成更现代的东西,它只使用NodeJS中内置的

net
包。

const net = require('net')

class ProxyClient {
    constructor(config) {
        this.config = config
    }

    async setup() {
        const { proxyClient } = this.config
        if (!proxyClient) {
            return
        }
        const { localPort, remoteHost, remotePort } = proxyClient
        console.info(`[ProxyClient] Starting ODBC proxy to ${remoteHost}:${remotePort} on local port ${localPort}...`)
        console.info('[ProxyClient] Opening service socket to remote host...')
        const serviceSocket = await new Promise(resolve => {
            const socket = new net.Socket()
            socket.connect(remotePort, remoteHost, () => resolve(socket))
        })
        console.info('[ProxyClient] Service socket to remote host opened.')
        console.info('[ProxyClient] Creating the local proxy server...')
        await new Promise(resolve => {
            const server = net.createServer(proxyServerSocket => {
                proxyServerSocket.on('data', message => {
                    serviceSocket.write(message)
                })
                serviceSocket.on('data', message => {
                    proxyServerSocket.write(message)
                })
            })
            server.listen(localPort, '0.0.0.0', () => resolve())
        })
        console.info('[ProxyClient] Local proxy server created.')
        console.info(`[ProxyClient] ODBC proxy to ${remoteHost}:${remotePort} on local port ${localPort} started successfully.`)
    }
}

module.exports = ProxyClient


-1
投票

是的,可以使用以下 NPM 模块之一:

http-proxy-agent:HTTP 端点的 HTTP 代理 http.Agent 实现

https-proxy-agent:HTTPS 端点的 HTTP(s) 代理 http.Agent 实现

pac-proxy-agent:HTTP 和 HTTPS 的 PAC 文件代理 http.Agent 实现

socks-proxy-agent:HTTP 和 HTTPS 的 SOCKS (v4a) 代理 http.Agent 实现

HTTPS 代理示例:

var url = require('url');
var WebSocket = require('ws');
var HttpsProxyAgent = require('https-proxy-agent');

// HTTP/HTTPS proxy to connect to
var proxy = process.env.http_proxy || 'http://168.63.76.32:3128';
console.log('using proxy server %j', proxy);

// WebSocket endpoint for the proxy to connect to
var endpoint = process.argv[2] || 'ws://echo.websocket.org';
var parsed = url.parse(endpoint);
console.log('attempting to connect to WebSocket %j', endpoint);

// create an instance of the `HttpsProxyAgent` class with the proxy server information
var opts = url.parse(proxy);

var agent = new HttpsProxyAgent(opts);

// finally, initiate the WebSocket connection
var socket = new WebSocket(endpoint, { agent: agent });

socket.on('open', function () {
  console.log('"open" event!');
  socket.send('hello world');
});

socket.on('message', function (data, flags) {
  console.log('"message" event! %j %j', data, flags);
  socket.close();
});

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.