@push.rocks/smartproxy 22.6.0 → 23.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/changelog.md +18 -0
  2. package/dist_rust/{rustproxy → rustproxy_linux_amd64} +0 -0
  3. package/dist_rust/rustproxy_linux_arm64 +0 -0
  4. package/dist_ts/00_commitinfo_data.js +1 -1
  5. package/dist_ts/index.d.ts +0 -1
  6. package/dist_ts/index.js +1 -3
  7. package/dist_ts/plugins.d.ts +2 -1
  8. package/dist_ts/plugins.js +3 -2
  9. package/dist_ts/proxies/index.d.ts +0 -1
  10. package/dist_ts/proxies/index.js +1 -3
  11. package/dist_ts/proxies/smart-proxy/models/route-types.js +1 -1
  12. package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.d.ts +9 -21
  13. package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.js +83 -212
  14. package/dist_ts/proxies/smart-proxy/smart-proxy.js +2 -3
  15. package/npmextra.json +3 -0
  16. package/package.json +13 -11
  17. package/readme.md +35 -31
  18. package/ts/00_commitinfo_data.ts +1 -1
  19. package/ts/index.ts +0 -3
  20. package/ts/plugins.ts +2 -0
  21. package/ts/proxies/index.ts +0 -3
  22. package/ts/proxies/smart-proxy/models/route-types.ts +0 -2
  23. package/ts/proxies/smart-proxy/rust-proxy-bridge.ts +102 -233
  24. package/ts/proxies/smart-proxy/smart-proxy.ts +1 -2
  25. package/dist_ts/common/eventUtils.d.ts +0 -14
  26. package/dist_ts/common/eventUtils.js +0 -20
  27. package/dist_ts/common/types.d.ts +0 -82
  28. package/dist_ts/common/types.js +0 -15
  29. package/dist_ts/core/utils/event-system.d.ts +0 -200
  30. package/dist_ts/core/utils/event-system.js +0 -224
  31. package/dist_ts/core/utils/event-utils.d.ts +0 -15
  32. package/dist_ts/core/utils/event-utils.js +0 -11
  33. package/dist_ts/core/utils/route-manager.d.ts +0 -88
  34. package/dist_ts/core/utils/route-manager.js +0 -342
  35. package/dist_ts/core/utils/route-utils.d.ts +0 -28
  36. package/dist_ts/core/utils/route-utils.js +0 -67
  37. package/dist_ts/detection/detectors/http-detector-v2.d.ts +0 -33
  38. package/dist_ts/detection/detectors/http-detector-v2.js +0 -87
  39. package/dist_ts/detection/detectors/tls-detector-v2.d.ts +0 -33
  40. package/dist_ts/detection/detectors/tls-detector-v2.js +0 -80
  41. package/dist_ts/detection/protocol-detector-v2.d.ts +0 -46
  42. package/dist_ts/detection/protocol-detector-v2.js +0 -116
  43. package/dist_ts/forwarding/config/forwarding-types.d.ts +0 -42
  44. package/dist_ts/forwarding/config/forwarding-types.js +0 -18
  45. package/dist_ts/forwarding/config/index.d.ts +0 -9
  46. package/dist_ts/forwarding/config/index.js +0 -10
  47. package/dist_ts/forwarding/factory/forwarding-factory.d.ts +0 -25
  48. package/dist_ts/forwarding/factory/forwarding-factory.js +0 -172
  49. package/dist_ts/forwarding/factory/index.d.ts +0 -4
  50. package/dist_ts/forwarding/factory/index.js +0 -5
  51. package/dist_ts/forwarding/handlers/base-handler.d.ts +0 -62
  52. package/dist_ts/forwarding/handlers/base-handler.js +0 -121
  53. package/dist_ts/forwarding/handlers/http-handler.d.ts +0 -30
  54. package/dist_ts/forwarding/handlers/http-handler.js +0 -143
  55. package/dist_ts/forwarding/handlers/https-passthrough-handler.d.ts +0 -29
  56. package/dist_ts/forwarding/handlers/https-passthrough-handler.js +0 -156
  57. package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.d.ts +0 -36
  58. package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.js +0 -276
  59. package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.d.ts +0 -35
  60. package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.js +0 -261
  61. package/dist_ts/forwarding/handlers/index.d.ts +0 -8
  62. package/dist_ts/forwarding/handlers/index.js +0 -9
  63. package/dist_ts/forwarding/index.d.ts +0 -13
  64. package/dist_ts/forwarding/index.js +0 -16
  65. package/dist_ts/http/index.d.ts +0 -5
  66. package/dist_ts/http/index.js +0 -8
  67. package/dist_ts/http/models/http-types.d.ts +0 -6
  68. package/dist_ts/http/models/http-types.js +0 -7
  69. package/dist_ts/http/router/index.d.ts +0 -8
  70. package/dist_ts/http/router/index.js +0 -7
  71. package/dist_ts/http/router/proxy-router.d.ts +0 -115
  72. package/dist_ts/http/router/proxy-router.js +0 -325
  73. package/dist_ts/http/router/route-router.d.ts +0 -108
  74. package/dist_ts/http/router/route-router.js +0 -393
  75. package/dist_ts/protocols/tls/constants.d.ts +0 -122
  76. package/dist_ts/protocols/tls/constants.js +0 -135
  77. package/dist_ts/protocols/tls/parser.d.ts +0 -53
  78. package/dist_ts/protocols/tls/parser.js +0 -294
  79. package/dist_ts/protocols/tls/types.d.ts +0 -65
  80. package/dist_ts/protocols/tls/types.js +0 -5
  81. package/dist_ts/proxies/http-proxy/certificate-manager.d.ts +0 -95
  82. package/dist_ts/proxies/http-proxy/certificate-manager.js +0 -214
  83. package/dist_ts/proxies/http-proxy/connection-pool.d.ts +0 -47
  84. package/dist_ts/proxies/http-proxy/connection-pool.js +0 -195
  85. package/dist_ts/proxies/http-proxy/context-creator.d.ts +0 -34
  86. package/dist_ts/proxies/http-proxy/context-creator.js +0 -108
  87. package/dist_ts/proxies/http-proxy/default-certificates.d.ts +0 -54
  88. package/dist_ts/proxies/http-proxy/default-certificates.js +0 -127
  89. package/dist_ts/proxies/http-proxy/function-cache.d.ts +0 -95
  90. package/dist_ts/proxies/http-proxy/function-cache.js +0 -215
  91. package/dist_ts/proxies/http-proxy/handlers/index.d.ts +0 -4
  92. package/dist_ts/proxies/http-proxy/handlers/index.js +0 -6
  93. package/dist_ts/proxies/http-proxy/handlers/redirect-handler.d.ts +0 -18
  94. package/dist_ts/proxies/http-proxy/handlers/redirect-handler.js +0 -78
  95. package/dist_ts/proxies/http-proxy/handlers/static-handler.d.ts +0 -19
  96. package/dist_ts/proxies/http-proxy/handlers/static-handler.js +0 -211
  97. package/dist_ts/proxies/http-proxy/http-proxy.d.ts +0 -117
  98. package/dist_ts/proxies/http-proxy/http-proxy.js +0 -521
  99. package/dist_ts/proxies/http-proxy/http-request-handler.d.ts +0 -40
  100. package/dist_ts/proxies/http-proxy/http-request-handler.js +0 -257
  101. package/dist_ts/proxies/http-proxy/http2-request-handler.d.ts +0 -24
  102. package/dist_ts/proxies/http-proxy/http2-request-handler.js +0 -201
  103. package/dist_ts/proxies/http-proxy/index.d.ts +0 -14
  104. package/dist_ts/proxies/http-proxy/index.js +0 -16
  105. package/dist_ts/proxies/http-proxy/models/http-types.d.ts +0 -117
  106. package/dist_ts/proxies/http-proxy/models/http-types.js +0 -92
  107. package/dist_ts/proxies/http-proxy/models/index.d.ts +0 -5
  108. package/dist_ts/proxies/http-proxy/models/index.js +0 -6
  109. package/dist_ts/proxies/http-proxy/models/types.d.ts +0 -75
  110. package/dist_ts/proxies/http-proxy/models/types.js +0 -35
  111. package/dist_ts/proxies/http-proxy/request-handler.d.ts +0 -97
  112. package/dist_ts/proxies/http-proxy/request-handler.js +0 -737
  113. package/dist_ts/proxies/http-proxy/security-manager.d.ts +0 -98
  114. package/dist_ts/proxies/http-proxy/security-manager.js +0 -341
  115. package/dist_ts/proxies/http-proxy/websocket-handler.d.ts +0 -50
  116. package/dist_ts/proxies/http-proxy/websocket-handler.js +0 -505
  117. package/dist_ts/proxies/nftables-proxy/index.d.ts +0 -6
  118. package/dist_ts/proxies/nftables-proxy/index.js +0 -7
  119. package/dist_ts/proxies/nftables-proxy/models/errors.d.ts +0 -15
  120. package/dist_ts/proxies/nftables-proxy/models/errors.js +0 -28
  121. package/dist_ts/proxies/nftables-proxy/models/index.d.ts +0 -5
  122. package/dist_ts/proxies/nftables-proxy/models/index.js +0 -6
  123. package/dist_ts/proxies/nftables-proxy/models/interfaces.d.ts +0 -75
  124. package/dist_ts/proxies/nftables-proxy/models/interfaces.js +0 -5
  125. package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +0 -124
  126. package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +0 -1374
  127. package/dist_ts/proxies/nftables-proxy/utils/index.d.ts +0 -9
  128. package/dist_ts/proxies/nftables-proxy/utils/index.js +0 -12
  129. package/dist_ts/proxies/nftables-proxy/utils/nft-command-executor.d.ts +0 -66
  130. package/dist_ts/proxies/nftables-proxy/utils/nft-command-executor.js +0 -131
  131. package/dist_ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.d.ts +0 -39
  132. package/dist_ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.js +0 -112
  133. package/dist_ts/proxies/nftables-proxy/utils/nft-rule-validator.d.ts +0 -59
  134. package/dist_ts/proxies/nftables-proxy/utils/nft-rule-validator.js +0 -130
  135. package/dist_ts/proxies/smart-proxy/acme-state-manager.d.ts +0 -42
  136. package/dist_ts/proxies/smart-proxy/acme-state-manager.js +0 -101
  137. package/dist_ts/proxies/smart-proxy/cert-store.d.ts +0 -10
  138. package/dist_ts/proxies/smart-proxy/cert-store.js +0 -72
  139. package/dist_ts/proxies/smart-proxy/certificate-manager.d.ts +0 -164
  140. package/dist_ts/proxies/smart-proxy/certificate-manager.js +0 -745
  141. package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +0 -128
  142. package/dist_ts/proxies/smart-proxy/connection-manager.js +0 -689
  143. package/dist_ts/proxies/smart-proxy/http-proxy-bridge.d.ts +0 -43
  144. package/dist_ts/proxies/smart-proxy/http-proxy-bridge.js +0 -180
  145. package/dist_ts/proxies/smart-proxy/metrics-collector.d.ts +0 -98
  146. package/dist_ts/proxies/smart-proxy/metrics-collector.js +0 -355
  147. package/dist_ts/proxies/smart-proxy/nftables-manager.d.ts +0 -82
  148. package/dist_ts/proxies/smart-proxy/nftables-manager.js +0 -237
  149. package/dist_ts/proxies/smart-proxy/port-manager.d.ts +0 -117
  150. package/dist_ts/proxies/smart-proxy/port-manager.js +0 -318
  151. package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +0 -60
  152. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +0 -1407
  153. package/dist_ts/proxies/smart-proxy/route-manager.d.ts +0 -112
  154. package/dist_ts/proxies/smart-proxy/route-manager.js +0 -453
  155. package/dist_ts/proxies/smart-proxy/route-orchestrator.d.ts +0 -56
  156. package/dist_ts/proxies/smart-proxy/route-orchestrator.js +0 -204
  157. package/dist_ts/proxies/smart-proxy/rust-binary-locator.d.ts +0 -23
  158. package/dist_ts/proxies/smart-proxy/rust-binary-locator.js +0 -104
  159. package/dist_ts/proxies/smart-proxy/security-manager.d.ts +0 -74
  160. package/dist_ts/proxies/smart-proxy/security-manager.js +0 -227
  161. package/dist_ts/proxies/smart-proxy/throughput-tracker.d.ts +0 -36
  162. package/dist_ts/proxies/smart-proxy/throughput-tracker.js +0 -115
  163. package/dist_ts/proxies/smart-proxy/timeout-manager.d.ts +0 -48
  164. package/dist_ts/proxies/smart-proxy/timeout-manager.js +0 -158
  165. package/dist_ts/proxies/smart-proxy/tls-manager.d.ts +0 -50
  166. package/dist_ts/proxies/smart-proxy/tls-manager.js +0 -110
  167. package/dist_ts/proxies/smart-proxy/utils/route-patterns.d.ts +0 -161
  168. package/dist_ts/proxies/smart-proxy/utils/route-patterns.js +0 -282
  169. package/dist_ts/proxies/smart-proxy/utils/route-validators.d.ts +0 -73
  170. package/dist_ts/proxies/smart-proxy/utils/route-validators.js +0 -259
  171. package/dist_ts/routing/router/proxy-router.d.ts +0 -115
  172. package/dist_ts/routing/router/proxy-router.js +0 -325
  173. package/dist_ts/routing/router/route-router.d.ts +0 -108
  174. package/dist_ts/routing/router/route-router.js +0 -393
  175. package/dist_ts/tls/alerts/index.d.ts +0 -4
  176. package/dist_ts/tls/alerts/index.js +0 -5
  177. package/dist_ts/tls/alerts/tls-alert.d.ts +0 -150
  178. package/dist_ts/tls/alerts/tls-alert.js +0 -226
  179. package/dist_ts/tls/sni/client-hello-parser.d.ts +0 -100
  180. package/dist_ts/tls/sni/client-hello-parser.js +0 -464
  181. package/dist_ts/tls/sni/sni-extraction.d.ts +0 -58
  182. package/dist_ts/tls/sni/sni-extraction.js +0 -275
  183. package/dist_ts/tls/utils/index.d.ts +0 -4
  184. package/dist_ts/tls/utils/index.js +0 -5
  185. package/dist_ts/tls/utils/tls-utils.d.ts +0 -49
  186. package/dist_ts/tls/utils/tls-utils.js +0 -75
  187. package/ts/proxies/nftables-proxy/index.ts +0 -6
  188. package/ts/proxies/nftables-proxy/models/errors.ts +0 -30
  189. package/ts/proxies/nftables-proxy/models/index.ts +0 -5
  190. package/ts/proxies/nftables-proxy/models/interfaces.ts +0 -94
  191. package/ts/proxies/nftables-proxy/nftables-proxy.ts +0 -1754
  192. package/ts/proxies/nftables-proxy/utils/index.ts +0 -38
  193. package/ts/proxies/nftables-proxy/utils/nft-command-executor.ts +0 -162
  194. package/ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.ts +0 -125
  195. package/ts/proxies/nftables-proxy/utils/nft-rule-validator.ts +0 -156
  196. package/ts/proxies/smart-proxy/rust-binary-locator.ts +0 -112
