tourze / workerman-sni-proxy
基于Workerman的SNI代理服务器,支持透明代理和流量转发
Installs: 1
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/tourze/workerman-sni-proxy
Requires
- php: ^8.1
- psr/log: ^3|^2|^1
- tourze/workerman-connection-pipe: ^0.0.3
- workerman/workerman: ^5.1
Requires (Dev)
- monolog/monolog: ^3.1
- phpstan/phpstan: ^2.1
This package is auto-updated.
Last update: 2025-10-31 07:58:24 UTC
README
A high-performance SNI (Server Name Indication) proxy server based on Workerman.
Features
- Parses SNI extension from client TLS handshakes to identify target hosts
- Routes connections to appropriate backend servers based on SNI hostname
- Supports whitelisting of allowed hostnames
- Provides flexible configuration options for binding address and port
- Handles connection pooling and management efficiently
- Integrates with PSR-compatible loggers (including Monolog)
- Minimal dependencies, lightweight design for optimal performance
Requirements
- PHP 8.1 or higher
- Workerman 5.1 or higher
- PSR-compatible logger (optional, Monolog recommended)
Installation
composer require tourze/workerman-sni-proxy
Quick Start
Basic Example
<?php use Tourze\Workerman\SNIProxy\SniProxyWorker; use Workerman\Worker; require_once __DIR__ . '/vendor/autoload.php'; // Create an SNI proxy worker listening on port 8443 $worker = new SniProxyWorker('0.0.0.0', 8443); // Set worker process count $worker->count = 4; // Run worker Worker::runAll();
With Host Whitelist and Logging
<?php use Monolog\Handler\StreamHandler; use Monolog\Level; use Monolog\Logger; use Tourze\Workerman\SNIProxy\SniProxyWorker; use Workerman\Worker; require_once __DIR__ . '/vendor/autoload.php'; // Initialize logger $logger = new Logger('sni-proxy'); $logger->pushHandler(new StreamHandler('php://stdout', Level::Debug)); // Whitelist of allowed hosts (format: "hostname:port") $allowedHosts = [ "www.example.com:443", "api.example.com:443" ]; // Create an SNI proxy worker with whitelist and logger $worker = new SniProxyWorker('0.0.0.0', 8443, $allowedHosts, $logger); // Set worker process count $worker->count = 4; // Run worker Worker::runAll();
Configuration
SniProxyWorker Constructor
/** * @param string $bindHost Binding address * @param int $bindPort Binding port * @param array $remoteHosts Allowed hosts list (format: ["hostname:port", ...]) * @param LoggerInterface|null $logger PSR-compatible logger instance */ public function __construct( string $bindHost = '0.0.0.0', int $bindPort = 443, array $remoteHosts = [], ?LoggerInterface $logger = null )
Configuration Options
- bindHost: The IP address to bind the proxy server (default: '0.0.0.0')
- bindPort: The port to listen on (default: 443)
- remoteHosts: Array of allowed destination hosts in "hostname:port" format
- logger: PSR-3 compatible logger for debugging and monitoring
Advanced Usage
Custom Remote Target Resolution
use Tourze\Workerman\SNIProxy\RemoteTarget; // Custom target resolution logic $worker = new SniProxyWorker('0.0.0.0', 8443); $worker->onConnect = function($connection) { // Custom connection handling };
Production Deployment
// daemon.php <?php use Workerman\Worker; use Tourze\Workerman\SNIProxy\SniProxyWorker; require_once __DIR__ . '/vendor/autoload.php'; // Run as daemon Worker::$daemonize = true; Worker::$pidFile = '/var/run/sni-proxy.pid'; Worker::$logFile = '/var/log/sni-proxy.log'; $worker = new SniProxyWorker('0.0.0.0', 443); $worker->count = 8; // 8 processes Worker::runAll();
Monitoring and Metrics
use Monolog\Handler\StreamHandler; use Monolog\Level; use Monolog\Logger; $logger = new Logger('sni-proxy'); $logger->pushHandler(new StreamHandler('/var/log/sni-proxy.log', Level::Info)); $worker = new SniProxyWorker('0.0.0.0', 8443, [], $logger); // Monitor connections $worker->onConnect = function($connection) use ($logger) { $logger->info('New connection from ' . $connection->getRemoteIp()); }; $worker->onClose = function($connection) use ($logger) { $logger->info('Connection closed from ' . $connection->getRemoteIp()); };
Use Cases
- TLS traffic routing based on domain name
- Implementing virtual hosting for HTTPS services
- SSL/TLS offloading at edge servers
- Monitoring and debugging TLS traffic
- Access control for HTTPS services
Notes
- Using port 443 requires root privileges
- For testing, use a non-privileged port like 8443
- In production, consider using systemd or supervisor to manage the process
- Performance scales with the number of worker processes
License
The MIT License (MIT). Please see License File for more information.