Установка и настройка Shadowsocks-rust
1. Установка сервера Shadowsocks-rust
1.1 Используемая документация
- https://shadowsocks.org/doc/configs.html
- https://shadowsocks.org/doc/advanced.html
- https://shadowsocks.org/doc/sip002.html
- https://shadowsocks.org/doc/sip003.html
- https://shadowsocks.org/doc/sip008.html
- https://shadowsocks.org/doc/sip022.html
- https://shadowsocks.org/doc/sip023.html
- https://github.com/shadowsocks/shadowsocks-rust?tab=readme-ov-file#configuration
- https://jqlang.github.io/jq/manual/
1.2 Дополнительное ПО
Для проверки корректности файлов JSON нам понадобится утилита jq. Установить ее можно из репозиториев или напрямую из git:
_URL="https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-amd64"
_APP="/usr/bin/jq"
wget -q -O ${_APP} ${_URL}
chmod a+x ${_APP}
chown 0:0 ${_APP}
unset _URL _APPПроверку можно выполнить командой:
jq '.' <path_to_file>
1.3 Предварительная настройка системы
На странице Advanced configurations рекомендуют изменить ограничения на количество открытых файловых дескрипторов, но в файле /etc/security/limits.conf прямо сказано что для служб это не работает и применяется только для пользователей вошедших в систему через PAM. Чтобы изменить количество открытых файловых дескрипторов для службы, необходимо в файле конфигурации службы добавить строку:
LimitNOFILE=51200
Установим рекомендуемые системные переменные:
cat >/etc/sysctl.d/00-shadowsocks.conf <<HEREDOC 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.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 = 8192 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 HEREDOC sysctl -p /etc/sysctl.d/00-shadowsocks.conf
1.4 Установка сервера Shadowsocks-rust
Настроим переменные для процесса установки:
URL="https://github.com/shadowsocks/shadowsocks-rust/releases/download/v1.19.2/shadowsocks-v1.19.2.x86_64-unknown-linux-musl.tar.xz" CONF="/etc/shadowsocks-rust/server.json" SERVICE="/etc/systemd/system/shadowsocks-rust.service"
Загружаем и устанавливаем Shadowsocks-rust из git:
wget -q -O - ${URL} | tar --xz --extract
install --mode=0755 --owner=root --group=root --preserve-timestamps -D --target-directory=/usr/bin ssmanager ssserver sslocal ssservice ssurl
rm ssmanager ssserver sslocal ssservice ssurlssserver - серверная часть Shadowsocks-rust
sslocal - клиентская часть Shadowsocks-rust
ssservice - серверная/клиентская часть Shadowsocks-rust
ssurl - утилита для генерации qr-code и/или ссылки на подключение к нашему серверу
Для нашего конфига будем использовать ssservice, хотя ни кто не запрещает заменить его на ssserver. Все приложения независимы друг от друга.
В данном примере будут использоваться алгоритмы шифрования использующие длину ключа 32 байта:
Алгоритм шифрования aes-256-gcm поддерживается всеми клиентами в отличие от более нового 2022-blake3-aes-256-gcm. В списке поддерживаемых алгоритмов актуальными числятся AEAD Ciphers и AEAD 2022 Ciphers, все остальные помечены как Deprecated.
- 2022-blake3-aes-128-gcm
- 2022-blake3-aes-256-gcm
- 2022-blake3-chacha20-poly1305
- 2022-blake3-chacha8-poly1305
Сгенерировать ключ можно через ssservice или openssl:
ssservice genkey --encrypt-method aes-256-gcm
openssl rand -base64 32
Можем сгенерировать один пароль для всех алгоритмов или под каждый алгоритм свой ключ. Для упрощения данного примера сделаем один ключ для всех алгоритмов поддерживаемых нашим сервером:
PASS=$(ssservice genkey --encrypt-method aes-256-gcm)
Создадим каталог для нашего будущего конфига:
mkdir -p $(dirname ${CONF})cat >${CONF} <<HEREDOC
{
"udp_timeout": 300,
"udp_max_associations": 512,
"mode": "tcp_and_udp",
"fast_open": true,
"timeout": 300,
"servers": [
{
"server": "0.0.0.0",
"server_port": 11443,
"method": "aes-256-gcm",
"password": "${PASS}"
},
{
"server": "0.0.0.0",
"server_port": 12443,
"method": "2022-blake3-aes-256-gcm",
"password": "${PASS}"
},
{
"disabled": true,
"server": "0.0.0.0",
"server_port": 13443,
"method": "2022-blake3-aes-256-gcm",
"password": "${PASS}",
"users": [
{
"name": "user1",
"password": "$(ssservice genkey --encrypt-method aes-256-gcm)"
},
{
"name": "user2",
"password": "$(ssservice genkey --encrypt-method aes-256-gcm)"
}
]
}
]
}
HEREDOCЕсли мы хотим разграничить доступ по пользователям, с применением шифрования aes-256-gcm для этого придется использовать отдельный порт для каждого пользователя. В версии 2022-blake3-aes-256-gcm это поправили, стало возможным создавать дополнительные пользовательские пароли. Так же за счет этого стала возможна работа через relay (поддерживается в некоторых реализациях shadowsocks серверов). Формат пароля для пользователя указывается в виде пароля сервера и пароля пользователя разделенных двоеточием. Поддержка пользователей реализована не для всех алгоритмов AEAD 2022 Ciphers, только для 2022-blake3-aes-256-gcm. Если необходимо временно отключить какой-то из конфигов сервера, можно добавить строку "disabled": true, в начало соответствующей секции и перезапустить сервис shadowsocks-rust:
systemctl restart shadowsocks-rust.service
Пример конфигурации сервера и клиентов с разделением по пользователям:
{
"server": "0.0.0.0",
"server_port": 13443,
"method": "2022-blake3-aes-256-gcm",
"password": "zZyWP+OBQWG5YmL0flJyNTZdeUORlZw1urCbIlhZHmA=",
"users": [
{
"name": "user1",
"password": "XtXtAUk3wUWjvJ336HD69uTSTgRzVwBpon1ACj03py8="
},
{
"name": "user2",
"password": "2tP/krYV6RNBqM0xwXKwYi0af1Rs6lk23wpBHWYYoNo="
}
]
}{
"server": "shadowsocks.example.com",
"server_port": 13443,
"method": "2022-blake3-aes-256-gcm",
"password": "zZyWP+OBQWG5YmL0flJyNTZdeUORlZw1urCbIlhZHmA=:XtXtAUk3wUWjvJ336HD69uTSTgRzVwBpon1ACj03py8="
"local_address": "127.0.0.1",
"local_port": 1080
}{
"server": "shadowsocks.example.com",
"server_port": 13443,
"method": "2022-blake3-aes-256-gcm",
"password": "zZyWP+OBQWG5YmL0flJyNTZdeUORlZw1urCbIlhZHmA=:2tP/krYV6RNBqM0xwXKwYi0af1Rs6lk23wpBHWYYoNo="
"local_address": "127.0.0.1",
"local_port": 1080
}Создадим для запуска службы отдельного пользователя:
useradd --system --home-dir /nonexistent --no-create-home --shell /usr/sbin/nologin shadowsocks
В целом этого можно и не делать, тогда в конфиге службы можно не указывать параметры User и Group, но в целях безопасности лучше запускать службу от непривилегированного пользователя.
Теперь создадим Unit файл для нашей службы:
cat >${SERVICE} <<HEREDOC
[Unit]
Description=Shadowsocks-rust Server
Documentation=https://github.com/shadowsocks/shadowsocks-rust
Documentation=https://shadowsocks.org/doc/configs.html
After=network-online.target
[Service]
Type=simple
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
User=shadowsocks
Group=shadowsocks
LimitNOFILE=51200
ExecStart=/usr/bin/ssservice server -c ${CONF}
[Install]
WantedBy=multi-user.target
HEREDOCВыполним reload для systemctl, чтобы наш файл службы появился в списке сервисов:
systemctl daemon-reload
Включим автозапуск службы и запустим её:
systemctl enable --now $(basename ${SERVICE})Проверим что в процессе запуска нет ошибок и служба запустилась:
systemctl status $(basename ${SERVICE})Удаляем наши переменные или закрываем консоль:
unset URL unset CONF unset SERVICE unset PASS
2. Обновление сервера Shadowsocks-rust
URL="https://github.com/shadowsocks/shadowsocks-rust/releases/download/v1.19.2/shadowsocks-v1.19.2.x86_64-unknown-linux-musl.tar.xz"
systemctl stop shadowsocks-rust
wget -q -O - ${URL} | tar --xz --extract
install --mode=0755 --owner=root --group=root --preserve-timestamps -D --target-directory=/usr/bin ssmanager ssserver sslocal ssservice ssurl
rm ssmanager ssserver sslocal ssservice ssurl
systemctl start shadowsocks-rust
systemctl status shadowsocks-rust
unset URL3. Удаление сервера Shadowsocks-rust
CONF="/etc/shadowsocks-rust/server.json"
SERVICE="/etc/systemd/system/shadowsocks-rust.service"
systemctl disable --now shadowsocks-rust
rm ${SERVICE}
rm -rf $(dirname ${CONF})
rm /usr/bin/{ssmanager,ssserver,sslocal,ssservice,ssurl}
userdel shadowsocks
unset CONF
unset SERVICE4. Установка клиента Shadowsocks-rust Linux
Установка клиентской части Shadowsocks-rust выполняется точно таким же образом как и серверной, разница будет только в конфигурации:
URL="https://github.com/shadowsocks/shadowsocks-rust/releases/download/v1.19.2/shadowsocks-v1.19.2.x86_64-unknown-linux-musl.tar.xz"
CONF="/etc/shadowsocks-rust/client.json"
SERVICE="/etc/systemd/system/shadowsocks-rust.service"
wget -q -O - ${URL} | tar --xz --extract
install --mode=0755 --owner=root --group=root --preserve-timestamps -D --target-directory=/usr/bin ssmanager ssserver sslocal ssservice ssurl
rm ssmanager ssserver sslocal ssservice ssurl
mkdir -p $(dirname ${CONF})
cat >${CONF} <<HEREDOC
{
"udp_timeout": 300,
"udp_max_associations": 512,
"mode": "tcp_and_udp",
"fast_open": true,
"timeout": 300,
"servers": [
{
"server": "shadowsocks.example.com",
"server_port": 11443,
"method": "aes-256-gcm",
"password": "zZyWP+OBQWG5YmL0flJyNTZdeUORlZw1urCbIlhZHmA="
},
{
"server": "shadowsocks.example.com",
"server_port": 12443,
"method": "2022-blake3-aes-256-gcm",
"password": "zZyWP+OBQWG5YmL0flJyNTZdeUORlZw1urCbIlhZHmA="
},
{
"disabled": true,
"server": "shadowsocks.example.com",
"server_port": 13443,
"method": "2022-blake3-aes-256-gcm",
"password": "zZyWP+OBQWG5YmL0flJyNTZdeUORlZw1urCbIlhZHmA=:XtXtAUk3wUWjvJ336HD69uTSTgRzVwBpon1ACj03py8=",
}
]
"locals": [
{
"protocol": "socks",
"local_address": "127.0.0.1",
"local_port": 1080
},
{
"protocol": "http",
"local_address": "127.0.0.1",
"local_port": 3128
},
]
}
HEREDOC
useradd --system --home-dir /nonexistent --no-create-home --shell /usr/sbin/nologin shadowsocks
cat >${SERVICE} <<HEREDOC
[Unit]
Description=Shadowsocks-rust Client
Documentation=https://github.com/shadowsocks/shadowsocks-rust
Documentation=https://shadowsocks.org/doc/configs.html
After=network-online.target
[Service]
Type=simple
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
User=shadowsocks
Group=shadowsocks
LimitNOFILE=51200
ExecStart=/usr/bin/ssservice local -c ${CONF}
[Install]
WantedBy=multi-user.target
HEREDOC
systemctl daemon-reload
systemctl enable --now $(basename ${SERVICE})
systemctl status $(basename ${SERVICE})
unset URL
unset CONF
unset SERVICEНе забываем что параметры "server_port", "method", "password" в параметрах клиента должны совпадать с аналогичными параметрами в конфиге сервера.
Параметр "local_address": "127.0.0.1" в конфиге клиента задает адрес на котором служба прослушивает подключения. Если мы поднимаем сервер внутри локальной сети и хотим чтобы через него могли подключаться другие пользователи локальной сети по протоколам HTTP и SOCKS5, прослушиваемый адрес нужно заменить на 0.0.0.0
Пример конфигурации сервера соответствующего вышеприведённому конфигу клиента:
CONF="/etc/shadowsocks-rust/server.json"
SERVICE="/etc/systemd/system/shadowsocks-rust.service"
mkdir -p $(dirname ${CONF})
cat >${CONF} <<HEREDOC
{
"udp_timeout": 300,
"udp_max_associations": 512,
"mode": "tcp_and_udp",
"fast_open": true,
"timeout": 300,
"servers": [
{
"server": "0.0.0.0",
"server_port": 11443,
"method": "aes-256-gcm",
"password": "zZyWP+OBQWG5YmL0flJyNTZdeUORlZw1urCbIlhZHmA="
},
{
"server": "0.0.0.0",
"server_port": 12443,
"method": "2022-blake3-aes-256-gcm",
"password": "zZyWP+OBQWG5YmL0flJyNTZdeUORlZw1urCbIlhZHmA="
},
{
"disabled": true,
"server": "0.0.0.0",
"server_port": 13443,
"method": "2022-blake3-aes-256-gcm",
"password": "zZyWP+OBQWG5YmL0flJyNTZdeUORlZw1urCbIlhZHmA=",
"users": [
{
"name": "user1",
"password": "XtXtAUk3wUWjvJ336HD69uTSTgRzVwBpon1ACj03py8="
},
{
"name": "user2",
"password": "2tP/krYV6RNBqM0xwXKwYi0af1Rs6lk23wpBHWYYoNo="
}
]
}
]
}
HEREDOC
cat >${SERVICE} <<HEREDOC
[Unit]
Description=Shadowsocks-rust Server
Documentation=https://github.com/shadowsocks/shadowsocks-rust
Documentation=https://shadowsocks.org/doc/configs.html
After=network-online.target
[Service]
Type=simple
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
User=shadowsocks
Group=shadowsocks
LimitNOFILE=51200
ExecStart=/usr/bin/ssservice server -c ${CONF}
[Install]
WantedBy=multi-user.target
HEREDOC
systemctl daemon-reload
systemctl enable --now $(basename ${SERVICE})
systemctl status $(basename ${SERVICE})
unset URL
unset CONF
unset SERVICEВ браузере, где у нас установлена клиентская служба, прописываем адрес прокси 127.0.0.1 и порт HTTP прокси сервера 3128 или SOCKS5 прокси 1080. Если клиент подключается по сети вместо 127.0.0.1 указываем адрес сервера в локальной сети где установлена клиентская часть Shadowsocks-rust.
5. Установка клиента Shadowsocks-rust Windows
Скачиваем архив https://github.com/shadowsocks/shadowsocks-rust/releases/download/v1.19.2/shadowsocks-v1.19.2.x86_64-pc-windows-msvc.zip
Распаковываем и копируем файл sswinservice.exe в %WINDIR%\System32\
Открываем Блокнот или любой другой текстовый редактор под админом, вставляем из буфера конфиг:
{
"udp_timeout": 300,
"udp_max_associations": 512,
"mode": "tcp_and_udp",
"fast_open": true,
"timeout": 300,
"servers": [
{
"server": "shadowsocks.example.com",
"server_port": 11443,
"method": "aes-256-gcm",
"password": "zZyWP+OBQWG5YmL0flJyNTZdeUORlZw1urCbIlhZHmA="
},
{
"server": "shadowsocks.example.com",
"server_port": 12443,
"method": "2022-blake3-aes-256-gcm",
"password": "zZyWP+OBQWG5YmL0flJyNTZdeUORlZw1urCbIlhZHmA="
},
{
"disabled": true,
"server": "shadowsocks.example.com",
"server_port": 13443,
"method": "2022-blake3-aes-256-gcm",
"password": "zZyWP+OBQWG5YmL0flJyNTZdeUORlZw1urCbIlhZHmA=:XtXtAUk3wUWjvJ336HD69uTSTgRzVwBpon1ACj03py8=",
}
]
"locals": [
{
"protocol": "socks",
"local_address": "127.0.0.1",
"local_port": 1080
},
{
"protocol": "http",
"local_address": "127.0.0.1",
"local_port": 3128
},
]
}Сохраняем файл %WINDIR%\System32\ssclient.json
Устанавливаем и запускаем службу:
New-Service -Name 'ShadowsocksClient' -DisplayName 'Shadowsocks Client' -Description 'Shadowsocks-rust Client Service' -BinaryPathName '%WINDIR%\System32\sswinservice.exe local -c "ssclient.json"' Start-Service "ShadowsocksClient"
Проверяем что служба запустилась:
Get-Service "ShadowsocksClient" | fl *
Start-Service "ShadowsocksClient" Restart-Service "ShadowsocksClient" Stop-Service "ShadowsocksClient"
Remove-Service "ShadowsocksClient"