@@ -1,275 +0,0 @@
1
- import { Buffer } from 'buffer';
2
- import { TlsExtensionType, TlsUtils } from '../utils/tls-utils.js';
3
- import { ClientHelloParser } from './client-hello-parser.js';
4
- /**
5
- * Utilities for extracting SNI information from TLS handshakes
6
- */
7
- export class SniExtraction {
8
- /**
9
- * Extracts the SNI (Server Name Indication) from a TLS ClientHello message.
10
- *
11
- * @param buffer The buffer containing the TLS ClientHello message
12
- * @param logger Optional logging function
13
- * @returns The extracted server name or undefined if not found
14
- */
15
- static extractSNI(buffer, logger) {
16
- const log = logger || (() => { });
17
- try {
18
- // Parse the ClientHello
19
- const parseResult = ClientHelloParser.parseClientHello(buffer, logger);
20
- if (!parseResult.isValid) {
21
- log(`Failed to parse ClientHello: ${parseResult.error}`);
22
- return undefined;
23
- }
24
- // Check if ServerName extension was found
25
- if (parseResult.serverNameList && parseResult.serverNameList.length > 0) {
26
- // Use the first hostname (most common case)
27
- const serverName = parseResult.serverNameList[0];
28
- log(`Found SNI: ${serverName}`);
29
- return serverName;
30
- }
31
- log('No SNI extension found in ClientHello');
32
- return undefined;
33
- }
34
- catch (error) {
35
- log(`Error extracting SNI: ${error instanceof Error ? error.message : String(error)}`);
36
- return undefined;
37
- }
38
- }
39
- /**
40
- * Attempts to extract SNI from the PSK extension in a TLS 1.3 ClientHello.
41
- *
42
- * In TLS 1.3, when a client attempts to resume a session, it may include
43
- * the server name in the PSK identity hint rather than in the SNI extension.
44
- *
45
- * @param buffer The buffer containing the TLS ClientHello message
46
- * @param logger Optional logging function
47
- * @returns The extracted server name or undefined if not found
48
- */
49
- static extractSNIFromPSKExtension(buffer, logger) {
50
- const log = logger || (() => { });
51
- try {
52
- // Ensure this is a ClientHello
53
- if (!TlsUtils.isClientHello(buffer)) {
54
- log('Not a ClientHello message');
55
- return undefined;
56
- }
57
- // Parse the ClientHello to find PSK extension
58
- const parseResult = ClientHelloParser.parseClientHello(buffer, logger);
59
- if (!parseResult.isValid || !parseResult.extensions) {
60
- return undefined;
61
- }
62
- // Find the PSK extension
63
- const pskExtension = parseResult.extensions.find(ext => ext.type === TlsExtensionType.PRE_SHARED_KEY);
64
- if (!pskExtension) {
65
- log('No PSK extension found');
66
- return undefined;
67
- }
68
- // Parse the PSK extension data
69
- const data = pskExtension.data;
70
- // PSK extension structure:
71
- // 2 bytes: identities list length
72
- if (data.length < 2)
73
- return undefined;
74
- const identitiesLength = (data[0] << 8) + data[1];
75
- let pos = 2;
76
- // End of identities list
77
- const identitiesEnd = pos + identitiesLength;
78
- if (identitiesEnd > data.length)
79
- return undefined;
80
- // Process each PSK identity
81
- while (pos + 2 <= identitiesEnd) {
82
- // Identity length (2 bytes)
83
- if (pos + 2 > identitiesEnd)
84
- break;
85
- const identityLength = (data[pos] << 8) + data[pos + 1];
86
- pos += 2;
87
- if (pos + identityLength > identitiesEnd)
88
- break;
89
- // Try to extract hostname from identity
90
- // Chrome often embeds the hostname in the PSK identity
91
- // This is a heuristic as there's no standard format
92
- if (identityLength > 0) {
93
- const identity = data.slice(pos, pos + identityLength);
94
- // Skip identity bytes
95
- pos += identityLength;
96
- // Skip obfuscated ticket age (4 bytes)
97
- if (pos + 4 <= identitiesEnd) {
98
- pos += 4;
99
- }
100
- else {
101
- break;
102
- }
103
- // Try to parse the identity as UTF-8
104
- try {
105
- const identityStr = identity.toString('utf8');
106
- log(`PSK identity: ${identityStr}`);
107
- // Check if the identity contains hostname hints
108
- // Chrome often embeds the hostname in a known format
109
- // Try to extract using common patterns
110
- // Pattern 1: Look for domain name pattern
111
- const domainPattern = /([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?/i;
112
- const domainMatch = identityStr.match(domainPattern);
113
- if (domainMatch && domainMatch[0]) {
114
- log(`Found domain in PSK identity: ${domainMatch[0]}`);
115
- return domainMatch[0];
116
- }
117
- // Pattern 2: Chrome sometimes uses a specific format with delimiters
118
- // This is a heuristic approach since the format isn't standardized
119
- const parts = identityStr.split('|');
120
- if (parts.length > 1) {
121
- for (const part of parts) {
122
- if (part.includes('.') && !part.includes('/')) {
123
- const possibleDomain = part.trim();
124
- if (/^[a-z0-9.-]+$/i.test(possibleDomain)) {
125
- log(`Found possible domain in PSK delimiter format: ${possibleDomain}`);
126
- return possibleDomain;
127
- }
128
- }
129
- }
130
- }
131
- }
132
- catch (e) {
133
- log('Failed to parse PSK identity as UTF-8');
134
- }
135
- }
136
- }
137
- log('No hostname found in PSK extension');
138
- return undefined;
139
- }
140
- catch (error) {
141
- log(`Error parsing PSK: ${error instanceof Error ? error.message : String(error)}`);
142
- return undefined;
143
- }
144
- }
145
- /**
146
- * Main entry point for SNI extraction with support for fragmented messages
147
- * and session resumption edge cases.
148
- *
149
- * @param buffer The buffer containing TLS data
150
- * @param connectionInfo Connection tracking information
151
- * @param logger Optional logging function
152
- * @param cachedSni Optional previously cached SNI value
153
- * @returns The extracted server name or undefined
154
- */
155
- static extractSNIWithResumptionSupport(buffer, connectionInfo, logger, cachedSni) {
156
- const log = logger || (() => { });
157
- // Log buffer details for debugging
158
- if (logger) {
159
- log(`Buffer size: ${buffer.length} bytes`);
160
- log(`Buffer starts with: ${buffer.slice(0, Math.min(10, buffer.length)).toString('hex')}`);
161
- if (buffer.length >= 5) {
162
- const recordType = buffer[0];
163
- const majorVersion = buffer[1];
164
- const minorVersion = buffer[2];
165
- const recordLength = (buffer[3] << 8) + buffer[4];
166
- log(`TLS Record: type=${recordType}, version=${majorVersion}.${minorVersion}, length=${recordLength}`);
167
- }
168
- }
169
- // Check if we need to handle fragmented packets
170
- let processBuffer = buffer;
171
- if (connectionInfo) {
172
- const connectionId = TlsUtils.createConnectionId(connectionInfo);
173
- const reassembledBuffer = ClientHelloParser.handleFragmentedClientHello(buffer, connectionId, logger);
174
- if (!reassembledBuffer) {
175
- log(`Waiting for more fragments on connection ${connectionId}`);
176
- return undefined; // Need more fragments to complete ClientHello
177
- }
178
- processBuffer = reassembledBuffer;
179
- log(`Using reassembled buffer of length ${processBuffer.length}`);
180
- }
181
- // First try the standard SNI extraction
182
- const standardSni = this.extractSNI(processBuffer, logger);
183
- if (standardSni) {
184
- log(`Found standard SNI: ${standardSni}`);
185
- return standardSni;
186
- }
187
- // Check for session resumption when standard SNI extraction fails
188
- if (TlsUtils.isClientHello(processBuffer)) {
189
- const resumptionInfo = ClientHelloParser.hasSessionResumption(processBuffer, logger);
190
- if (resumptionInfo.isResumption) {
191
- log(`Detected session resumption in ClientHello without standard SNI`);
192
- // Try to extract SNI from PSK extension
193
- const pskSni = this.extractSNIFromPSKExtension(processBuffer, logger);
194
- if (pskSni) {
195
- log(`Extracted SNI from PSK extension: ${pskSni}`);
196
- return pskSni;
197
- }
198
- }
199
- }
200
- // If cached SNI was provided, use it for application data packets
201
- if (cachedSni && TlsUtils.isTlsApplicationData(buffer)) {
202
- log(`Using provided cached SNI for application data: ${cachedSni}`);
203
- return cachedSni;
204
- }
205
- return undefined;
206
- }
207
- /**
208
- * Unified method for processing a TLS packet and extracting SNI.
209
- * Main entry point for SNI extraction that handles all edge cases.
210
- *
211
- * @param buffer The buffer containing TLS data
212
- * @param connectionInfo Connection tracking information
213
- * @param logger Optional logging function
214
- * @param cachedSni Optional previously cached SNI value
215
- * @returns The extracted server name or undefined
216
- */
217
- static processTlsPacket(buffer, connectionInfo, logger, cachedSni) {
218
- const log = logger || (() => { });
219
- // Add timestamp if not provided
220
- if (!connectionInfo.timestamp) {
221
- connectionInfo.timestamp = Date.now();
222
- }
223
- // Check if this is a TLS handshake or application data
224
- if (!TlsUtils.isTlsHandshake(buffer) && !TlsUtils.isTlsApplicationData(buffer)) {
225
- log('Not a TLS handshake or application data packet');
226
- return undefined;
227
- }
228
- // Create connection ID for tracking
229
- const connectionId = TlsUtils.createConnectionId(connectionInfo);
230
- log(`Processing TLS packet for connection ${connectionId}, buffer length: ${buffer.length}`);
231
- // Handle application data with cached SNI (for connection racing)
232
- if (TlsUtils.isTlsApplicationData(buffer)) {
233
- // If explicit cachedSni was provided, use it
234
- if (cachedSni) {
235
- log(`Using provided cached SNI for application data: ${cachedSni}`);
236
- return cachedSni;
237
- }
238
- log('Application data packet without cached SNI, cannot determine hostname');
239
- return undefined;
240
- }
241
- // Enhanced session resumption detection
242
- if (TlsUtils.isClientHello(buffer)) {
243
- const resumptionInfo = ClientHelloParser.hasSessionResumption(buffer, logger);
244
- if (resumptionInfo.isResumption) {
245
- log(`Session resumption detected in TLS packet`);
246
- // Always try standard SNI extraction first
247
- const standardSni = this.extractSNI(buffer, logger);
248
- if (standardSni) {
249
- log(`Found standard SNI in session resumption: ${standardSni}`);
250
- return standardSni;
251
- }
252
- // Enhanced session resumption SNI extraction
253
- // Try extracting from PSK identity
254
- const pskSni = this.extractSNIFromPSKExtension(buffer, logger);
255
- if (pskSni) {
256
- log(`Extracted SNI from PSK extension: ${pskSni}`);
257
- return pskSni;
258
- }
259
- log(`Session resumption without extractable SNI`);
260
- }
261
- }
262
- // For handshake messages, try the full extraction process
263
- const sni = this.extractSNIWithResumptionSupport(buffer, connectionInfo, logger);
264
- if (sni) {
265
- log(`Successfully extracted SNI: ${sni}`);
266
- return sni;
267
- }
268
- // If we couldn't extract an SNI, check if this is a valid ClientHello
269
- if (TlsUtils.isClientHello(buffer)) {
270
- log('Valid ClientHello detected, but no SNI extracted - might need more data');
271
- }
272
- return undefined;
273
- }
274
- }
275
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25pLWV4dHJhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy90bHMvc25pL3NuaS1leHRyYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25FLE9BQU8sRUFDTCxpQkFBaUIsRUFFbEIsTUFBTSwwQkFBMEIsQ0FBQztBQWFsQzs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ3hCOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBYyxFQUFFLE1BQXVCO1FBQzlELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQztZQUNILHdCQUF3QjtZQUN4QixNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDekIsR0FBRyxDQUFDLGdDQUFnQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDekQsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUVELDBDQUEwQztZQUMxQyxJQUFJLFdBQVcsQ0FBQyxjQUFjLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hFLDRDQUE0QztnQkFDNUMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakQsR0FBRyxDQUFDLGNBQWMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxVQUFVLENBQUM7WUFDcEIsQ0FBQztZQUVELEdBQUcsQ0FB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
@@ -1,4 +0,0 @@
1
- export {};
2
- /**
3
- * TLS utilities
4
- */
@@ -1,5 +0,0 @@
1
- export {};
2
- /**
3
- * TLS utilities
4
- */
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy90bHMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHIn0=
@@ -1,49 +0,0 @@
1
- export { TlsRecordType, TlsHandshakeType, TlsExtensionType, TlsAlertLevel, TlsAlertDescription, TlsVersion } from '../../protocols/tls/index.js';
2
- /**
3
- * Utility functions for TLS protocol operations
4
- */
5
- export declare class TlsUtils {
6
- /**
7
- * Checks if a buffer contains a TLS handshake record
8
- * @param buffer The buffer to check
9
- * @returns true if the buffer starts with a TLS handshake record
10
- */
11
- static isTlsHandshake(buffer: Buffer): boolean;
12
- /**
13
- * Checks if a buffer contains TLS application data
14
- * @param buffer The buffer to check
15
- * @returns true if the buffer starts with a TLS application data record
16
- */
17
- static isTlsApplicationData(buffer: Buffer): boolean;
18
- /**
19
- * Checks if a buffer contains a TLS alert record
20
- * @param buffer The buffer to check
21
- * @returns true if the buffer starts with a TLS alert record
22
- */
23
- static isTlsAlert(buffer: Buffer): boolean;
24
- /**
25
- * Checks if a buffer contains a TLS ClientHello message
26
- * @param buffer The buffer to check
27
- * @returns true if the buffer appears to be a ClientHello message
28
- */
29
- static isClientHello(buffer: Buffer): boolean;
30
- /**
31
- * Gets the record length from a TLS record header
32
- * @param buffer Buffer containing a TLS record
33
- * @returns The record length if the buffer is valid, -1 otherwise
34
- */
35
- static getTlsRecordLength(buffer: Buffer): number;
36
- /**
37
- * Creates a connection ID based on source/destination information
38
- * Used to track fragmented ClientHello messages across multiple packets
39
- *
40
- * @param connectionInfo Object containing connection identifiers
41
- * @returns A string ID for the connection
42
- */
43
- static createConnectionId(connectionInfo: {
44
- sourceIp?: string;
45
- sourcePort?: number;
46
- destIp?: string;
47
- destPort?: number;
48
- }): string;
49
- }
@@ -1,75 +0,0 @@
1
- import * as plugins from '../../plugins.js';
2
- import { TlsRecordType, TlsHandshakeType } from '../../protocols/tls/index.js';
3
- // Re-export from protocols for backward compatibility
4
- export { TlsRecordType, TlsHandshakeType, TlsExtensionType, TlsAlertLevel, TlsAlertDescription, TlsVersion } from '../../protocols/tls/index.js';
5
- /**
6
- * Utility functions for TLS protocol operations
7
- */
8
- export class TlsUtils {
9
- /**
10
- * Checks if a buffer contains a TLS handshake record
11
- * @param buffer The buffer to check
12
- * @returns true if the buffer starts with a TLS handshake record
13
- */
14
- static isTlsHandshake(buffer) {
15
- return buffer.length > 0 && buffer[0] === TlsRecordType.HANDSHAKE;
16
- }
17
- /**
18
- * Checks if a buffer contains TLS application data
19
- * @param buffer The buffer to check
20
- * @returns true if the buffer starts with a TLS application data record
21
- */
22
- static isTlsApplicationData(buffer) {
23
- return buffer.length > 0 && buffer[0] === TlsRecordType.APPLICATION_DATA;
24
- }
25
- /**
26
- * Checks if a buffer contains a TLS alert record
27
- * @param buffer The buffer to check
28
- * @returns true if the buffer starts with a TLS alert record
29
- */
30
- static isTlsAlert(buffer) {
31
- return buffer.length > 0 && buffer[0] === TlsRecordType.ALERT;
32
- }
33
- /**
34
- * Checks if a buffer contains a TLS ClientHello message
35
- * @param buffer The buffer to check
36
- * @returns true if the buffer appears to be a ClientHello message
37
- */
38
- static isClientHello(buffer) {
39
- // Minimum ClientHello size (TLS record header + handshake header)
40
- if (buffer.length < 9) {
41
- return false;
42
- }
43
- // Check record type (must be TLS_HANDSHAKE_RECORD_TYPE)
44
- if (buffer[0] !== TlsRecordType.HANDSHAKE) {
45
- return false;
46
- }
47
- // Skip version and length in TLS record header (5 bytes total)
48
- // Check handshake type at byte 5 (must be CLIENT_HELLO)
49
- return buffer[5] === TlsHandshakeType.CLIENT_HELLO;
50
- }
51
- /**
52
- * Gets the record length from a TLS record header
53
- * @param buffer Buffer containing a TLS record
54
- * @returns The record length if the buffer is valid, -1 otherwise
55
- */
56
- static getTlsRecordLength(buffer) {
57
- if (buffer.length < 5) {
58
- return -1;
59
- }
60
- // Bytes 3-4 contain the record length (big-endian)
61
- return (buffer[3] << 8) + buffer[4];
62
- }
63
- /**
64
- * Creates a connection ID based on source/destination information
65
- * Used to track fragmented ClientHello messages across multiple packets
66
- *
67
- * @param connectionInfo Object containing connection identifiers
68
- * @returns A string ID for the connection
69
- */
70
- static createConnectionId(connectionInfo) {
71
- const { sourceIp, sourcePort, destIp, destPort } = connectionInfo;
72
- return `${sourceIp}:${sourcePort}-${destIp}:${destPort}`;
73
- }
74
- }
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGxzLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvdGxzL3V0aWxzL3Rscy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRSxzREFBc0Q7QUFDdEQsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsVUFBVSxFQUNYLE1BQU0sOEJBQThCLENBQUM7QUFFdEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQUNuQjs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFjO1FBQ3pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxTQUFTLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBYztRQUMvQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsZ0JBQWdCLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQWM7UUFDckMsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLEtBQUssQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBYztRQUN4QyxrRUFBa0U7UUFDbEUsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsK0RBQStEO1FBQy9ELHdEQUF3RDtRQUN4RCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBYztRQUM3QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUM7UUFFRCxtREFBbUQ7UUFDbkQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxjQUtoQztRQUNDLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxjQUFjLENBQUM7UUFDbEUsT0FBTyxHQUFHLFFBQVEsSUFBSSxVQUFVLElBQUksTUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQzNELENBQUM7Q0FDRiJ9
@@ -1,6 +0,0 @@
1
- /**
2
- * NfTablesProxy implementation
3
- */
4
- export * from './nftables-proxy.js';
5
- export * from './models/index.js';
6
- export * from './utils/index.js';
@@ -1,30 +0,0 @@
1
- /**
2
- * Custom error classes for better error handling
3
- */
4
- export class NftBaseError extends Error {
5
- constructor(message: string) {
6
- super(message);
7
- this.name = 'NftBaseError';
8
- }
9
- }
10
-
11
- export class NftValidationError extends NftBaseError {
12
- constructor(message: string) {
13
- super(message);
14
- this.name = 'NftValidationError';
15
- }
16
- }
17
-
18
- export class NftExecutionError extends NftBaseError {
19
- constructor(message: string) {
20
- super(message);
21
- this.name = 'NftExecutionError';
22
- }
23
- }
24
-
25
- export class NftResourceError extends NftBaseError {
26
- constructor(message: string) {
27
- super(message);
28
- this.name = 'NftResourceError';
29
- }
30
- }
@@ -1,5 +0,0 @@
1
- /**
2
- * Export all models
3
- */
4
- export * from './interfaces.js';
5
- export * from './errors.js';
@@ -1,94 +0,0 @@
1
- /**
2
- * Interfaces for NfTablesProxy
3
- */
4
-
5
- /**
6
- * Represents a port range for forwarding
7
- */
8
- export interface PortRange {
9
- from: number;
10
- to: number;
11
- }
12
-
13
- // Legacy interface name for backward compatibility
14
- export type IPortRange = PortRange;
15
-
16
- /**
17
- * Settings for NfTablesProxy.
18
- */
19
- export interface NfTableProxyOptions {
20
- // Basic settings
21
- fromPort: number | PortRange | Array<number | PortRange>; // Support single port, port range, or multiple ports/ranges
22
- toPort: number | PortRange | Array<number | PortRange>;
23
- toHost?: string; // Target host for proxying; defaults to 'localhost'
24
-
25
- // Advanced settings
26
- preserveSourceIP?: boolean; // If true, the original source IP is preserved
27
- deleteOnExit?: boolean; // If true, clean up rules before process exit
28
- protocol?: 'tcp' | 'udp' | 'all'; // Protocol to forward, defaults to 'tcp'
29
- enableLogging?: boolean; // Enable detailed logging
30
- ipv6Support?: boolean; // Enable IPv6 support
31
- logFormat?: 'plain' | 'json'; // Format for logs
32
-
33
- // Source filtering
34
- ipAllowList?: string[]; // If provided, only these IPs are allowed
35
- ipBlockList?: string[]; // If provided, these IPs are blocked
36
- useIPSets?: boolean; // Use nftables sets for efficient IP management
37
-
38
- // Rule management
39
- forceCleanSlate?: boolean; // Clear all NfTablesProxy rules before starting
40
- tableName?: string; // Custom table name (defaults to 'portproxy')
41
-
42
- // Connection management
43
- maxRetries?: number; // Maximum number of retries for failed commands
44
- retryDelayMs?: number; // Delay between retries in milliseconds
45
- useAdvancedNAT?: boolean; // Use connection tracking for stateful NAT
46
-
47
- // Quality of Service
48
- qos?: {
49
- enabled: boolean;
50
- maxRate?: string; // e.g. "10mbps"
51
- priority?: number; // 1 (highest) to 10 (lowest)
52
- markConnections?: boolean; // Mark connections for easier management
53
- };
54
-
55
- // Integration with PortProxy/NetworkProxy
56
- netProxyIntegration?: {
57
- enabled: boolean;
58
- redirectLocalhost?: boolean; // Redirect localhost traffic to NetworkProxy
59
- sslTerminationPort?: number; // Port where NetworkProxy handles SSL termination
60
- };
61
- }
62
-
63
- // Legacy interface name for backward compatibility
64
- export type INfTableProxySettings = NfTableProxyOptions;
65
-
66
- /**
67
- * Interface for status reporting
68
- */
69
- export interface NfTablesStatus {
70
- active: boolean;
71
- ruleCount: {
72
- total: number;
73
- added: number;
74
- verified: number;
75
- };
76
- tablesConfigured: { family: string; tableName: string }[];
77
- metrics: {
78
- forwardedConnections?: number;
79
- activeConnections?: number;
80
- bytesForwarded?: {
81
- sent: number;
82
- received: number;
83
- };
84
- };
85
- qosEnabled?: boolean;
86
- ipSetsConfigured?: {
87
- name: string;
88
- elementCount: number;
89
- type: string;
90
- }[];
91
- }
92
-
93
- // Legacy interface name for backward compatibility
94
- export type INfTablesStatus = NfTablesStatus;