{"id":19421681,"url":"https://github.com/wegel/wwscc","last_synced_at":"2026-03-05T21:32:26.130Z","repository":{"id":73393692,"uuid":"80312326","full_name":"wegel/wwscc","owner":"wegel","description":"Wegel's WebSocket Channel Connector: tunnel tcp over websocket, even when both ends of the connection are behind strict firewall","archived":false,"fork":false,"pushed_at":"2020-10-01T20:53:50.000Z","size":121,"stargazers_count":11,"open_issues_count":1,"forks_count":6,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-24T10:59:41.198Z","etag":null,"topics":["go","golang","proxy","ssh","tcp","tcp-tunnel","tunneling","websocket","websockets"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wegel.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":"2017-01-28T21:34:57.000Z","updated_at":"2024-12-23T22:04:03.000Z","dependencies_parsed_at":"2023-07-07T08:32:02.501Z","dependency_job_id":null,"html_url":"https://github.com/wegel/wwscc","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/wegel/wwscc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wegel%2Fwwscc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wegel%2Fwwscc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wegel%2Fwwscc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wegel%2Fwwscc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wegel","download_url":"https://codeload.github.com/wegel/wwscc/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wegel%2Fwwscc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30150435,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T21:15:50.531Z","status":"ssl_error","status_checked_at":"2026-03-05T21:15:11.173Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["go","golang","proxy","ssh","tcp","tcp-tunnel","tunneling","websocket","websockets"],"created_at":"2024-11-10T13:29:27.154Z","updated_at":"2026-03-05T21:32:25.589Z","avatar_url":"https://github.com/wegel.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"```\n                             Firewall                          Firewall\n          Firewalled            or                                or\n           network          HTTP Proxy                        HTTP Proxy\n+-------------------------+     ++                                ++    +----------------------+\n|    +---------------+    |     ||                                ||    |                      |\n|    |               |    |     ||                                ||    |  +-----------------+ |\n|    | Internal host |    |     ||                                ||    |  |                 | |\n|    |               |    |     ||               +-------------------------+ 80/ Web SSH     | |\n|    |     22,80,... |    |     ||               |                ||    |  | 443             | |\n|    +---------^-----+    |     ||               |                ||    |  +-----------------+ | Firewalled\n|              |          |     ||               |                ++    +----------------------+  network\n|              |          |     ||               |\n|    +---------+-------+  |     ||               |                ++    +----------------------+\n|    |                 |  |     ||               |                ||    |                      |\n|    |   Proxy  80/443 |  |     ||               |                ||    |  +-----------------+ |\n|    |   (wwscat)      +-----+  ||    +----------v---------+      ||    |  |                 | |\n|    |                 |  |  |  ||    |       80/443       |      ||    |  |      Tunnel     | |\n|    +-----------------+  |  +--------\u003e 80/443 Conn 80/443 \u003c---------------+ 80/ (wwscat)    | |\n+-------------------------+     ++    |   (wwsconnector)   |      ||    |  | 443    +        | |\n                                      |       80/443       |      ||    |  |        |        | |\n+-------------------------+     ++    +----------^---------+      ||    |  |        v        | |\n|   +-----------------+   |     ||               |                ||    |  |  ssh client,    | |\n|   |                 |   |     ||               |                ||    |  |  browser, etc   | | Firewalled\n|   |   Proxy  80/443 +--------------------------+                ||    |  +-----------------+ |  network\n|   |   (wwscat)      |   |     ||                                ||    |  |-----------------| |\n|   |                 |   |     ++                                ++    +----------------------+\n|   +-----------------+   |  Firewall                          Firewall\n+-------------------------+     or                                or\n                            HTTP Proxy                        HTTP Proxy\n\n```\nSay we want to connect to a remote computer's SSH deamon that's not publicly available, but we have an existing communication channel to this computer that allows us to launch a command (or maybe this computer creates a channel on boot and automatically starts its \"proxy\").\n\nLaunch the *wwsconnector* somewhere publicly reachable:\n\n`cd wwsconnector \u0026\u0026 go build \u0026\u0026 ./wwsconnector`\n\nObtain a Channel ID\n\n``CHANNEL_ID=`curl http://public_wwsconnector_hostname/create` ``\n\nOn the \"target\" computer, the one which can reach the resource that we want to reach (the resource can be on that same computer), run *wwscat* in proxy mode:\n\n`wwscat --proxy localhost:22 ws://public_wwsconnector_hostname/ws/proxy/$CHANNEL_ID`\n\nOn our local computer, we can do:\n\n`ssh -C -D 1553 -o \"VerifyHostKeyDNS=no\" -o ProxyCommand=\"wwscat \\\"ws://public_wwsconnector_hostname/ws/tunnel/%h\\\"\" root@$CHANNEL_ID`\n\nAnd we'll be greeted by the standard SSH login prompt from the remote computer.\n\nSSH is used as an example; you can proxy and connect to any TCP service.\n\nYou can also create a channel of type \"SSH\" (the default being \"tunnel\") where the *wwsconnector* will itself run an ssh client, bypassing the need to have an SSH client on our end. You would create the channel by specifying that you want an SSH tunnel:\n\n``CHANNEL_ID=`curl http://public_wwsconnector_hostname/create?type=ssh` ``\n\nYou then would run the \"proxy\" exactly as above, and from our computer we could do:\n\n``./wwscat \"ws://public_wwsconnector_hostname/ws/tunnel/$CHANNEL_ID?username=ubuntu\u0026rows=`tput lines`\u0026cols=`tput cols`\"``\n\nYou would then again be prompted with a password prompt, and eventually connected to the remote's shell.\n\nThis allows us to run a terminal using a web browser, since all the browser has to do is display the terminal. The SSH client runs on the wwsconnector. As an example, you can use wwswebterminal/terminal.html (and it's accompaning files). If you really want to or if you have no better place to host the web terminal, you can put the contents of *wwswebterminal* inside a *public* folder under *wwsconnector* and your connector will serve those files. \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwegel%2Fwwscc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwegel%2Fwwscc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwegel%2Fwwscc/lists"}