【发布时间】: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 访问权限后问题就消失了。