September 23, 2020

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

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

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

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

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

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

*Сейчас пришла мысль, что детектить из реальный ип-адрес можно при использовании сравнений (если вы пользуетесь российскими сервисами, которые сливают данные). Пакет Яровой имеет данные о трафике, а также можно данные с серверов и российских сервисов и может сравнить, с какого ип пользователь использовал сервис, и кто в этот момент подключался к ип адресу. Это можно обойти, отправив трафик на CDN-сервер cloudflare. На оверах описано, как это можно сделать. Если кто-то заинтересовался, вот принцип работы

Что ж, с водой покончено, перейдем к установке сервера. Я буду показывать на примере сервера за 99р/месяц от российского хостера, с сервером в Нидерландах. Операционная система - ubuntu 20.04. Характеристики - 1 гб озу, 1 ядро e5-2630L v2 и kvm виртуализация. Заявленная сеть 200мбит.

Покупаем сервер. Выбираем операционную систему.

Вам придет ип с паролем. Подключаемся через ssh по putty к этому ип. Порт оставляем стандартным - 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/shadowsocks-libev-server@.service
sudo nano /etc/systemd/system/shadowsocks-libev-server@.service

Вставляем это:

[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

Успех.

upd: иногда после ребутов сервер запускается с ошибкой, и нужно вручную выполнить эту команду опять:
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, а с ип нашего хоста.

Теперь для максимальной производительности немного подредактируем настройки ядра.

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 почему-то просел, но все равно пользоваться интернетом даже через прокси вполне комфортно.

Как пустить только трафик на определенные сайты через shadowsocks?


Скачиваем расширение для chrome - proxySwitchSharp, для лисы - foxyproxy (в хроме тоже есть, но у меня работал криво). Думаю, ссылки оставлять не надо, сами сможете найти.
Переходим в настройки. Покажу на примере хрома, но в лисе почти то же самое, только интерфейс немного другой.
Добавляем socks5 прокси. Хост - 127.0.0.1, порт 1080 (если вы не меняли его в настройках самого shadowsocks)

После чего переходим в switch rules, добавляем нужный сайт

Также ставим auto switch mode

Проверяем на нужном сайте. Не забывайте, что у вас должен быть заупщен shadowsocks с настроенным сервером.

Если нужно пустить определенное приложение через прокси - используйте proxifier