{"id":13775911,"url":"https://github.com/srar/socks2shadowsocks","last_synced_at":"2026-01-17T17:01:20.031Z","repository":{"id":90796300,"uuid":"80699671","full_name":"Srar/socks2shadowsocks","owner":"Srar","description":"单Socks5 转换 多Shadowsocks端口 流量统计 抓包分析 TypeScript","archived":false,"fork":false,"pushed_at":"2019-12-06T07:49:08.000Z","size":36,"stargazers_count":52,"open_issues_count":0,"forks_count":16,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-11-17T11:47:20.672Z","etag":null,"topics":["nodejs","shadowsocks","shadowsocks-server","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Srar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2017-02-02T06:31:00.000Z","updated_at":"2024-08-11T02:47:30.000Z","dependencies_parsed_at":"2024-01-07T22:47:38.875Z","dependency_job_id":"f889bd82-24c7-4c7a-ab6f-87c5b3c4a792","html_url":"https://github.com/Srar/socks2shadowsocks","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Srar%2Fsocks2shadowsocks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Srar%2Fsocks2shadowsocks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Srar%2Fsocks2shadowsocks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Srar%2Fsocks2shadowsocks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Srar","download_url":"https://codeload.github.com/Srar/socks2shadowsocks/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253540462,"owners_count":21924522,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nodejs","shadowsocks","shadowsocks-server","typescript"],"created_at":"2024-08-03T17:01:54.268Z","updated_at":"2026-01-17T17:01:19.718Z","avatar_url":"https://github.com/Srar.png","language":"TypeScript","funding_links":[],"categories":["\u003ca id=\"d03d494700077f6a65092985c06bf8e8\"\u003e\u003c/a\u003e工具"],"sub_categories":["\u003ca id=\"cb16466a31a167bb61f39e2a4a85f449\"\u003e\u003c/a\u003eShadowsocks"],"readme":"# Socks5SSProxy\n单Socks5转换成多用户(端口)Shadowsocks代理. 适用于使用中转加速的用户或中转SS服务商.\n\n## 已支持的加密算法\n* rc4-md5\n* aes-192-cfb\n* aes-256-cfb\n\n\u003e 如自行添加加密算法请实现`ISSCryptoMethod`接口\n\n\n## 查询已支持的加密算法\n\n```typescript\nimport SSCrypto from \"./src/Crypto/SSCrypto\";\n/* SSCrypto.getAllCryptoMethods():List\u003cstring\u003e 返回加密算法名数组 */\nconsole.log(SSCrypto.getAllCryptoMethods());\n```\n\n## 创建一个Socks5转Shadowsocks代理\n\n开始接受Shadowsocks客户端传入连接:\n\n```typescript\nimport Socks5SSProxy from \"./src/Socks5SSProxy\";\nimport Socks5SSProxyTcpProcess from \"./src/Socks5SSProxyTcpProcess\";\n\n/* \n    Shadowsocks服务端监听3389端口, 并将流量处理转发至192.168.0.250:22 Socks5服务端端口.\n    Shadowsocks服务端所接受的算法:rc4-md5 密码: 123456\n */\nvar proxy: Socks5SSProxy = new Socks5SSProxy(3389, \"192.168.0.250\", 22, \"rc4-md5\", \"123456\");\nproxy.on(\"error\", (err: Error) =\u003e {\n    console.error(\"代理服务器出现错误:\", err);\n});\nproxy.listen();\n```\n\n\u003e 如您想创建多个Shadowsocks服务端, 您只需要实例化多个`Socks5SSProxy`即可.\n\n关闭全部Shadowsocks与Socks5连接并停止监听:\n\n```typescript\nproxy.close();\n```\n\n## Socks5转Shadowsocks服务事件\n\n当您实例化`Socks5SSProxy`并调用`listen`方法后, 如有新连接传入则会触发`clientConnected`事件.\n\n`clientConnected`事件会传给你一个`Socks5SSProxyTcpProcess`实例.\n\n`Socks5SSProxyTcpProcess`为处理转发TCP过程类您可以监听其事件来干一些破事.\n\n事件列表:\n* `socks5Connected`: Socks5连接并握手成功.\n* `firstTraffic`: Shadowsocks客户端与Socks5服务端首次通讯. 返回`耗时(ms)`.\n* `socks5Data`: Socks5服务端 -\u003e Shadowsocks客户端 __已解密__ 数据.\n* `clientData`: Shadowsocks客户端 -\u003e Socks5服务端 __已解密__ 数据.\n* `close`: Shadowsocks客户端或Socks5服务端关闭了连接.\n* `error`: 转发过程中出现了错误. 返回`Error`.\n\n使用:\n\n```typescript\nproxy.on(\"clientConnected\", (p: Socks5SSProxyTcpProcess) =\u003e {\n\n    p.on(\"socks5Connected\", () =\u003e {\n        ...\n    });\n\n    p.on(\"firstTraffic\", (time: number) =\u003e {\n        var remoteAddress: string = `${p.getRemoteAddress()}:${p.getRemotePort()}`;\n        var clientAddress: string = `${p.getClientSocket().remoteAddress}:${p.getClientSocket().remotePort}`;\n        console.log(`Client [${clientAddress}] connected to [${remoteAddress}]. Usage time: ${time}ms`);\n    });\n\n    p.on(\"socks5Data\", (data: Buffer) =\u003e {\n        /*  记录Shadowsocks客户端下行流量\n            如果您想判断这个连接是不是HTTP连接, 您针对首包可以使用:\n            data.toString().indexOf(\"HTTP/1.1 \") != -1\n            这样简易的方式来判断.\n         */\n        upload += data.length;\n    });\n\n    p.on(\"clientData\", (data: Buffer) =\u003e {\n        /* 记录Shadowsocks客户端上行流量 */\n        download += data.length;\n    });\n\n    p.on(\"close\", () =\u003e {\n        ...\n    });\n\n    p.on(\"error\", (err: Error) =\u003e {\n        console.log(`Process Error:`, err.message);\n    });\n});\n\n```\n\n## Examples\n\n* 屏蔽特定域名或IP\n  ```typescript\n    var checkedAddress = false;\n    p.on(\"clientData\", (data: Buffer) =\u003e {\n\n        /* 避免多次判断造成性能下降 */\n        if (!checkedAddress) {\n            var addressBlockList: Array\u003cstring\u003e = [\n                \"api.map.baidu.com\",\n                \"ps.map.baidu.com\",\n                \"sv.map.baidu.com\",\n                \"offnavi.map.baidu.com\",\n                \"newvector.map.baidu.com\",\n                \"ulog.imap.baidu.com\",\n                \"newloc.map.n.shifen.com\",\n            ];\n\n            for (var address of addressBlockList) {\n                if (address != p.getRemoteAddress()) {\n                    continue;\n                }\n                var remoteAddress: string = `${p.getRemoteAddress()}:${p.getRemotePort()}`;\n                var clientAddress: string = `${p.getClientSocket().remoteAddress}:${p.getClientSocket().remotePort}`;\n                console.log(`Client [${clientAddress}] try to connect to [${remoteAddress}].`);\n                return p.clearConnect();\n            }\n            checkedAddress = true;\n        }\n        /* 记录Shadowsocks客户端上行流量 */\n        download += data.length;\n    });\n  ```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrar%2Fsocks2shadowsocks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsrar%2Fsocks2shadowsocks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrar%2Fsocks2shadowsocks/lists"}