Очень много инфы перелопатил на форумах, много делал экспериментов, в итоге добавил несколько строк работающего кода, чем и поделюсь.
Делал для Socks Proxy сервера, для RDP-соединений. Работает под Indy компонентами, использую Delphi XE5.
По TidTCPServer (по какому-нить свободному порту) на обработчике OnExecute создаю динамически компонент проброса портов TidMappedPortTCP
var mRemap: TIdMappedPortTCP;
begin
mRemap := TIdMappedPortTCP.Create(Application);
mRemap.DefaultPort := 40000; //Выбираем входящий порт прокси-сервера (необходимо пробросить порт до этого компа на роутере), у меня для каждого соединения выбран свой порт
mRemap.OnConnect := MappedPortConnect; //MappedPortConnect - новый назначаемый обработчик для всех соединений при перенаправления
mRemap.Active := True;
end;
потом добавляем сам обработчик:
procedure TForm1.MappedPortConnect(AContext: TIdContext);
begin
// Обработчик один на все соединения, здесь проверка IP соединения, которое вы должны ранее сохранить куда нибудь в массив при первом соединении через порт компонента TidTCPServer
if (AContext.Binding.PeerIP = '192.168.0.1') then
with TIdTCPClient(TIdMappedPortContext(AContext).OutboundClient) do
begin
Host := 'Computername';
Port := 3389;
end;
end;