May 15, 2022

Поднимаем Shadowsocks прокси

Прокси с шифрованием трафика и минимальным падением скорости.

Сегодня расскажем вам о том, как поднять Shadowsocks - бесплатный опенсорсный SOCKS5 прокси!

Суть его работы такова: клиент делает вид, что он является прокси-сервером, получает входящие соединения и шифрует их. После этого отправляет на сервер и там уже выпускает в интернет.

Чем он так хорош?

  • Все данные, которые проходят через клиент и сервер зашифрованы.
  • Скорость работы. По сравнению с SSH туннелем, который работает по схожему принципу, shadowsocks имеет большую пропускную способность.
  • Алгоритм шифрования можете выбрать сами.
  • Возможность настроить доступ на уровне отдельных программ/сайтов.
  • OpenVPN, Tor, SSH довольно просто определяются китайским фаерволлом. Shadowsocks - нет. Даже если вашему провайдеру захочется троттлить соединение к прокси, есть возможность прикрутить обфускацию соединения. Плагин маскирует прокси-трафик под HTTPS или TLS/SSL.
  • Удобные клиенты для любых устройств. Можете забыть о ненадежных впн мобильных устройств, скачиваете клиент и подключаетесь к собственному серверу. Батарею жрет не сильно, хотя это зависит от способа шифрования. Если использовать AES, то летает почти на любых смартфонах, даже довольно старых из-за аппаратной поддержки шифрования.

Для каких задач он пригодится?

  • Защита данных при использовании сетей, который не внушают доверия. Например, публичный wi-fi.
  • Обход любых блокировок, фаерволлов провайдера. Достаточно арендовать сервер, который находится в стране, где нет блокировок.
  • Для защиты от перехвата трафика. Но это скорее инструмент приватности, нежели анонимности. Если будете делать что-то незаконное через сервер, хостер сольет данные о вас по первому запросу. Чтобы этого избежать, можно купить сервер в стране третьего мира, где хостеру глубоко пофиг на запросы информации. Но в любом случае есть риск. Тем не менее, он сильно ниже, чем при работе с обычными VPN, ведь они тоже сливают данные по первому запросу.

Перейдем к установке сервера

  • Я буду показывать на примере сервера за 99р/месяц от российского хостера с сервером в Нидерландах. Операционная система - ubuntu 20.04. Характеристики - 1 гб озу, 1 ядро e5-2630L v2 и kvm виртуализация. Заявленная сеть 200мбит.
  • Покупаем сервер. Выбираем операционную систему.
  • Вам придет IP с паролем. Подключаемся через ssh по putty к этому IP. Порт оставляем стандартным - 22.
  • Логинимся. По стандарту через root`а, если нет - хостер указал название учетки в панели управления/письме, которое прислал на почту. Пароль должен быть там же (то, что пароль не показывается когда вы его вводите - нормально).
  • Выполняем следующую команду для обновления репозитрия linux-софта (вставить команду из буфера обмена можно нажав ПКМ в putty).
sudo apt update && apt upgrade -y
  • Это займет некоторое время. Прогресс можно наблюдать слева снизу.
  • Далее ставим snapd. На гитхабе shadowsocks-libev сказано, что рекомендовано устанавливать сам сервер через snap.
sudo apt install -y snapd
  • Теперь ребутим сервер:
sudo reboot
  • После этого ставим сам сервер shadowsocks. Мы будем использовать версию, написанную на C. Она очень быстра и мало весит. Вводим:
sudo snap install shadowsocks-libev
  • Создаем директорию в которой будут хранится файлы конфигурации:
sudo mkdir -p /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev
  • После этого создаем и заходим в файл конфигурации сервера:
sudo touch /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json
sudo nano /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json
  • Приводим его к такому виду:
{
    "server":"server_ip",
    "server_port":random_port,
    "local_port":1080,
    "password":"pass",
    "timeout":20,
    "method":"chacha20-ietf-poly1305",
    "fast_open":true,
    "nameserver":"1.1.1.1",
    "mode":"tcp_and_udp"
}
IP в поле server - публичный ip сервера (тот, по которому вы к нему подключаетесь). Можно прослушивать все сетевые интерфейсы, используя ip 0.0.0.0
Server_port - это порт сервера. Я использую 443, хотя это может быть любой свободный порт. Если вы не используете порты 80/443 для хостинга сайта на этом же сервере, их можно использовать.
local_port оставляем стандартный.
password вводим посложнее. В любом случае вводить его много раз не придется, только 1 раз в клиенте с компьютера. Телефон можно подключить через QR-код.
timeout это время до отключения сокета в секундах, если соединение не используется. Со значением в 20 секунд все будет хорошо.
Method - метод шифрования. Chacha20 достаточно надежный, чтобы никто не расшифровал ваш трафик. Для более быстрой работы, если есть аппаратное ускорение AES`a, или аккумулятор на телефоне быстро садится, можно использовать его. В таком случае, вместо chacha20-ietf-poly1305 введите aes-256-gcm. Оба алгоритма шифрования очень мощные.
fast_open снижает латентность, то есть пинг. В случае проблем, стоит попробовать отключить его.
nameserver - какой днс сервер будет использовать shadowsocks. Можно не задавать эту строку, тогда сервер будет использовать днс, который использует ваш хостер. Я же задам DNS от CloudFlare, а именно, 1.1.1.1
mode - использование tcp/udp трафика или обоих. Если в вашей сети есть специфические требования, возможно, потребуется установить tcp_only. В остальных случаях используйте tcp_and_udp.
  • После того, как прописали файл конфигурации, жмем CTRL+O, после чего Enter. Выходим из файла конфигурации на CTRL+X.
  • Теперь у нас есть сконфигурированный сервер. Но ведь неудобно после любой перезагрузки запускать его самому? Создадим сервис, который сделает это за нас:
