Поднимаем 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