#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
или любое другое взаимодействие между потоками по вашему выбору.