ShadowSocks – это очень быстрый, лучший в своём роде прокси сервер, который способен обходить Великий Китайский Фаервол, в отличие от большинства VPN поставщиков. ShadowSocks настолько хорошо маскирует трафик под HTTPS-соединение, что в сравнении с VPN трафиком, Великий Фаервол не способен его идентифицировать и соответственно заблокировать. Чего не скажешь о подавляющем числе VPN серверов, которые благодаря наученным нейросетям Китайский Фаервол легко обнаруживает.

В этой небольшой статье я показываю, как поднять свой ShadowSocks сервер и тем самым обезопасить своё пребывание в Интернете. Статья является исключительно ознакомительной и не призывает использовать данный инструмент для нарушения законов!

Арендуем сервер под ShadowSocks

Можно арендовать VPS на XorekCloud в Европе за копейки, с самым стартовым конфигом.

При установке лучше выбрать Ubuntu до 22.04 версии.

Установка

Для начала скачаем установочный bash и установим ShadowSocks сервер.

Первый вариант для Debian до 10 версии и Ubuntu до 20.04:
wget --no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/Vndroid/shadowsocks-install/master/shadowsocks.sh
chmod +x shadowsocks.sh
./shadowsocks.sh install 2>&1 | tee shadowsocks.log

Второй вариант подходит для Debian 11 и выше и Ubuntu 22.04 и выше:
wget --no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
chmod +x shadowsocks.sh
./shadowsocks.sh 2>&1 | tee shadowsocks.log

Возможные ошибки

[Error] libsodium install failed!

Решается одним из нижеописанных способов:
  1. pecl install -f libsodium
  2. apt install libsodium libsodium-dev
  3. wget https://download.libsodium.org/libsodium/releases/LATEST.tar.gz && tar -xzf LATEST.tar.gz && cd libsodium-stable/ && ./configure && make && make check && make install && pecl install -f libsodium

Настройка ShadowSocks приложения

Далее настраиваем конфигурацию ShadowSocks сервера.

Конфиг файл в /etc/shadowsocks.conf полностью заменяем на:
{
    "server": "0.0.0.0",
    "server_port": 3785,
    "local_port": 1080,
    "password": "barfoo",
    "timeout": 20,
    "method": "aes-256-gcm",
    "fast_open": true,
    "mode": "tcp_only",
    "nameserver": "8.8.8.8"
}
Здесь мы указали порт 3785 и пароль barfoo, а также метод шифрования aes-256-gcm – эти данные нам понадобятся при создании строки конфигурации для клиента. Также мы указали DNS сервер гугла 8.8.8.8, его при желании можно заменить на любой другой, например Cloudflare 1.1.1.1.

Сразу устанавливаем net-tools для манипуляций с сетевой подсистемой:
apt install net-tools

Разрешаем подключение к 3785 порту:
iptables -4 -A INPUT -p tcp --dport 3785 -m comment --comment "Shadowsocks server listen port" -j ACCEPT
ufw allow proto tcp to 0.0.0.0/0 port 3785 comment "Shadowsocks server listen port"
sudo ufw allow 3785/udp && sudo ufw allow OpenSSH && sudo ufw disable && sudo ufw enable
Мы указали в конфиге /etc/shadowsocks.conf режим tcp_only, но несмотря на это разрешаем доступ к 3785 udp порту. Дело в том, что на некоторых серверах я наблюдал проблемы, если этого не сделать. Поэтому будем воспроизводить этот карго-культ.

В конце файла параметров ядра /etc/sysctl.conf указываем такие настройки:
fs.file-max = 51200

net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.netdev_max_backlog = 250000
net.core.somaxconn = 4096
net.core.default_qdisc = fq

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_mem = 25600 51200 102400
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_congestion_control = hybla

Далее командуем мантру:
sysctl --system && /etc/init.d/shadowsocks restart

После этого мы можем удостовериться, открыт ли наш tcp/udp порт 3785:
netstat -tlpn

Клиенты ShadowSocks

Клиенты под все платформы есть тут. Сам я использую Outline и для Mac OS, и для iOS.

Генерируем конфиг строку для клиента

Теперь осталось сформировать конфиг строку для подключения на клиенте. Я написал утилиту, с помощью которой это удобно сделать, всего лишь вбив данные сервера в нужные поля.