MAATRIX / Блог / Shadowsocks на FreeBSD: пошаговая установка

Shadowsocks на FreeBSD: пошаговая установка

MAATRIX

Почти все мануалы по Shadowsocks написаны под Ubuntu или Debian: apt install, systemctl enable, ufw allow. На FreeBSD ни одна из этих команд не сработает, а слепой перенос инструкции с Linux оставляет либо неработающий сервис, либо открытый порт без фаервола. Ниже — установка Shadowsocks на FreeBSD с нуля: через pkg и через ports, конфиг shadowsocks-libev, автозапуск через rc.d и правила pf — без адаптации чужих команд на ходу.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Чем FreeBSD отличается от Linux в этой задаче

Три вещи меняются полностью, и о них стоит знать заранее, прежде чем copy-paste даст ошибку.

Пакетный менеджер — не apt/dnf, а pkg, бинарный менеджер пакетов поверх системы портов. Пути тоже другие: сторонний софт в FreeBSD традиционно ставится в /usr/local, а не в /etc и /usr/bin, как в большинстве Linux-дистрибутивов. Конфиг shadowsocks-libev окажется в /usr/local/etc/shadowsocks-libev/, а не в /etc/shadowsocks-libev/.

Init-система — не systemd, а классическая BSD-схема rc.d + /etc/rc.conf. Сервисы не «юниты», а shell-скрипты в /usr/local/etc/rc.d/, включаются одной строкой в rc.conf, и это принципиально проще устроено, чем systemd, — меньше уровней абстракции, но и меньше готовых возможностей вроде декларативных таймеров и cgroup-лимитов из коробки.

Фаервол — штатно pf (портированный из OpenBSD) либо ipfw, но не iptables/nftables и не ufw. Синтаксис правил pf ближе к декларативному описанию политики, чем к последовательности команд ufw, и конфиг живёт в одном файле /etc/pf.conf.

Держите это в голове — и дальше всё укладывается в логичную последовательность: поставить пакет, поправить конфиг, включить в rc.conf, открыть порт в pf.conf.

pkg или ports: что выбрать

В FreeBSD один и тот же софт можно поставить двумя путями, и для Shadowsocks оба рабочие.

pkgports
Что этоготовые бинарные пакетысборка из исходников с настройкой опций
Скоростьсекундыминуты (компиляция)
Гибкостьверсия и опции сборки заданы заранееможно включить/выключить конкретные фичи (например, поддержку конкретного плагина обфускации)
Когда уместнов 95% случаев, включая прод-сервер под Shadowsocksнужна нестандартная сборка, патч или версия свежее той, что в pkg

Для обычной задачи — поднять Shadowsocks-сервер на VPS — pkg быстрее и ничем не хуже: пакет собирается той же командой мейнтейнерами портов, просто заранее и с разумными опциями по умолчанию. Ports имеет смысл, если вам нужен конкретный набор флагов сборки или версия, которая ещё не докатилась до бинарного репозитория. Дальше разберём оба пути, но как основной используйте pkg.

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка через pkg

Если система свежая, сначала инициализируйте pkg и обновите каталог пакетов:

pkg update
pkg upgrade -y

При первом запуске pkg система спросит про установку самого pkg — соглашайтесь (y). Дальше ставим shadowsocks-libev одной командой:

pkg install -y shadowsocks-libev

Пакет подтянет зависимости (libev, mbedtls или openssl — в зависимости от сборки) и положит:

  • бинарники — ss-server, ss-local, ss-manager в /usr/local/sbin и /usr/local/bin;
  • пример конфига — /usr/local/etc/shadowsocks-libev/config.json.sample;
  • скрипт службы — /usr/local/etc/rc.d/shadowsocks_libev (имя скрипта может отличаться на одну-две буквы в зависимости от версии порта — проверить точно можно командой pkg info -l shadowsocks-libev | grep rc.d, чтобы не гадать при настройке автозапуска).

Скопируйте пример в рабочий конфиг:

cp /usr/local/etc/shadowsocks-libev/config.json.sample /usr/local/etc/shadowsocks-libev/config.json

Установка из ports (когда нужен контроль)

Если решили собирать из исходников — например, чтобы включить конкретный шифровальный бэкенд или получить более свежую версию, — сначала нужно дерево портов. В современных версиях FreeBSD рекомендованный способ — git, а не устаревающий portsnap:

pkg install -y git
git clone --depth 1 https://git.FreeBSD.org/ports.git /usr/ports

Дальше — сборка порта с интерактивным выбором опций:

cd /usr/ports/net/shadowsocks-libev
make config
make install clean

Экран make config даёт выбрать бэкенд шифрования и дополнительные модули — если не уверены, оставьте значения по умолчанию, они разумны для сервера. Сборка займёт несколько минут в зависимости от мощности VPS, зависимости (libev, mbedtls) подтянутся автоматически через порт-систему. После make install clean бинарники и rc.d-скрипт окажутся ровно там же, где и при установке через pkg, — дальше оба пути сходятся в одну точку настройки.

Конфиг и шифрование

Откройте /usr/local/etc/shadowsocks-libev/config.json (в FreeBSD по умолчанию нет nano — используйте vi, либо поставьте привычный редактор через pkg install -y nano) и приведите к рабочему виду:

