{"id":19784786,"url":"https://github.com/samlukeyes/shadowsocks-ws","last_synced_at":"2026-06-12T17:32:23.559Z","repository":{"id":165128904,"uuid":"612802964","full_name":"SamLukeYes/shadowsocks-ws","owner":"SamLukeYes","description":null,"archived":false,"fork":false,"pushed_at":"2023-05-14T10:40:19.000Z","size":99,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-28T13:22:17.978Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SamLukeYes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-12T02:32:41.000Z","updated_at":"2023-03-12T02:32:50.000Z","dependencies_parsed_at":null,"dependency_job_id":"3d58d985-3cf0-4084-b77c-d4a0a4f547af","html_url":"https://github.com/SamLukeYes/shadowsocks-ws","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/SamLukeYes/shadowsocks-ws","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamLukeYes%2Fshadowsocks-ws","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamLukeYes%2Fshadowsocks-ws/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamLukeYes%2Fshadowsocks-ws/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamLukeYes%2Fshadowsocks-ws/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SamLukeYes","download_url":"https://codeload.github.com/SamLukeYes/shadowsocks-ws/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamLukeYes%2Fshadowsocks-ws/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34256180,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2024-11-12T06:12:39.743Z","updated_at":"2026-06-12T17:32:23.542Z","avatar_url":"https://github.com/SamLukeYes.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Shadowsocks over WebSocket\n\n[![Build Status](https://travis-ci.org/totravel/shadowsocks-ws.svg?branch=master)](https://travis-ci.org/totravel/shadowsocks-ws)\n![License](https://img.shields.io/github/license/totravel/shadowsocks-ws)\n![GitHub last commit](https://img.shields.io/github/last-commit/totravel/shadowsocks-ws)\n\nshadowsocks-ws 是基于 WebSocket 的 Shadowsocks，既可以部署在 [Heroku][heroku] 和 [Railway][railway] 等 PaaS 平台，也可以部署在常规的 VPS 上。\n\n```\n        socks5            tcp               websocket                tcp\nclient \u003c------\u003e ss-local \u003c---\u003e ss-ws-local \u003c-- gfw --\u003e ss-ws-remote \u003c---\u003e target\n                encrypt                                decrypt\n```\n\nshadowsocks-ws 客户端（`ss-ws-local`）和 shadowsocks-ws 服务器（`ss-ws-remote`）之间使用 WebSocket 协议进行通信。shadowsocks-ws 客户端只负责转发经过加密的流量，须配合 [Shadowsocks for Windows][sfw] 等常规 Shadowsocks 客户端（`ss-local`）使用。shadowsocks-ws 服务器不仅是一个 Shadowsocks 服务器，还是一个支持反向代理的 Web 服务器，可以伪装成某个网站。\n\n## 环境要求\n\n- [Node.js][nodejs] 16+\n- [Windows Terminal][wt]\n- [Git for Windows][gfw]\n\n## 服务器部署\n\n作为一个 Shadowsocks 服务器，shadowsocks-ws 服务器使用的加密方案、密码和端口号分别由环境变量 `METHOD`、`PASS` 和 `PORT` 决定。目前，shadowsocks-ws 服务器仅支持 `chacha20-ietf-poly1305` 和 `aes-256-gcm` 两种加密方案。\n\n作为一个支持反向代理的 Web 服务器，shadowsocks-ws 服务器默认使用根目录下的 `index.html` 作为网站主页。如果使用环境变量 `PROXY` 指定了一个网站，shadowsocks-ws 服务器就会成为那个网站的反向代理，从而伪装成那个网站。\n\n### PaaS\n\nHeroku\n\n[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)\n\nRailway\n\n[![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/new/template/9exsjX?referralCode=ssws)\n\n### VPS\n\n获取 shadowsocks-ws 的代码，安装 shadowsocks-ws 服务器依赖的第三方库：\n\n```bash\ngit clone https://github.com/totravel/shadowsocks-ws.git\ncd shadowsocks-ws\nnpm i\n```\n\n设置 shadowsocks-ws 服务器使用的加密方案、密码和端口号：\n\n```bash\nexport METHOD=aes-256-gcm\nexport PASS=secret\nexport PORT=80\n```\n\n如有需要，可以设置反向代理的目标网站：\n\n```bash\nexport PROXY='https://github.com'\n```\n\n生成并启动 shadowsocks-ws 服务器：\n\n```bash\nnpm run build\nnpm start\n```\n\n## 客户端配置\n\n用户需要在本地同时运行 shadowsocks-ws 客户端和常规 Shadowsocks 客户端。\n\n### shadowsocks-ws 客户端\n\n获取 shadowsocks-ws 的代码，安装 shadowsocks-ws 客户端依赖的第三方库：\n\n```bash\ngit clone https://github.com/totravel/shadowsocks-ws.git\ncd shadowsocks-ws\nnpm i --omit=dev --omit=optional\n```\n\n将 shadowsocks-ws 客户端的配置文件的模板 `config.json.example` 重命名为 `config.json` 并修改其中的 `server`、`password` 和 `method` 三个字段。\n\n```json\n{\n  \"nameserver\": \"https://doh.opendns.com/dns-query\",\n  \"server\": \"https://*.up.railway.app/\",\n  \"server_address\": [],\n  \"local_address\": \"127.0.0.1\",\n  \"local_port\": 8787,\n  \"password\": \"secret\",\n  \"method\": \"aes-256-gcm\",\n  \"timeout\": 5000,\n  \"show_qrcode\": true,\n  \"show_url\": false\n}\n```\n\n如果 `server` 字段的主机部分不是一个 IP 地址，而是一个主机名，shadowsocks-ws 客户端就会自动进行 DNS 查询。如果服务器的 IP 地址已知并且已经用 `server_address` 字段一一列出，shadowsocks-ws 客户端就不会进行 DNS 查询。\n\n`nameserver` 字段的值必须是 DoH 服务器的地址。下列取值供参考：\n\n- [DNSPod](https://www.dnspod.cn/) `https://doh.pub/dns-query`\n- [AliDNS](https://alidns.com/) `https://dns.alidns.com/dns-query`\n- [360DNS](https://sdns.360.net/) `https://doh.360.cn/dns-query`\n- [IPv6 DNS](https://www.ipv6dns.com/) `https://dns.ipv6dns.com/dns-query`\n- [Quad9](https://www.quad9.net/) `https://dns10.quad9.net/dns-query`\n- [Cisco OpenDNS](https://www.opendns.com/) `https://doh.opendns.com/dns-query`\n- [Cloudflare](https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests) `https://1.1.1.1/dns-query`\n- [Cloudflare](https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests) `https://1.0.0.1/dns-query`\n- AT\u0026T `https://dohtrial.att.net/dns-query`\n- [IIJ](https://public.dns.iij.jp/) `https://public.dns.iij.jp/dns-query`\n- [AdGuard](https://adguard-dns.io/) `https://unfiltered.adguard-dns.com/dns-query`\n- [bebasdns](https://github.com/bebasid/bebasdns) `https://dns.bebasid.com/dns-query`\n- [AlekBergNl](https://alekberg.net/) `https://dnsnl.alekberg.net/dns-query`\n- [AlekBergSE](https://alekberg.net/) `https://dnsse.alekberg.net/dns-query`\n- [adfree](https://usableprivacy.com/) `https://adfree.usableprivacy.net/query`\n- [Control D](https://controld.com/) `https://freedns.controld.com/p0`\n- [Cloudflare](https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests) `https://cloudflare-dns.com/dns-query`\n\n启动 shadowsocks-ws 客户端：\n\n```bash\nnpm run local\n```\n\n### 常规 Shadowsocks 客户端\n\n下文根据需要选择性阅读。\n\n#### Shadowsocks for Windows\n\n打开 [Shadowsocks for Windows][sfw]：\n\n1. 系统托盘 \u003e 上下文菜单\n    1. 服务器 \u003e 扫描屏幕上的二维码\n    1. 系统代理 \u003e PAC 模式\n\n#### Clash for Windows\n\n将配置文件的模板 `clash.yaml.example` 重命名为 `clash.yaml` 并修改 `cipher` 和 `password` 两个字段。\n\n```yaml\nproxies:\n  - name: \"ss1\"\n    type: ss\n    server: 127.0.0.1\n    port: 8787\n    cipher: aes-256-gcm\n    password: \"secret\"\n\nproxy-groups:\n  - name: PROXY\n    type: select\n    proxies:\n      - ss1\n\nrules:\n  - GEOIP,LAN,DIRECT\n  - GEOIP,CN,DIRECT\n  - MATCH,PROXY\n```\n\n打开 [Clash for Windows][cfw]：\n\n1. 配置 \u003e 导入上述配置文件\n1. 主页 \u003e 打开「系统代理」开关\n1. 代理 \u003e 规则\n\n##### 获取和使用规则集\n\n执行脚本 `ruleset.sh` 下载 [Clash 规则集][clash-rules]。\n\n```bash\n./ruleset.sh\n```\n\n使用规则集的配置文件的模板为 `blacklist.yaml.example` 或 `whitelist.yaml.example`。它们的用法与 `clash.yaml.example` 相同。\n\n#### SagerNet for Android\n\n将手机和电脑连接至同一网络，打开 [SagerNet for Android][sn]：\n\n1. 右上角 \u003e 添加服务器配置 \u003e 扫描二维码\n1. 修改服务器配置 \u003e 将「服务器」字段由 `127.0.0.1` 修改为电脑的 IP 地址\n1. 右下角 \u003e 连接\n\n#### shadowsocks-rust\n\n另外再准备一个配置文件，例如：\n\n```json\n{\n  \"server\": \"127.0.0.1\",\n  \"server_port\": 8787,\n  \"password\": \"secret\",\n  \"method\": \"aes-256-gcm\",\n  \"local_address\": \"127.0.0.1\",\n  \"local_port\": 1080\n}\n```\n\n然后用如下命令启动 [shadowsocks-rust][ss-rust]：\n\n```bash\n./sslocal -c config.json --log-without-time\n```\n\n## 常见问题\n\n### 用常规 Shadowsocks 客户端连接 shadowsocks-ws 服务器失败？\n\n不能直接用常规 Shadowsocks 客户端连接 shadowsocks-ws 服务器。要使用 shadowsocks-ws，必须先在本地运行 shadowsocks-ws 客户端，再让常规 Shadowsocks 客户端连接到 shadowsocks-ws 客户端。具体步骤见 [客户端配置](#客户端配置)。\n\n### 如何确认 shadowsocks-ws 服务器已经部署成功并且可以正常访问？\n\n直接在浏览器的地址栏中输入 shadowsocks-ws 服务器的地址并访问。如果可以看到 `You're free as a bird!`，就说明服务器已经可以正常访问。\n\n### shadowsocks-ws 客户端提示所有 IP 地址都连接超时？\n\n先用浏览器访问服务器，确保服务器可以访问。再修改配置文件中的 `nameserver` 字段并重试。\n\n### 有支持 Shadowsocks 2022 的计划吗？\n\n有。由于 [Shadowsocks 2022][ss2022] 变化较大，需要更多的时间进行开发和测试。\n\n### shadowsocks-ws 支持 UDP 代理吗？\n\n不支持。目前也没有支持 UDP 的计划。\n\n## 求助和反馈\n\n求助和反馈可以在 [Issues](https://github.com/totravel/shadowsocks-ws/issues) 版块进行。\n\n## 讨论和交流\n\n讨论和交流可以在 [Discussions](https://github.com/totravel/shadowsocks-ws/discussions) 版块进行。\n\n## 鸣谢\n\n- [websockets/ws][ws] Simple to use, blazing fast and thoroughly tested WebSocket client and server for Node.js\n- [expressjs/express][express] Fast, unopinionated, minimalist web framework for node.\n- [chimurai/http-proxy-middleware][proxy] The one-liner node.js http-proxy middleware for connect, express, next.js and more\n- [byu-imaal/dohjs][dohjs] DNS over HTTPS client for use in the browser\n- [Marak/colors][colors] get colors in your node.js console\n- [soldair/qrcode][qrcode] qr code generator\n- [Shadowsocks for Windows][sfw] A C# port of shadowsocks\n- [Clash for Windows][cfw] clash for windows汉化版. 提供clash for windows的汉化版, 汉化补丁及汉化版安装程序\n- [Loyalsoldier/clash-rules][clash-rules] Clash Premium 规则集(RULE-SET)，兼容 ClashX Pro、Clash for Windows 客户端。\n- [SagerNet for Android][sn] The universal proxy toolchain for Android\n\n## 许可协议\n\n[MIT](LICENSE)\n\n[nodejs]: https://nodejs.dev/en/download/\n[wt]: https://github.com/microsoft/terminal\n[gfw]: https://gitforwindows.org/\n\n[heroku]: https://www.heroku.com/\n[railway]: https://railway.app/\n\n[sfw]: https://github.com/shadowsocks/shadowsocks-windows\n[cfw]: https://github.com/ender-zhao/Clash-for-Windows_Chinese\n[clash-rules]: https://github.com/Loyalsoldier/clash-rules\n[sn]: https://github.com/SagerNet/SagerNet\n[ss-libev]: https://github.com/shadowsocks/shadowsocks-libev\n[go-ss2]: https://github.com/shadowsocks/go-shadowsocks2\n[ss-rust]: https://github.com/shadowsocks/shadowsocks-rust\n\n[ws]: https://github.com/websockets/ws\n[express]: https://expressjs.com/\n[proxy]: https://github.com/chimurai/http-proxy-middleware\n[dohjs]: https://github.com/byu-imaal/dohjs\n[colors]: https://github.com/Marak/colors.js\n[qrcode]: https://github.com/soldair/node-qrcode\n\n[ss2022]: https://github.com/Shadowsocks-NET/shadowsocks-specs\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamlukeyes%2Fshadowsocks-ws","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsamlukeyes%2Fshadowsocks-ws","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamlukeyes%2Fshadowsocks-ws/lists"}