howto-db/data/pages/shadowsocks.txt
2024-02-10 12:53:55 +00:00

299 lines
17 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

====== Shadowsocks ======
**Shadowsocks** — это быстрый туннельный прокси с шифрованием передаваемых данных, а так же обладающий встроенными механизмами защиты от средств анализа сетевых пакетов (DPI), и с помощью плагинов способный маскировать трафик под конкретные протоколы (например, HTTPS или [[wpru>Протокол_установления_сеанса|SIP]]). C помощью shadowsocks возможно как проксирование TCP, так и туннелирование UDP.
Здесь будет описана простая настройка актуальной версии shadowsocks, написанной на [[wpru>Rust_(язык_программирования)|rust]] (на момент публикации статьи версия 1.16.1).
Настроенный shadowsocks можно использовать для проксирования через него других протоколов, включая [[wpru>OpenVPN|OpenVPN]], [[wireguard|Wireguard]], [[yggdrasil:yggdrasil|Yggdrasil]] и других.
===== Сборка / Установка =====
Установить shadowsocks можно несколькими различными способами, включая загрузку [[wpru>Docker|docker-образа]], [[wpru>Snappy_(система_управления_пакетами)|snap-пакета]], установку с помощью cargo (меенджер пакетов rust), используя kubectl для [[wpru>Kubernetes|Kubernetes]], просто загрузку бинарных файлов или сборку их из исходников.
Все эти способы описаны в файле [[https://github.com/shadowsocks/shadowsocks-rust/blob/master/README.md|README.md]].
Готовые бинарные файлы под различные архитектуры можно скачать со страницы: https://github.com/shadowsocks/shadowsocks-rust/releases
==== Сборка из исходников ====
Предполагается наличие установленных [[wpru>Git|git]] и rust.
<code>git clone https://github.com/shadowsocks/shadowsocks-rust</code>
<code>cd shadowsocks-rust</code>
<code>cargo build --release</code>
После выполнения этих команд и завершения сборки проекта, в каталоге ''%%./target/release/%%'' можно будет найти бинарные файлы: ''%%sslocal%%'', ''%%ssserver%%'', ''%%ssmanager%%'', ''%%ssservice%%'' и ''%%ssurl%%''.
//**Примечание:** если вы планируете использовать бинарные файлы на машине, архитектура/ОС которой отличаются от ваших текущих, вам необходимо использовать кросс-компиляцию. Подробнее об этом можно прочесть здесь: https://rust-lang.github.io/rustup/cross-compilation.html //
==== Описание бинарных файлов ====
* sslocal - клиент shadowsocks
* ssserver - сервер shadowsocks
* ssmanager - утилита управления конфигурацией shadowsocks
* ssservice - утилита управления сервисами shadowsocks, генератор ключа шифрования
* ssurl - утилита, предназначенная для кодирования и декодирования адресов для использования с shadowsocks (пример: ''%%ss://YWVzLTI1Ni1jZmI6cGFzc3dvcmQ@127.0.0.1:8388/?plugin=obfs-local%3Bobfs%3Dhttp%3Bobfs-host%3Dwww.baidu.com%%'')
===== Настройка =====
Генерируем ключ, спомощью которого будут шифроваться передаваемые данные:
<code>ssservice genkey -m "aes-128-gcm"</code>
Рекомендуемые значения алгоритмов шифрования перечислены на этой странице: https://shadowsocks.org/doc/aead.html
В результате получим примерно такую строку:
<code>1/AiFEsK70+gObAwU8qQTA==</code>
Этот ключ будет использован в конфигурационных файлах и клиента, и сервера.
Далее создаем файлы ''%%config_l.json%%'' и ''%%config_s.json%%'' для клиента и сервера соответственно.
Эти файлы будут одинаковыми за исключением того, что в файле для клиента будут два параметра, которых нет в файле для сервера.
<file json config_s.json>
{
"server": "my_server_ip",
"server_port": 8388,
"password": "1/AiFEsK70+gObAwU8qQTA==",
"method": "aes-128-gcm"
}
</file>
* server - адрес, на котором будет ожидать подключений ваш сервер
* server_port - порт сервера
* password - ключ шифрования (сгенерирован выше)
* method - метод шифрования
//**Обратите внимание:** метод шифрования, который указывается здесь и в конфигурационном файле для клиента, должен соответствовать тому, что указывался при создании ключа шифрования (см. выше).//
<file json config_l.json>
{
"server": "my_server_ip",
"server_port": 8388,
"password": "1/AiFEsK70+gObAwU8qQTA==",
"method": "aes-128-gcm",
"local_address": "127.0.0.1",
"local_port": 1080
}
</file>
Большинство параметров здесь точно такие же, как для серверной конфигурации.
* local_address - адрес, на котором будет ожидать подключений клиент shadowsocks (адрес локального socks-прокси)
* local_port - локальный порт
===== Использование =====
Если вы устанавливаете и настраиваете всё вручную, необходимо скопировать бинарные файлы в каталог ''%%/usr/bin/%%'', а конфигурационный файл в каталог ''%%/etc/shadowsocks-rust/%%'' на клиенте и на сервере.
Для настройки автозапуска можно использовать шаблоны скриптов и (или) systemd-юнитов из каталога: https://github.com/shadowsocks/shadowsocks-rust/tree/master/debian
Например, это могут быть такие файлы:
<WRAP group>
<WRAP column>
<file shadowsocks-rust-server.service>
[Unit]
Description=Shadowsocks-rust Custom Server Service
Documentation=https://github.com/shadowsocks/shadowsocks-rust
After=network.target
[Service]
Type=simple
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
ExecStart=/usr/bin/ssservice server --log-without-time -c /etc/shadowsocks-rust/config_s.json
[Install]
WantedBy=multi-user.target
</file>
</WRAP>
<WRAP column>
<file shadowsocks-rust-local.service>
[Unit]
Description=Shadowsocks-rust Custom Client Service
Documentation=https://github.com/shadowsocks/shadowsocks-rust
After=network.target
[Service]
Type=simple
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
ExecStart=/usr/bin/ssservice local --log-without-time -c /etc/shadowsocks-rust/config_l.json
[Install]
WantedBy=multi-user.target
</file>
</WRAP>
</WRAP>
Юниты копируем в /lib/systemd/system/.
Запускаем так (на клиенте):
<code>sudo systemctl enable --now shadowsocks-rust-local</code>
На сервере:
<code>sudo systemctl enable --now shadowsocks-rust-server</code>
<details>
<summary>Автозапуск под Windows</summary>
\\
Управление работой shadowsocks под Windows, как вариант, можно осуществлять с помощью планировщика Windows из командной строки.
Создание задания:
<code>schtasks /create /tn "Shadowsocks" /tr "c:\ssservice.exe local -c c:\config_l.json" /sc onstart</code>
Задание будет выполняться при загрузке системы.
С помощью ключей /U /P (или /RU /RP) можно указать под каким пользователем будет выполняться задание.
Остановка задания:
<code>schtasks /Run /I /TN "Shadowsocks"</code>
Запуск задания вручную:
<code>schtasks /End /TN "Shadowsocks"</code>
Подробнее: https://ab57.ru/cmdlist/schtasks.html
</details> \\
//**Важно:** если в системах работает firewall, не забудьте разрешить соответствующие входящие/исходящие соединения! Пример для сервера: ''%%iptables -A INPUT -p tcp -i eth0 --dport 8388 -j ACCEPT%%''//
После запуска сервисов на сервере и локальной машине можно переходить к непосредственному использованию shadowsocks в целях, для которых это ПО предназначено :)
==== Браузер ====
Для серфинга Интернета в браузере с использования shadowsocks, заходим в настройки браузера и указываем в них наш свеженастроенный локальный прокси-сервер: 127.0.0.1:1080.
<details>
<summary>Пример настройки браузера Mozilla Firefox</summary>
\\
{{shadowsocks:ff_proxy_settings.png?500}}
</details> \\
Браузер будет устанавливать соединение с удаленным web-сервером через локальный прокси-сервер, который, в свою очередь, будет пускать трафик через удаленный сервер, шифруя (и при необходимости маскируя) его.
==== Yggdrasil ====
Для подключения к пирам Yggdrasil через shadowsocks в секцию Peers конфигурационного файла добавляются строки такого вида:
<code>socks://127.0.0.1:1080/public_node_ip:port</code>
Здесь ''%%public_node_ip%%'' - IP-адрес публичного пира, ''%%port%%'' - порт публичного пира, 127.0.0.1:1080 - адрес и порт на которых ожидает подключения клиент shadowsocks.
==== Wireguard ====
Пример подключения [[wireguard|Wireguard]] (работает по UDP) через shadowsocks...
Приводим конфигурационный файл сервера shadowsocks к такому виду:
<code>{
"server": "my_server_ip",
"server_port": 8388,
"password": "1/AiFEsK70+gObAwU8qQTA==",
"method": "aes-128-gcm",
"mode": "tcp_and_udp"
}</code>
Приводим конфигурационный файл клиента shadowsocks к такому виду:
<code>{
"server":"my_server_ip",
"server_port":8388,
"password":"1/AiFEsK70+gObAwU8qQTA==",
"method":"aes-128-gcm",
"mode":"tcp_and_udp",
"locals": [
{
"mode":"udp_only",
"protocol":"tunnel",
"forward_address":"my_server_ip",
"forward_port":51821,
"local_address":"127.0.0.1",
"local_port":51821
},
{
"mode":"tcp_only",
"protocol":"socks",
"local_address": "127.0.0.1",
"local_port": 1080
}
]
}</code>
Новые параметры здесь:
* mode - какие протоколы будут обрабатываться shadowsocks
* locals - в этом массиве можно перечислить несколько конфигураций клиента
* protocol - протокол работы shadowsocks
* local_address - адрес, на который будет перенаправлено соединение в туннельном режиме (адрес сервера wireguard)
* forward_port - port, на который будет перенаправлено соединение в туннельном режиме (порт сервера wireguard)
Далее, в настройках wireguard на клиенте (''%%/etc/wireguard/wg0.conf%%'') нужно поменять адрес пира (''%%Endpoint%%'') на 127.0.0.1:51821. Так же, в секцию ''%%[Interface]%%'' можно добавить параметр ''%%MTU = 1384%%''.
Перезапускаем службы shadowsocks и поднимаем туннель wg:
<code>sudo wg-quick up wg0</code>
Вроде бы, всё поднялось, но сайты не открываются, пинги не идут.
Дело в том, что после поднятия туннеля весь трафик у нас заворачивается в туннель wireguard, включая трафик, который идет к серверу shadowsocks. Образуется петля.
Решается эта проблема довольно просто:
<code>sudo ip route add my_server_ip via my_router_ip</code>
Здесь my_server_ip - это адрес нашего удаленного сервера; my_router_ip - это адрес домашнего роутера.
Таким образом трафик до нашего удаленного сервера мы пускаем в обход туннеля WG, напрямую.
Эту команду можно прописать в конфигурационный файл wg0.conf, в секцию ''%%[Interface]%%'', чтобы не вбивать кадый раз вручную:
<code>
PostUp = ip route add my_server_ip via my_router_ip
PostDown = ip route del my_server_ip
</code>
Перезапускаем и теперь всё работает отлично!
==== Мобильные устройства ====
=== Android ===
== v2rayNG ==
На устройствах с ОС [[wpru>Android|Android]] можно использовать приложение [[https://play.google.com/store/apps/details?id=com.v2ray.ang&hl=en_US|v2rayNG]].
[[wpru>Открытое_программное_обеспечение|Open-source]], репозиторий: https://github.com/2dust/v2rayNG
<details>
<summary>Пример настроек v2rayNG на планшете</summary>
\\
{{shadowsocks:andr_v2rayNG_ss.PNG?600}}
</details>
\\
=== iOS ===
== Potatso ==
Одно из приложений, которое позволяет пустить трафик смартфона через сервер shadowsocks - [[https://apps.apple.com/ru/app/potatso/id1239860606|Potatso]].
Приложение бесплатно, имеет удобный интерфейс и понятные настройки. Поддерживается плагин Simple Obfs (простая [[wpru>Обфускация_(программное_обеспечение)|обфускация]]).
Добавляет в систему профиль VPN.
Подключение можно активировать как из самого приложения, так и из системных настроек в разделе VPN.
<details>
<summary>Пример настроек Potatso на iPhone</summary>
\\
{{shadowsocks:ios_potatso_ss.png?300}}
</details>
===== Дополнительно =====
Заинтересовавшимся темой рекомендую ознакомиться с некоторыми статьями за авторством MiraclePtr с портала habr.com, сохраненными в этом архиве: [[this>_media/shadowsocks:miracleptr_articles.zip|miracleptr_articles.zip]].
<details> <summary>Так же можно ознакомиться с видеоинструкциями на эту тему.</summary> {{shadowsocks:vpn2024.mp4}} </details>
====== Ссылки ======
Сайт shadowsocks (EN): https://shadowsocks.org/ \\
Подробная документация shadowsocks (EN): https://github.com/shadowsocks/shadowsocks/wiki \\
GitHub-репозиторий проекта shadowsocks-rust (EN): https://github.com/shadowsocks/shadowsocks-rust \\
О настройке shadowsocks c плагином V2Ray (RU): https://krasovs.ky/2022/03/19/shadowsocks-and-v2ray-and-cloudflare.html