Model or dataset
zhaoweih/Shadowsocks-Tutorial avatar
zhaoweih/Shadowsocks-Tutorial

zhaoweih/Shadowsocks-Tutorial: A Beginner's Walkthrough for Renting a VPS and Running Shadowsocks

🐱给小白的Shadowsocks翻墙教程-Easy-to-follow tutorials for beginners on using Shadowsocks to bypass internet restrictions.

2,662 stars525 forksShellLicense varies

At a glance

What is it?
A Chinese-language, screenshot-heavy guide that takes a non-technical reader from buying a Vultr or DigitalOcean instance to a working Shadowsocks client. The install path depends on a third-party script that the README itself says is no longer updated.
Who is it for?
Adopt this if you have never opened a terminal and want a single ordered path from buying a VPS to a working client, and if you accept that the installer script is frozen. Do not adopt it if you need current server-side hardening, a maintained install path, or a documented licence for redistribution.
Can I use it commercially?
Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
Is it still maintained?
Yes. The repository last received commits 12 days ago.
What is it written in?
Mainly Shell, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

What this repository is, and who it is written for

This is not a Shadowsocks implementation. It is a tutorial repository: a README plus a sh/ directory holding a shell installer, an images/ directory of screenshots, and separate markdown files for KCPTUN acceleration, iptables rules, and a simplified walkthrough. The primary language is Shell, and no licence file appears in the top-level entries, so the terms under which the text and script can be reused are not stated.

The stated audience is beginners, described in the README as people who want to get online rather than understand the protocol. The author explains the motivation directly: existing tutorials were inconsistent and misled readers who only wanted a working connection. The guide therefore optimises for a linear path with screenshots at each step, at the cost of explaining very little about what the software does.

That framing matters when you evaluate it. If you already administer Linux servers, most of the document is below your level. If you have never rented a VPS, the ordering is the value: buy, deploy, test the IP, connect, install, configure the client.

The VPS-first model and why the guide starts with a purchase

Shadowsocks is self-hosted, so the tutorial cannot begin until the reader owns a server. The README recommends Vultr, citing Japanese locations for lower latency and packet loss, and notes DigitalOcean as an alternative. It describes hourly billing at roughly 5 USD per month, about 0.007 USD per hour, and points out that a blocked IP can be destroyed and redeployed for a fraction of a dollar.

That last detail is the practical core of the whole document. Because the server is personal rather than shared, the README argues the chance of an IP being blocked is lower than with a commercial service. The workflow it teaches follows from that assumption: deploy, ping the address, and if the pings time out continuously, delete the instance and start again. Occasional timeouts are described as normal packet loss.

The guide also recommends a specific base image, Debian 12 x64, and warns against enabling automatic backups because they add about 1 USD per month. It suggests European locations such as Frankfurt because Japanese IPs had been abused. These are operational choices, not protocol ones, and they are the part of the document most likely to age.

Installing Shadowsocks with the bundled installer script

The README credits teddysun for the one-click installer and links to that author's blog for detail. It also states plainly that the author has stepped away, so the command still runs but the version is no longer updated. That sentence is the single most important line in the repository for anyone deciding whether to follow it.

The commands are run on the server after connecting over SSH. The README notes that macOS users and Windows 10 users can use the built-in terminal with ssh root@<ip>, and that Windows users on older systems can install Xshell instead. The script is downloaded, made executable, and run with output tee'd to a log file.

bash
wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/zhaoweih/Shadowsocks-Tutorial/main/sh/shadowsocks-all.sh
chmod +x shadowsocks-all.sh
./shadowsocks-all.sh 2>&1 | tee shadowsocks-all.log

The --no-check-certificate flag disables certificate validation for the download, which is worth noticing rather than copying blindly. After the script starts, the README says it pauses and waits for Enter, then asks which server variant to install. The walkthrough chooses libev by entering 4, then sets a password, a port between 1 and 65535, and an encryption method, recommending xchacha20-ietf-poly1305 by entering 13. Two further prompts are accepted with Enter.

The final step in the server section is disabling the firewall:

bash
sudo ufw disable

The README gives no explanation for this beyond a warning marker. It is a real trade-off: the instance becomes reachable on every port, not just the one Shadowsocks uses.

Connecting a client and choosing between PAC and global mode

The tutorial then moves to client software, listing release pages for Windows, Android, macOS, and Linux, and recommending Potatso Lite for iOS. It explains that VPN apps were removed from the Chinese App Store, so an account from another region is needed, and it walks through switching accounts. The Windows client is used as the worked example: download, unzip, run Shadowsocks.exe, right-click the tray icon, and enter the server IP, port, password, and encryption method recorded earlier.

The distinction between PAC and global mode is one of the few conceptual passages. PAC sends domestic traffic directly and only routes blocked destinations through the server; global sends everything. The README recommends PAC and notes that the rules come from the gfwlist project, inviting readers to file issues when a site is misclassified. That is a reasonable default, though PAC depends on a rule list that is maintained elsewhere and can lag behind new domains.

Client setup is where most failures actually surface, and the guide is thin here. There is no troubleshooting section for a client that connects but transfers nothing, and no mention of how to confirm which mode is active beyond a screenshot.

Operating the server: service commands, multi-port, and uninstall