sudo touch /etc/systemd/system/[email protected]
sudo nano /etc/systemd/system/[email protected]
  • Вставляем это:
[Unit]
Description=Shadowsocks-Libev Custom Server Service for %I
Documentation=man:ss-server(1)
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/snap run shadowsocks-libev.ss-server -c /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/%i.json

[Install]
WantedBy=multi-user.target
  • Выходим, сохранив все это через ctrl+o.
  • Выполняем следующую команду:
sudo systemctl enable --now shadowsocks-libev-server@config
  • Проверяем, запустился ли наш сервер:
sudo systemctl status shadowsocks-libev-server@config
  • Успех!
Иногда после ребутов сервер запускается с ошибкой, и нужно вручную выполнить эту команду опять:
sudo systemctl enable --now shadowsocks-libev-server@config
После этого сервер запускается нормально.

Настраиваем клиент

  • Скачиваем его под нужное устройство с официального сайта: https://shadowsocks.org/en/download/clients.html
  • Добавляем сервер, указываем данные, которые вписывали в config.json. Выбираем одно и то же шифрование.
  • Теперь тыкаем по значку shadowsocks, ставим галочку автозагрузка и выбираем системный прокси сервер - для всей системы. Проверяем IP на удобном для вас сайте. Чтобы подключится с телефона, скачиваем на него shadowsocks. С компьютера заходим в серверы - поделится конфигурацией сервера. Сканируем qr-код.
  • 2ip.ru и duckduckgo определяют разные местоположения, что странно, но с IP все в порядке - мы выходим в интернет не со своим IP, а с IP нашего хоста.
  • Теперь для максимальной производительности немного подредактируем настройки ядра.
sudo nano /etc/sysctl.conf
  • В конце файла вставляем это:
fs.file-max = 51200
net.core.netdev_max_backlog = 250000
net.core.somaxconn = 4096
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.core.netdev_max_backlog = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_mtu_probing = 1
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_mem = 25600 51200 102400
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
  • Сохраняем. Применяем новые настройки:
sudo sysctl -p
  • Готово!
Скорость без прокси.
Используя shadowsocks (2 теста в разное время суток).

Падение не столь значительное. upload почему-то просел, но все равно пользоваться интернетом вполне комфортно.