【问题标题】:Indy TIdSocksServer not forwarding trafficIndy TIdSocksServer 不转发流量
【发布时间】:2020-11-07 05:04:05
【问题描述】:

我正在尝试创建一个 SOCKS 4/5 服务器,并且我想使用 Indy TIdSocksServer 组件作为基础。它看起来很直接且易于使用,但我一定遗漏了一些东西。

我将TIdSocksServer 放到一个新表单上并配置了以下内容:

  • 有效:正确
  • AllowSocks4:真
  • AllowSocks5:真
  • 绑定:0.0.0.0:43334
  • 默认端口:80
  • 拦截:null
  • IOHandler:空

我添加了代码以在连接时在TMemo 中显示'connect'

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

我在 Linux 主机上配置了 ProxyChains:

/etc/proxychains.conf

...
socks5 10.0.0.56 43334

当我执行应用程序并尝试使用 ProxyChains 连接时,我收到以下错误:

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 的凭据等。

【问题讨论】:

  • 错误是抱怨超时。 Indy TCP 服务器是多线程的,像OnConnect 这样的事件是在工作线程中触发的,从主 UI 线程之外访问 VCL/FMX UI 控件是不安全的,所以你很可能会导致死锁。如果您删除备忘录消息,问题是否会消失,或者至少将其正确同步到主 UI 线程?
  • 能否提供 Wireshark 捕获的 ProxyChains 和 TIdSocksServer 之间的连接? SOCKS 流量在失败前实际到达多远? OnBeforeSocksConnect 事件是否在其VHost 参数设置为’www.google.com’ 的情况下被触发? OnException 事件是否被触发?
  • 谢谢雷米。您的第一条评论指出了这个问题。删除 TMemo 访问权限后问题就消失了。

标签: delphi indy socks


【解决方案1】:

Remy 发现我的代码存在问题。为了验证服务器是否正在接收连接,我添加了一个写入 TMemo 组件的过程,这会导致死锁。要修复错误,我所要做的就是删除更新 TMemo 组件的过程。按预期工作。

【讨论】:

  • 要在服务器的事件中安全地访问TMemo,你只需要与主UI线程同步,例如通过TThread.Synchronize()/TIdSyncTThread.Queue()/TIdNotify,或您选择的任何其他线程间通信。
猜你喜欢
  • 2010-10-08
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 2014-07-05
  • 2017-10-08
  • 2021-04-25
相关资源
最近更新 更多