The supplement section lists the service control commands per variant. For libev, the README gives the init script paths directly:

bash
/etc/init.d/shadowsocks-libev start
/etc/init.d/shadowsocks-libev stop
/etc/init.d/shadowsocks-libev restart
/etc/init.d/shadowsocks-libev status

Equivalent paths are documented for the python, r, and go variants. The verbs are consistent across all four: start, stop, restart, status. Removal is handled by rerunning the installer with an argument:

bash
./shadowsocks-all.sh uninstall

The README says the script then prompts for the variant to remove. Multi-port configuration is not documented in the repository; it is delegated to an external blog post, which means the repository alone is not sufficient if you need several ports. The same applies to KCPTUN acceleration and iptables rules, both of which live in separate files in the repository rather than in the main walkthrough.

Where this guide stops being the right tool

The installer is the main limitation and the README admits it: the upstream author has exited, so the script receives no updates. Anyone following the tutorial is running a frozen artifact on a fresh Debian 12 image. That is not automatically broken, but it means no fixes arrive if a dependency changes or a prompt sequence shifts.

Disabling ufw removes the host firewall entirely rather than opening a single port. The README does not discuss alternatives, and a reader who later adds other services to the same instance inherits that exposure without necessarily remembering it.

The document also has no section on what to do when the IP is blocked after the fact, beyond the initial ping test. There is no rotation procedure, no discussion of how to move configuration to a new server, and no rollback instructions. The README does not document rollback. If you need a reproducible, auditable deployment, a tutorial that asks you to pipe a remote script into a shell is the wrong shape.

Finally, there is no licence file in the top-level listing. The text and the bundled script are redistributed without stated terms, which matters if you intend to mirror or reuse them.

How it compares with configuring a server by hand

The alternative most readers will weigh is installing Shadowsocks directly from Debian packages and writing the configuration file themselves. The difference is not the protocol; it is who owns the decisions. The installer asks a fixed sequence of questions, writes the config, and sets up an init script. Doing it by hand means choosing the package, writing the JSON config, and creating a systemd unit, which is more work but leaves you with a file you can read, version, and reproduce.

The tutorial's approach wins on time to first connection and loses on transparency. The README even tells readers to screenshot the final output because the script does not leave the credentials anywhere convenient. That is a symptom: the configuration exists, but the guide treats it as something to capture rather than something to manage.

A middle path is to run the script once on a throwaway instance, read the generated config, and then rebuild the same settings manually on the instance you intend to keep. The README does not suggest this, but the service command list it provides makes the resulting setup manageable either way.

Maintenance, upgrade, and licence questions

Maintenance status is mixed. The repository itself is not archived, and the last push was on 2026-09-04, so the tutorial text is being touched. The installer it depends on is a different matter: the README states the upstream author has exited and the version is no longer updated. Two different maintenance clocks are running here, and only one of them is under this repository's control.

Upgrade cost is therefore mostly manual. There is no documented update path in the README beyond rerunning the installer, and no changelog or release notes were retrieved. A reader who installs today has no stated way to move to a newer server build later.

On licensing, the top-level entries include no LICENSE file, so the terms for the README text and the sh/ script are not specified in the repository. That is a fact to check before redistributing either, and it is not legal advice. If you plan to reuse the installer in your own documentation, resolve the terms first.

Editorial conclusion

Adopt this if you have never opened a terminal and want a single ordered path from buying a VPS to a working client, and if you accept that the installer script is frozen. Do not adopt it if you need current server-side hardening, a maintained install path, or a documented licence for redistribution. Before you start, verify three things: that the IP responds to ping, that port 22 accepts your SSH client, and that the script URL still returns a file you can inspect.

Frequently asked questions

What do I need before starting the Shadowsocks-Tutorial?

You need a VPS from a provider such as Vultr or DigitalOcean, an SSH client, and a Shadowsocks client for your device. The README recommends Debian 12 x64 as the server image and notes that macOS and Windows 10 users can connect with the built-in terminal.

Which Shadowsocks server version does the tutorial install?

The installer offers several variants, and the walkthrough chooses libev by entering 4 at the prompt. The README also documents service commands for the python, r, and go variants if you pick a different one.

Is the Shadowsocks-Tutorial installer still maintained?

The README states that the upstream author has exited and the version is no longer updated, though the command still works. The repository itself had a push on 2026-09-04, so the tutorial text and the installer are on different maintenance clocks.

Why does the tutorial tell me to disable the firewall?

The README includes sudo ufw disable as the last server step with a warning marker but no further explanation. It removes the host firewall rather than opening only the Shadowsocks port, so any other service you add to that instance is exposed.

How do I remove Shadowsocks installed by this tutorial?

Rerun the installer with the uninstall argument and follow the prompt to select the variant. The README gives the command ./shadowsocks-all.sh uninstall.

What is the difference between PAC and global mode in the Shadowsocks-Tutorial?

PAC routes domestic sites directly and sends only blocked destinations through the server, while global sends all traffic through it. The README recommends PAC and notes that the rules come from the gfwlist project.

Official sources

  1. Issues
  2. Project website
  3. README
  4. zhaoweih/Shadowsocks-Tutorial on GitHub
Community notes

Community notes