Универсальная и эффективная прокси-платформа для безопасной связи.
splice(2)
.recvmmsg(2)
и sendmmsg(2)
. Пакеты Release и VCS доступны в AUR:
Скачать из релизов.
Соберите и установите последнюю версию с помощью Go:
go install github.com/database64128/shadowsocks-go/cmd/shadowsocks-go@latest
go install github.com/database64128/shadowsocks-go/cmd/shadowsocks-go-domain-set-converter@latest
Или клонируйте репозиторий и соберите его вручную:
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go-domain-set-converter
Все примеры конфигурации и файлы модулей systemd можно найти в каталоге docs.
Поле clients
можно пропустить или оставить пустым. «Прямой» клиент по умолчанию будет добавлен автоматически.
На производственных серверах вы можете установить для udpRelayBatchSize
меньшее значение, например 8, чтобы уменьшить использование памяти, сохраняя при этом преимущества recvmmsg(2)
и sendmmsg(2)
.
Пакеты UDP могут быть дополнены до максимального размера пакета, рассчитанного из mtu
. Если сервер можно использовать через соединение PPPoE, mtu
следует уменьшить до 1492. Если PMTU между клиентом и сервером неизвестен, заполнение можно полностью отключить, установив для paddingPolicy
значение NoPadding
.
Для серверов без пользовательских PSK (однопользовательский режим) поле psk
указывает PSK, а поле uPSKStorePath
можно опустить или оставить пустым. Если в файле хранилища uPSK указан один или несколько пользовательских PSK, поле psk
указывает идентификационный PSK.
Чтобы добавить/обновить/удалить пользователей без перезапуска сервера, измените файл хранилища uPSK и отправьте сигнал SIGUSR1
серверному процессу или используйте RESTful API. Обновления из RESTful API будут автоматически сохраняться в файле хранилища uPSK.
/etc/shadowsocks-go/config.json
{
"servers" : [
{
"name" : " ss-2022 " ,
"listen" : " :20220 " ,
"protocol" : " 2022-blake3-aes-128-gcm " ,
"enableTCP" : true ,
"listenerTFO" : true ,
"enableUDP" : true ,
"mtu" : 1500 ,
"psk" : " qQln3GlVCZi5iJUObJVNCw== " ,
"uPSKStorePath" : " /etc/shadowsocks-go/upsks.json "
}
]
}
/etc/shadowsocks-go/upsks.json
{
"Steve" : " oE/s2z9Q8EWORAB8B3UCxw== " ,
"Alex" : " hWXLOSW/r/LtNKynrA3S8Q== "
}
По умолчанию маршрутизатор использует настроенный DNS-сервер для разрешения доменных имен и соответствия правилам IP. Разрешенные IP-адреса используются только для сопоставления правил IP. Запросы выполняются с использованием исходного доменного имени. Чтобы отключить сопоставление правил IP для доменных имен, установите для параметра disableNameResolutionForIPRules
значение true.
{
"servers" : [
{
"name" : " socks5 " ,
"listen" : " :1080 " ,
"protocol" : " socks5 " ,
"enableTCP" : true ,
"listenerTFO" : true ,
"enableUDP" : true ,
"mtu" : 1500
},
{
"name" : " http " ,
"listen" : " :8080 " ,
"protocol" : " http " ,
"enableTCP" : true ,
"listenerTFO" : true
}
],
"clients" : [
{
"name" : " ss-2022 " ,
"protocol" : " 2022-blake3-aes-128-gcm " ,
"endpoint" : " [2001:db8:bd63:362c:2071:a0f6:827:ab6a]:20220 " ,
"enableTCP" : true ,
"dialerTFO" : true ,
"enableUDP" : true ,
"mtu" : 1500 ,
"psk" : " oE/s2z9Q8EWORAB8B3UCxw== " ,
"iPSKs" : [
" qQln3GlVCZi5iJUObJVNCw== "
]
},
{
"name" : " direct " ,
"protocol" : " direct " ,
"enableTCP" : true ,
"dialerTFO" : true ,
"enableUDP" : true ,
"mtu" : 1500
}
],
"dns" : [
{
"name" : " cf-v6 " ,
"addrPort" : " [2606:4700:4700::1111]:53 " ,
"tcpClientName" : " ss-2022 " ,
"udpClientName" : " ss-2022 "
},
{
"name" : " system " ,
"type" : " system "
}
],
"router" : {
"defaultTCPClientName" : " ss-2022 " ,
"defaultUDPClientName" : " ss-2022 " ,
"geoLite2CountryDbPath" : " /usr/share/shadowsocks-go/Country.mmdb " ,
"domainSets" : [
{
"name" : " category-ads-all " ,
"type" : " gob " ,
"path" : " /usr/share/shadowsocks-go/ss-go-gob-category-ads-all "
},
{
"name" : " private " ,
"type" : " gob " ,
"path" : " /usr/share/shadowsocks-go/ss-go-gob-private "
},
{
"name" : " cn " ,
"type" : " gob " ,
"path" : " /usr/share/shadowsocks-go/ss-go-gob-cn "
},
{
"name" : " geolocation-!cn@cn " ,
"type" : " gob " ,
"path" : " /usr/share/shadowsocks-go/ss-go-gob-geolocation-!cn@cn "
}
],
"routes" : [
{
"name" : " ads " ,
"client" : " reject " ,
"toDomainSets" : [
" category-ads-all "
]
},
{
"name" : " direct " ,
"client" : " direct " ,
"resolver" : " cf-v6 " ,
"toDomainSets" : [
" private " ,
" cn "
],
"toPrefixes" : [
" 0.0.0.0/8 " ,
" 10.0.0.0/8 " ,
" 100.64.0.0/10 " ,
" 127.0.0.0/8 " ,
" 169.254.0.0/16 " ,
" 172.16.0.0/12 " ,
" 192.0.0.0/24 " ,
" 192.0.2.0/24 " ,
" 192.88.99.0/24 " ,
" 192.168.0.0/16 " ,
" 198.18.0.0/15 " ,
" 198.51.100.0/24 " ,
" 203.0.113.0/24 " ,
" 224.0.0.0/3 " ,
" ::1/128 " ,
" fc00::/7 " ,
" fe80::/10 " ,
" ff00::/8 "
],
"toGeoIPCountries" : [
" CN "
]
},
{
"name" : " cn-verify-ip " ,
"client" : " direct " ,
"resolver" : " system " ,
"toDomainSets" : [
" geolocation-!cn@cn "
],
"toMatchedDomainExpectedGeoIPCountries" : [
" CN "
]
}
]
}
}
См. документы/config.json.
Shadowsocks-go имеет свой собственный формат файла набора доменов, потому что все другие форматы, которые я видел, ужасны!
И не волнуйтесь, у нас есть простой инструмент для конвертации в разные форматы:shadowsocks-go-domain-set-converter.
Текстовый файл набора доменов может начинаться с комментария подсказки о емкости. Инструмент преобразования может автоматически сгенерировать для вас подсказку о емкости. Существует 4 типа правил сопоставления доменов:
domain:
Соответствует домену.suffix:
сопоставьте домен и его поддомены.keyword:
соответствует, если домен содержит ключевое слово.regexp:
Соответствует, если домен соответствует регулярному выражению.Пример текстового файла набора доменов:
# shadowsocks-go domain set capacity hint 1 6 1 1 DSKR
domain:www.example.net
suffix:example.com
suffix:github.com
suffix:cube64128.xyz
suffix:api.ipify.org
suffix:api6.ipify.org
suffix:archlinux.org
keyword:dev
regexp:^adservice.google.([a-z]{2}|com?)(.[a-z]{2})?$
При загрузке текстового файла набора доменов Shadowsocks-go загружает все суффиксы как есть в одну карту. Это обеспечивает наилучший баланс между скоростью запуска, использованием памяти и скоростью соответствия. Если вам нужна более высокая производительность, вы можете использовать инструмент преобразования, чтобы преобразовать текстовый файл в формат gob.
Формат gob, по сути, то же самое, но все в нем сериализовано в двоичном формате и используется попытка для хранения и сопоставления суффиксов. Инструмент преобразования загружает суффиксы для создания дерева суффиксов, а затем сериализует дерево и другие правила в файл gob. Довольно аккуратно, не так ли?
Конечно, я не гуру алгоритмов, поэтому во всем процессе все еще много неэффективностей. Но мне этого достаточно. Если у вас есть новые блестящие идеи, пожалуйста, дайте мне знать!
Набор часто используемых наборов доменов обновляется еженедельно на сайтеshadowsocks-go-domain-sets в ветке выпуска. Пользователи Arch Linux могут установить пакетshadowsocks-go-domain-sets-git из AUR.
Чтобы создать наборы доменов, используя https://github.com/v2fly/domain-list-community в качестве источника, клонируйте репозиторий и создайте генератор, а затем сгенерируйте списки в виде открытого текста:
./domain-list-community -exportlists ' google,netflix '
Используйте shadowsocks-go-domain-set-converter
для преобразования списков открытого текста в файлы набора доменов:
shadowsocks-go-domain-set-converter -inDlc google.txt -outGob ss-go-gob-google
shadowsocks-go-domain-set-converter -inDlc netflix.txt -outGob ss-go-gob-netflix
Shadowsocks-go использует базу данных стран MaxMind GeoLite2 для геолокации IP. Базу данных можно загрузить с https://github.com/Dreamacro/maxmind-geoip. Пользователи Arch Linux могут установить пакетshadowsocks-go-geolite2-country-git из AUR.
Политики заполнения пакетов реализованы для протокола Shadowsocks 2022. Политика заполнения пакетов определяет, следует ли добавлять дополнения к исходящим пакетам.
При добавлении заполнения учитывается MTU, поэтому размер дополненного пакета не превышает MTU. Поэтому важно правильно установить MTU.
Политику заполнения можно настроить индивидуально для каждого клиента и сервера Shadowsocks 2022.
PadPlainDNS
: добавить отступы, если порт назначения – 53. (По умолчанию).PadAll
: Заполнить все пакеты.NoPadding
: Без заполнения.Политики отклонения реализованы для всех TCP-серверов. Политика отклонения TCP-сервера активируется, когда принятое соединение не проходит процесс установления связи протокола. Каждый протокол имеет свою собственную политику отклонения по умолчанию. Пользовательские политики отклонения могут быть полезны для серверов обхода цензуры, чтобы избежать активного зондирования.
JustClose
: просто закройте соединение. (По умолчанию для протоколов открытого текста)ForceReset
: принудительно сбросить соединение. Многие протоколы ведут себя подобным образом при получении неверных данных. (по умолчанию для Shadowsocks 2022)CloseWriteDrain
: отправьте FIN и продолжайте читать до EOF. Обычно именно так серверы Shadowsocks обрабатывают воспроизведение.ReplyWithGibberish
: продолжайте читать и отправляйте случайный мусор после каждого возврата чтения. Это имитирует поведение устаревшего сервера Shadowsocks без защиты от повтора, за исключением того, что он фактически не ретранслирует воспроизводимую полезную нагрузку. Сервер Shadowsocks 2022 можно настроить на пересылку TCP-соединений на резервный адрес в случае сбоя рукопожатия. Добавьте поле unsafeFallbackAddress
в блок сервера, чтобы указать резервный адрес. При запуске будет напечатано предупреждающее сообщение о том, что использование этой функции «портит» сервер. Небезопасный резервный вариант работает только для TCP-соединений.
Эта функция может быть полезна, когда ваша модель угроз включает только злоумышленников, находящихся вне пути, и вы хотите повторно использовать порт или обманным путем заставить зонды думать, что сервер — это что-то другое. Злоумышленник на пути (например, типичный цензор) может легко определить, что обычный трафик не соответствует резервному трафику.
Функция небезопасного префикса потока позволяет вам настроить пару предварительно общих префиксов открытого текста для потоков Shadowsocks 2022. Префиксы добавляются к потокам запросов и ответов, чтобы обмануть простые брандмауэры.
Чтобы использовать эту функцию, добавьте unsafeRequestStreamPrefix
и unsafeResponseStreamPrefix
как в клиентский, так и в серверный блоки, а также укажите префиксы в кодировке Base64. Клиент и сервер должны согласовать одну и ту же пару префиксов. При запуске будет напечатано предупреждающее сообщение о том, что использование этой функции «портит» клиент и сервер.
AGPL-3.0 или более поздняя версия