clue / socks-server
Requires
- php: >=5.3
- evenement/evenement: ~1.0|~2.0
- react/event-loop: 0.3.*|0.4.*
- react/promise: ^2.1 || ^1.2
- react/socket: ^0.7
- react/stream: ^0.6 || ^0.5 || ^0.4.2
Requires (Dev)
- clue/connection-manager-extra: ^0.7
- phpunit/phpunit: ^5.0 || ^4.8
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 
异步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 认证(但您很可能不会注意到这一点)。
如果要显式设置协议版本,请使用支持的值 4
、4a
或 5
$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。