Переадресация прокси-соединений TCP в Nodejs с тысячами разных прокси-IP-адресов? - PullRequest
0 голосов
/ 25 января 2020

У меня есть сценарий использования, когда пользователям моего SaaS нужны исходящие соединения с моих серверов, чтобы получить пользовательский IP, соответствующий этому пользователю. Я изо всех сил пытаюсь придумать способ сделать это.

В этом примере есть 3 пользователя, 1 сервер и 3 пользовательских IP, обозначенных как 0.0.0.0 просто как пример. Исходящие запросы каждого клиента должны исходить от его IP-адреса, но обработка выполняется на одном сервере:

User 1 requests --> server 1 --> outbound data to different destination in new TCP request coming from 0.0.0.1
User 2 requests --> server 1 --> outbound data to different destination in new TCP request coming from 0.0.0.2
User 3 requests --> server 1 --> outbound data to different destination in new TCP request coming from 0.0.0.3

Моя теоретическая идея о том, как управлять этим, состоит в том, чтобы сервер для каждого клиента был настроен в качестве прямого прокси-сервера, такие как HAproxy или Squid. Затем, когда в мое приложение Nodejs приходят запросы, он выбирает прокси-сервер, соответствующий этому пользователю, и через него передает запрос через прокси.

Это звучит правильно, или есть гораздо лучший способ сделать это, что я пропускаю?

РЕДАКТИРОВАТЬ: Этот вопрос интересует только прямые прокси. Обратный прокси-сервер не входит в сферу этого вопроса.

1 Ответ

0 голосов
/ 25 января 2020

Относительно комментариев: если вы хотите передать nnet с одного сервера клиентам, это фактически может означать только http исходящие запросы / соединения. Поэтому, если вам нужна библиотека HTTP, подобная этой: https://github.com/request/request и установите параметр

localAddress - local interface to bind for network connections.

в соответствии с вашим исходным ip. фактически вы подключаетесь с одного сервера к произвольному IP-адресу вашего клиента.

Customer 1 => Loadbalancer => Server 1 (sends ok response) => Server 1 starts a new onnection to the customer with 0.0.0.1. 

Важно, однако, что вы делаете ответ (с указанием клиента c IP) на хосте, на котором находится loadbalancer. Вы можете отправлять запросы только с IP-адреса, если этому хосту назначен этот IP-адрес.

Cust1        LB      
       +---> IPs    +---> server
Cust2        0.0.0.1     1.1.1.1   1.Connection from User. Server stores the request and answeres with 200 OK Status. 
^            0.0.0.2        +      2.Server does processing
|            ....           |
|                           |      3.Server has completed processing and sends response to customer
|          +----------+     |      by connecting to your own proxy with the paylod  to send to the customer. the payload must contain the ip it should send the data to, as well as the "real/actutal" data. Or you can pass the ip in custom http headers.
           |Listening:|     |
+--------+ |2.2.2.2   |<----+
           |out:      |
           |0.0.0.1   |
           |0.0.0.2   |
           |...       |
           +----------+
                4. Your proxy does an outgoing connection to the customer and sends your data/paylod it received. 

            Your proxy:
            1. Needs to be running on your LB-Host (to share the IPS)
            2. Listing on arbitrary port and IP like http://2.2.2.2:8811/rest/connecttocustomer (but not on the ones already taken by LB)
            3. Your proxy uses an HTTP Library and connects to your customer http.request(dest=4.4.4.4, source=0.0.0.1, "send  this data")
            4. Your proxy is a simple nodejs App that has an arbitrary API (see 2.) and then does the outgoing request to the customer (see 3.). 
            You can implement it as a dump proxy that only listens on an api from incoming requests from your server and then connects (with a new(!) request) to your customer (as above). But you can also implement it more complex as some kind of queue/async system and outbound notifcation system (so it might contain more logic).
...