{
  "server":"0.0.0.0",
  "server_port":8388,
  "password":"ВашСтойкийПароль",
  "method":"chacha20-ietf-poly1305",
  "mode":"tcp_and_udp",
  "timeout":300
}

Логика та же, что и на Linux-версии shadowsocks-libev, — это один и тот же проект, просто собранный под другую ОС. server_port — порт для подключений, выберите нестандартный высокий, если хотите меньше внимания от сканеров. password — фактически ключ шифрования, делайте его длинным и случайным, никогда не оставляйте пример из шаблона. method — актуальны chacha20-ietf-poly1305 и aes-256-gcm, устаревшие потоковые шифры (rc4, table) сегодня не используйте — они легко распознаются и не дают реальной защиты. mode: tcp_and_udp нужен, если через прокси должны ходить и UDP-сервисы.

Если сервер маломощный (типичный бюджетный VPS с 1 ядром), это не проблема: FreeBSD-сборка shadowsocks-libev так же экономична по ресурсам, как и Linux-версия, — основная нагрузка это шифрование потока, а не сама ОС.

rc.d и rc.conf вместо systemd

Здесь главное отличие от привычного systemctl enable --now. В FreeBSD автозапуск включается не командой к самому сервису, а строкой в /etc/rc.conf:

sysrc shadowsocks_libev_enable="YES"

Команда sysrc — штатный способ безопасно править rc.conf, не открывая файл руками (хотя можно и вручную дописать строку shadowsocks_libev_enable="YES" через редактор — результат идентичен). После этого сервисом управляют командой service, а не systemctl:

service shadowsocks_libev start
service shadowsocks_libev status

Если имя переменной не совпало с именем, которое ожидает sysrc (зависит от точной версии rc.d-скрипта из порта), посмотрите список доступных rc-переменных прямо в скрипте:

grep rcvar /usr/local/etc/rc.d/shadowsocks_libev

Это покажет точное имя переменной для rc.conf — надёжнее, чем ориентироваться на мануал, написанный под другую версию порта. Логи сервиса, в отличие от journalctl в systemd-мире, по умолчанию идут через стандартный syslog — смотрите /var/log/messages, либо явно перенаправьте вывод службы в отдельный файл через опции rc.d-скрипта, если нужна изоляция логов.

Фаервол pf и проверка подключения

FreeBSD не включает фаервол автоматически — это отличается от Ubuntu, где ufw часто уже стоит в системе. Включите pf через тот же sysrc:

sysrc pf_enable="YES"
sysrc pf_rules="/etc/pf.conf"

Минимальный /etc/pf.conf, который пропускает SSH и порт Shadowsocks, а остальное блокирует по умолчанию:

ext_if = "vtnet0"

set skip on lo
block in on $ext_if all
pass out on $ext_if all keep state

pass in on $ext_if proto tcp to port 22 keep state
pass in on $ext_if proto { tcp, udp } to port 8388 keep state

Имя внешнего интерфейса (vtnet0, em0, vio0 — зависит от гипервизора провайдера) уточните командой ifconfig -a до правки конфига, иначе правила применятся не к тому интерфейсу и сервер останется недоступен. Примените правила и включите pf:

service pf start
pfctl -f /etc/pf.conf

Проверьте, что порт реально слушается:

sockstat -4 -l | grep 8388

Если провайдер вдобавок даёт отдельный облачный фаервол (security groups) поверх системного — правило нужно продублировать и там, иначе подключение не пройдёт, даже если pf настроен верно. Это тот же принцип, что и с ufw на Linux: локальные правила не отменяют внешние.

Дальше — обычный клиент Shadowsocks на устройстве (Windows, macOS, Android, iOS, Linux), в который вводятся IP сервера, порт, пароль и метод шифрования из конфига. Если позже понадобится сравнить Shadowsocks с альтернативами или разобрать типовые сбои — эти темы уже разобраны отдельно: чем Shadowsocks отличается от Outline, Shadowsocks или VLESS для сервера и частые ошибки Shadowsocks на сервере — там разбор актуален независимо от ОС, поскольку касается протокола, а не конкретной системы.

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Можно ли использовать конфиг с Linux-сервера один в один?

Да, содержимое config.json идентично — это тот же shadowsocks-libev. Меняются только пути (/usr/local/etc/... вместо /etc/...) и способ запуска сервиса.

Почему service shadowsocks_libev start пишет, что сервис не найден?

Скорее всего пакет не поставился или переменная в rc.conf называется иначе. Проверьте pkg info shadowsocks-libev и точное имя rcvar через grep rcvar /usr/local/etc/rc.d/shadowsocks_libev.

pf и ipfw — надо выбирать одно?

Да, оба фаервола лучше не включать одновременно на одном сервере — это усложняет отладку правил. Для новой установки pf — более распространённый и документированный вариант в современной FreeBSD.

Ставить через pkg или собирать из ports — есть разница в безопасности?

Нет, пакеты pkg собираются из тех же портов на официальной инфраструктуре FreeBSD. Ports имеет смысл только ради контроля над опциями сборки или более свежей версии, а не ради безопасности.

Нужна ли перекомпиляция ядра или что-то специфичное для FreeBSD, кроме pf?

Нет, штатного ядра GENERIC достаточно — Shadowsocks не требует модулей ядра, в отличие, например, от некоторых VPN-решений с собственными сетевыми драйверами.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →