clue/socks-server

该包已被废弃,不再维护。作者建议使用clue/socks-react包代替。

异步SOCKS代理服务器(SOCKS4、SOCKS4a和SOCKS5),基于React PHP构建

v0.7.0 2017-04-14 15:08 UTC

This package is not auto-updated.

Last update: 2022-02-01 13:02:45 UTC


README

此包已合并到clue/socks-react中,仅为了向后兼容。

$ composer require clue/socks-react

如果您之前使用此包构建SOCKS服务器,升级不会超过几分钟。所有类都已直接从最新的v0.7.0版本合并,没有其他更改,因此您可以简单地将代码更新为使用更新的命名空间,如下所示

// old from clue/socks-server
$server = new Clue\React\Socks\Server\Server($loop, $socket);

// new
$server = new Clue\React\Socks\Server($loop, $socket);

有关更多详细信息,请参阅https://github.com/clue/php-socks-react

以下文档适用于本包的最后一个版本。未来的开发将在更新的clue/socks-react中进行,因此强烈建议您尽快升级。

旧的clue/socks-server Build Status

异步SOCKS代理服务器(SOCKS4、SOCKS4a和SOCKS5),基于React PHP构建。

SOCKS协议族可以用来轻松地隧道TCP连接,而不管实际的应用层协议是什么,如HTTP、SMTP、IMAP、Telnet等。

目录

快速入门示例

安装后,您可以使用以下代码创建一个监听在localhost:1080上的SOCKS代理服务器

$loop = React\EventLoop\Factory::create();

// listen on localhost:1080
$socket = new Socket($loop);
$socket->listen(1080,'localhost');

// start a new server listening for incoming connection on the given socket
$server = new Server($loop, $socket);

$loop->run();

有关示例,请参阅这里

用法

服务器

Server 负责接受来自SOCKS客户端的传入通信,并将请求的连接转发到目标主机。它还与主EventLoop和底层的TCP/IP套接字服务器注册一切

$loop = \React\EventLoop\Factory::create();

// listen on localhost:$port
$socket = new Socket($loop);
$socket->listen($port,'localhost');

$server = new Server($loop, $socket);

如果您需要自定义连接器设置(DNS解析、超时等),您可以显式传递一个自定义的ConnectorInterface实例

// use local DNS server
$dnsResolverFactory = new DnsFactory();
$resolver = $dnsResolverFactory->createCached('127.0.0.1', $loop);

// outgoing connections to target host via interface 192.168.10.1
$connector = new DnsConnector(
    new TcpConnector($loop, array('bindto' => '192.168.10.1:0')),
    $resolver
);

$server = new Server($loop, $socket, $connector);

协议版本

默认情况下,Server支持所有协议版本(SOCKS4、SOCKS4a和SOCKS5)。

虽然 SOCKS4 已经支持(一定程度有限)SOCKS BIND 请求,而 SOCKS5 增加了通用 UDP 支持(SOCKS UDPASSOCIATE),但这个库专注于最常用的核心功能 SOCKS CONNECT。在这种模式下,SOCKS 服务器充当一个通用代理,允许高级应用协议通过它工作。

SOCKS4 SOCKS4a SOCKS5
协议规范 SOCKS4.protocol SOCKS4A.protocol RFC 1928
隧道外发 TCP 连接
远程 DNS 解析
IPv6 地址
用户名/密码认证 ✓(根据RFC 1929
握手 # 轮次 1 1 2(带认证的 3 次)
握手流量
+ 远程 DNS
17 字节
17 字节
+ 主机名 + 1
可变(+ 认证 + IPv6)
+ 主机名 - 3

注意,这不是完整的 SOCKS5 实现,因为缺少 GSSAPI 认证(但您很可能不会注意到这一点)。

如果要显式设置协议版本,请使用支持的值 44a5

$server->setProtocolVersion(5);

为了将协议版本重置为其默认值(即自动检测),请使用 null 作为协议版本。

$server->setProtocolVersion(null);

认证

默认情况下,Server 不需要从客户端进行任何认证。您可以选择启用认证支持,以便在转发任何连接之前,客户端需要传递有效的用户名和密码。

Server 上设置认证强制要求每个进一步连接的客户端使用协议版本 5(SOCKS5)。如果客户端尝试使用任何其他协议版本,不发送认证细节,或者如果认证细节无法验证,则连接将被拒绝。

因为您的认证机制可能需要一些时间来实际检查提供的认证凭据(例如查询远程数据库或 web 服务),服务器端使用基于 Promise 的接口。虽然这最初可能看起来很复杂,但实际上它提供了处理非阻塞连接的一种非常简单的方法,并提高了整体性能。

$server->setAuth(function ($username, $password) {
    // either return a boolean success value right away
    // or use promises for delayed authentication
});

或者,如果您只接受静态认证细节,可以使用基于简单数组的认证方法作为快捷方式

$server->setAuthArray(array(
    'tom' => 'password',
    'admin' => 'root'
));

请参阅第二个示例

如果您不想再使用认证

$server->unsetAuth();

代理链

Server 负责创建与目标主机的连接。

Client -> SocksServer -> TargetHost

有时可能需要通过另一个 SOCKS 服务器建立外发连接。例如,如果您的目标 SOCKS 服务器需要认证,但您的客户端不支持发送认证信息(例如,大多数网页浏览器),这可能很有用。

Client -> MiddlemanSocksServer -> TargetSocksServer -> TargetHost

Server 使用 ConnectorInterface 的任何实例来建立外发连接。为了通过另一个 SOCKS 服务器连接,您可以使用以下 SOCKS 客户端包中的 SOCKS 连接器

$ composer require clue/socks-react:^0.7

您现在可以像这样创建一个 SOCKS Client 实例

// set next SOCKS server localhost:$targetPort as target
$connector = new React\Socket\TcpConnector($loop);
$client = new Clue\React\Socks\Client('user:pass@127.0.0.1:' . $targetPort, $connector);

// listen on localhost:$middlemanPort
$socket = new Socket($loop);
$socket->listen($middlemanPort, 'localhost');

// start a new server which forwards all connections to the other SOCKS server
$server = new Server($loop, $socket, $client);

请参阅示例 #11

代理链可以在服务器端和/或客户端发生

  • 如果您要求客户端通过多个代理进行链式连接,则每个代理服务器实际上对链式连接一无所知。这意味着这是客户端的唯一属性,不是本项目的一部分。例如,您可以在配套的 SOCKS 客户端项目 clue/socks-react 中找到这一点。

  • 如果您要求服务器通过另一个代理进行链式操作,那么您的客户端实际上对链式操作一无所知。这意味着这是一个仅服务器端的属性,可以像上面那样实现。

安装

安装此库的推荐方法是通过Composer。您对Composer不熟悉吗?Composer入门?

这将安装最新支持的版本

$ composer require clue/socks-server:^0.7

有关版本升级的详细信息,请参阅变更日志

测试

要运行测试套件,您首先需要克隆此存储库,然后通过Composer安装所有依赖项(通过Composer)

$ composer install

要运行测试套件,请转到项目根目录并运行

$ php vendor/bin/phpunit

许可证

MIT,请参阅LICENSE

更多信息

  • 如果您正在寻找面向最终用户的SOCKS服务器守护进程,您可能希望使用clue/psocksd
  • 如果您正在寻找SOCKS客户端实现,请考虑使用clue/socks-react