Сервер Indy TIdSocksServer не перенаправляет трафик

#delphi #indy #socks

#delphi #indy #Носки

Вопрос:

Я пытаюсь создать сервер SOCKS 4/5, и я хотел бы использовать компонент Indy TIdSocksServer в качестве основы. Это кажется достаточно простым и простым в использовании, но я, должно быть, что-то упускаю.

Я поместил a TIdSocksServer в новую форму и настроил следующее:

  • Активный: True
  • AllowSocks4: True
  • AllowSocks5: True
  • Привязки: 0.0.0.0:43334
  • Порт по умолчанию: 80
  • Перехват: null
  • IOHandler: null

Я добавил код для отображения 'connect' TMemo при подключении:

 procedure TForm1.IdSocksServer1Connect(AContext: TIdContext);
begin
  Memo1.Lines.Add('connect');
end;
  

Я настроил прокси-цепочки на хосте Linux:

/etc/proxychains.conf

 ...
socks5 10.0.0.56 43334
  

Когда я запускаю приложение и пытаюсь подключиться с помощью прокси-цепей, я получаю следующую ошибку:

 kelly@ubuntu:~/home$ proxychains curl www.google.com
ProxyChains-3.1 (http://proxychains.sf.net)
|DNS-request| www.google.com
|S-chain|-<>-10.0.0.56:43334-<><>-4.2.2.2:53-<--timeout
|DNS-response|: www.google.com does not exist
curl: (6) Could not resolve host: www.google.com
  

Я могу подтвердить, что соединение установлено, потому что текст 'connect' добавляется в заметку. Я также использовал Wireshark и наблюдал трехстороннее рукопожатие и разрыв связи между моим хостом Ubuntu и хостом Windows.

Похоже, проблема в том, что трафик поступает на SOCKS-сервер, но не перенаправляется. Я признаю, что это абсолютный минимальный код, но у меня сложилось впечатление, что TIdSocksServer компонент позаботится о пересылке трафика, и я бы добавил вспомогательные функции, такие как проверка учетных данных для SOCKS5 и т.д.

Комментарии:

1. Ошибка жалуется на тайм-аут. Серверы Indy TCP являются многопоточными, такие события, как OnConnect запускаются в рабочих потоках, и небезопасно получать доступ к элементам управления пользовательского интерфейса VCL / FMX извне основного потока пользовательского интерфейса, поэтому вы вполне можете вызвать взаимоблокировку. Проблема исчезнет, если вы удалите сообщение Memo или, по крайней мере, правильно синхронизируете его с основным потоком пользовательского интерфейса?

2. Можете ли вы обеспечить перехват соединения Wireshark между прокси-цепями и TIdSocksServer ? Как далеко на самом деле достигает трафик SOCKS до сбоя? Запускается ли OnBeforeSocksConnect событие с VHost установленным для него параметром ’www.google.com’ ? Запускается ли OnException событие?

3. Спасибо, Реми. Ваш первый комментарий выявил проблему. Проблема исчезла, как только я удалил доступ к TMemo.

Ответ №1:

Реми определил проблему с моим кодом. Чтобы убедиться, что сервер получает соединения, я добавил процедуру, которая выполняла запись в компонент TMemo, что вызывало взаимоблокировку. Чтобы исправить ошибку, все, что мне нужно было сделать, это удалить процедуру, которая обновляла компонент TMemo. Работает, как и ожидалось.

Комментарии:

1. Чтобы TMemo получить безопасный доступ к событиям сервера, вам просто нужно синхронизироваться с основным потоком пользовательского интерфейса, например, через TThread.Synchronize() / TIdSync , TThread.Queue() / TIdNotify или любое другое взаимодействие между потоками по вашему выбору.