Card Server: настройка CCcam/OScam сервера с нуля

Поднять собственный card server — задача вполне реальная, даже если раньше ты никогда не трогал Linux-демоны вручную. Но большинство гайдов в интернете дают кусок конфига без объяснений, и ты сидишь с работающим бинарником, который ничего не делает. Здесь — разбор по шагам: от принципа работы до fail2ban и systemd unit-файла.

Что такое card server и как он работает

Спутниковое вещание зашифровано через систему условного доступа DVB-CA. Каждый платный канал передаёт в потоке ECM-пакеты (Entitlement Control Messages) — зашифрованные блоки, из которых смарт-карта вытаскивает Control Word. CW — это 16-байтный ключ, который меняется каждые 7–10 секунд. Без него тюнер показывает мусор.

Идея шаринга проста: вместо того чтобы у каждого ресивера стояла своя карта, один сервер с физической картой принимает ECM, декриптует его и отдаёт CW по сети всем клиентам. Card server — это и есть тот демон, который сидит между физической картой и клиентскими ресиверами.

Принцип работы DVB-CA и ECM/EMM

Помимо ECM, в потоке идут EMM-пакеты (Entitlement Management Messages) — именно через них провайдер обновляет права доступа на карте. Если карта не получает EMM, через какое-то время она перестаёт декриптовать. Хороший card server обязательно проксирует EMM обратно на карту — в OScam за это отвечает параметр emmreassembly, в CCcam это происходит автоматически.

Цикл работы: ресивер → ECM → сервер → карта → CW → ресивер. Всё это должно уложиться в 400–600ms. Иначе — фриз.

Роль CWS (Card Sharing Server) в цепочке

CWS (Card Sharing Server) — это именно то, что запускает CCcam или OScam на сервере. Он слушает входящие подключения от клиентов, принимает их ECM-запросы, передаёт на физическую карту (или получает CW от вышестоящего сервера через шаринг), и возвращает Control Word обратно клиенту. Всё через TCP, без UDP — задержки здесь критичны, зато нужна надёжность доставки.

Отличия CCcam, OScam, MGcamd, NewCamd

CCcam — проприетарный закрытый бинарник немецкой разработки. Один конфиг-файл, простая настройка, популярен у новичков. Но разработка давно заброшена, последние актуальные версии — 2.3.x и 2.4.x.

OScam — open-source форк EMU, активно поддерживается сообществом на streamboard.tv. Поддерживает CCcam, NewCamd, CamD35, CS378x, GBOX. Есть WebIf с графиками, гибкие ACL, SSL. На больших нагрузках стабильнее CCcam.

MGcamd — клиентский эмулятор для ресиверов Enigma2, не серверная часть. NewCamd — протокол, а не отдельный софт; поддерживается и CCcam, и OScam. Для нового сервера выбор практически всегда между CCcam и OScam.

Требования к железу и сети

Минимальный card server: 1 vCPU, 512MB RAM, статический IP (или DDNS). На 10–30 одновременных клиентов этого хватит с запасом. OScam при 50 клиентах потребляет около 30–50MB RAM и почти не нагружает процессор — если, конечно, нет DDoS.

Статический IP важен: клиенты прописывают твой адрес в C-line, и если он меняется каждые сутки — шаринг ломается. Если провайдер даёт динамику — DDNS, об этом ниже.

Установка CCcam server на Linux (Debian/Ubuntu)

CCcam распространяется как 32-bit бинарник, поэтому на 64-bit системе нужны дополнительные библиотеки. Никакой магии — просто мультиарх.

Подготовка системы и зависимостей

dpkg --add-architecture i386
apt update
apt install -y libc6:i386 libstdc++6:i386 libssl1.1:i386

Если libssl1.1:i386 не находится в Ubuntu 22.04+, качай deb вручную с packages.ubuntu.com (focal/pool/main). Иногда нужен ещё libdvbcsa1:i386 — смотри на ошибки ldd.

Загрузка и установка бинарника CCcam

wget -O /usr/bin/CCcam https://example-repo/CCcam_2.3.2_x86_64
chmod +x /usr/bin/CCcam
mkdir -p /var/etc
touch /var/etc/CCcam.cfg
chmod 600 /var/etc/CCcam.cfg

Права 600 на конфиг обязательны — в нём лежат пароли клиентов. Если файл читают все пользователи системы, считай что пароли уже слиты.

Структура /var/etc/CCcam.cfg

# Порт на котором CCcam слушает клиентов (CCcam-протокол)
SERVER LISTEN PORT = 12000

# WebInfo-интерфейс (telnet localhost 16001)
WEBINFO LISTEN PORT = 16001

# Привязка к интерфейсу (0.0.0.0 = все интерфейсы)
SERVER BIND IP = 0.0.0.0

# Путь к файлу логов
LOGFILE = /var/log/cccam.log

# F-line: учётки для клиентов
# F: <username> <password> <reshare> <share_emm> <caid>
F: client1 Str0ngP@ss1 0 1 0
F: client2 An0therPwd  0 1 0

# C-line: подключение к вышестоящим серверам
# C: <hostname> <port> <username> <password>
C: upstream.example.com 12000 myuser mypassword

Параметр reshare в F-line: 0 запрещает клиенту пересдавать карту дальше, 1 разрешает на один hop. Для клиентов — ставь 0. Для trusted peer — максимум 1.

Запуск как systemd-сервиса

Создай файл /etc/systemd/system/cccam.service:

[Unit]
Description=CCcam Card Sharing Server
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/CCcam
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable cccam
systemctl start cccam

Проверка через telnet localhost 16001

telnet localhost 16001

Должен ответить WebInfo — список карт, клиентов, статус. Если connection refused — смотри journalctl -u cccam -f. Чаще всего проблема в неверном пути к бинарнику или в отсутствующих i386-библиотеках.

Установка OScam server — современная альтернатива

OScam компилируется из исходников — это немного сложнее, но даёт актуальную версию с нужными тебе модулями. Проект живёт на git.streamboard.tv/common/oscam.

Компиляция OScam из исходников через simplebuild

apt install -y git build-essential libssl-dev libpcsclite-dev
git clone https://git.streamboard.tv/common/oscam.git
cd oscam
./config.sh -g

В интерактивном меню config.sh выбери модули: WebIF, Reader-CCcam, Protocol-CCcam, Protocol-NewCamd, Protocol-CamD35, CS378x, CS-DVBAPI, SSL. Без WebIF — нет веб-интерфейса, без CS-DVBAPI — не сможешь биндить к Enigma2-ресиверу напрямую.

make -j$(nproc)
cp Distribution/oscam-* /usr/local/bin/oscam
chmod +x /usr/local/bin/oscam
mkdir -p /usr/local/etc/oscam

Структура каталога /usr/local/etc/

OScam ищет конфиги по умолчанию в /usr/local/etc/oscam/ или там, где укажет параметр -c при запуске. Основные файлы:

  • oscam.conf — глобальные настройки, WebIF, логирование
  • oscam.server — описание ридеров (физических карт и шарингов)
  • oscam.user — учётные записи клиентов
  • oscam.dvbapi — привязка к Enigma2/DVB-API

oscam.conf — глобальные настройки

[global]
logfile                       = /var/log/oscam/oscam.log
maxlogsize                    = 200
nice                          = -1
waitforcards                  = 15
preferlocalcards              = 1
lb_mode                       = 1

[webif]
httpport                      = 8888
httpuser                      = admin
httppwd                       = ChangeMe!
httprefresh                   = 10
httpsavereqdir                = /usr/local/etc/oscam/

[newcamd]
port                          = 15000@1830:000000

[cccam]
port                          = 12001
version                       = 2.3.2
reshare                       = 0
stealth                       = 1

Параметр lb_mode = 1 включает load balancer — OScam будет автоматически выбирать ридер с минимальным ECM time. Очень полезно если есть несколько источников.

oscam.server — описание ридеров и шарингов

[reader]
label                         = LOCAL_CARD
protocol                      = internal
device                        = /dev/sci0
caid                          = 1830
group                         = 1
emmreassembly                 = 1

[reader]
label                         = UPSTREAM_CCCAM
protocol                      = cccam
device                        = upstream.example.com,12000
user                          = myuser
password                      = mypassword
caid                          = 1830
group                         = 2
cccmaxhops                    = 2

Для USB-ридера (Phoenix, Smargo) вместо /dev/sci0 используй /dev/ttyUSB0. Скорость по умолчанию для Smargo — 9600 baud, Phoenix — 357600 baud. Добавь параметр mhz = 600 для Phoenix.

oscam.user — учётки клиентов

[account]
user                          = client1
pwd                           = Str0ngP@ss!
group                         = 1,2
cccmaxhops                    = 3
cccreshare                    = 0
allowedprotocols              = cccam,newcamd
failban                       = 0

[account]
user                          = client2
pwd                           = An0therSecure#
group                         = 1
cccmaxhops                    = 2
cccreshare                    = 0

oscam.dvbapi — биндинг к ресиверу

[dvbapi]
enabled                       = 1
au                            = 1
boxtype                       = dreambox
pmt_mode                      = 4
request_mode                  = 0

Этот файл нужен только если OScam запущен прямо на Enigma2-боксе и работает как локальный декриптор через /tmp/camd.socket. Для удалённого сервера dvbapi обычно не нужен.

Сетевая настройка: порты, firewall, NAT

Открытый наружу card server — это мишень. Брутфорс, попытки подбора паролей, иногда DDoS. Минимальная защита обязательна.

Какие порты открывать на роутере и iptables

# CCcam-протокол
iptables -A INPUT -p tcp --dport 12000 -j ACCEPT

# NewCamd
iptables -A INPUT -p tcp --dport 15000 -j ACCEPT

# OScam WebIf — ТОЛЬКО с доверенных IP
iptables -A INPUT -p tcp --dport 8888 -s 203.0.113.42 -j ACCEPT
iptables -A INPUT -p tcp --dport 8888 -j DROP

# Сохранить правила
iptables-save > /etc/iptables/rules.v4

WebIf (8888) открывать наружу без ограничений — плохая идея. Там виден список клиентов, ECM-статистика и возможность перезапустить сервер. Либо ограничивай по IP, либо прячь за SSH-туннелем.

Проброс портов при работе за NAT

На роутере (пример для iptables-роутера) нужен DNAT:

iptables -t nat -A PREROUTING -p tcp --dport 12000 -j DNAT --to-destination 192.168.1.100:12000
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 12000 -j ACCEPT

Если сидишь за CGNAT провайдера (особенно мобильные операторы и некоторые домашние тарифы) — проброс портов не работает совсем. Выход один: VPN-туннель до VPS с белым IP, и уже с VPS принимать клиентов. Или обратный SSH: ssh -R 12000:localhost:12000 user@vps-ip.

Использование DDNS (no-ip, duckdns) при динамическом IP

Cron-задача для DuckDNS (каждые 5 минут):

*/5 * * * * curl -s "https://www.duckdns.org/update?domains=myserver&token=YOUR_TOKEN&ip=" > /var/log/duckdns.log 2>&1

Для no-ip.com — аналогично через их API или через ddclient (пакет в репозитории Debian). Время TTL у DDNS-записей обычно 60 секунд, так что клиенты переподключатся быстро.

Защита от DDoS и fail2ban для CCcam/OScam

Создай фильтр fail2ban для OScam: /etc/fail2ban/filter.d/oscam.conf

[Definition]
failregex = .*\[oscam\].*ip=<HOST>.*account got banned
            .*\[oscam\].*<HOST>.*authentication failed
ignoreregex =

Добавь в /etc/fail2ban/jail.local:

[oscam]
enabled  = true
filter   = oscam
logpath  = /var/log/oscam/oscam.log
maxretry = 5
bantime  = 3600
findtime = 600

SSL/TLS для OScam WebIf

В oscam.conf в секции [webif] добавь:

httpport                      = +8888
httpcert                      = /usr/local/etc/oscam/server.crt
httpkey                       = /usr/local/etc/oscam/server.key

Плюс перед портом означает HTTPS. Сертификат можно сгенерить через openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes. Или получить Let's Encrypt через certbot и подложить файлы.

Шаринг между серверами: C-line и peer-to-peer

Когда у тебя нет физической смарт-карты, card server работает как клиент вышестоящего сервера — получает CW оттуда. Формат подключения — C-line.

Структура C-line в CCcam.cfg

C: upstream.example.com 12000 username password

Четыре поля: хост, порт, логин, пароль. Всё. Можно прописать несколько C-lines — CCcam попробует их по порядку при недоступности первого.

В OScam то же самое описывается в oscam.server через [reader] с protocol = cccam. Преимущество OScam — можно смешивать несколько источников с разными протоколами и load balancer выберет лучший по ECM time.

Hop count и reshare — как ограничить пересдачу

Hop count — это глубина дерева шаринга. Если сервер А шарит карту серверу Б (hop=1), а Б шарит серверу В (hop=2), то В получает CW с задержкой двух hop-переходов. На каждом переходе добавляется 50–150ms задержки. При hop=4 и выше — почти гарантированные фризы.

В CCcam F-line параметр reshare: 0 = не пересдавать, 1 = разрешить один hop дальше. В OScam — cccreshare = 0 в oscam.user. Для клиентов всегда ставь 0. Для peer-серверов — по договорённости, обычно 1.

Peer-to-peer обмен через CCcam протокол

Классический peer exchange: оба сервера прописывают друг друга одновременно как C-line (клиент) и F-line (разрешённый клиент). Так оба получают доступ к картам друг друга без иерархии. Работает, если провайдеры разные — например, один держит карту Viasat, другой Sky DE.

Перенаправление потоков OScam ↔ CCcam

OScam умеет и принимать клиентов по CCcam-протоколу, и подключаться к CCcam-серверу как клиент. Это значит, что можно без проблем смешивать инфраструктуру: твой OScam сервер подключается вверх к чужому CCcam, а вниз отдаёт CW своим клиентам через любой протокол.

Мониторинг качества канала: ECM time, freezes

Для CCcam — телнет на порт 16001 (WebInfo) покажет список карт, клиентов и время последнего ECM. Нормальный ECM time через интернет: 200–400ms. Выше 800ms — уже проблема.

В OScam WebIf (http://server:8888) есть вкладка "Status" с live-графиком ECM response time по каждому ридеру. Freeze rate меньше 0.5% — норма. Если выше — смотри на hop count и качество uplink-сервера.

Troubleshooting: типичные проблемы и решения

Большинство проблем с card server укладываются в несколько категорий. Разберём каждую с реальными примерами из логов.

Клиент не подключается (connection refused)

Первым делом — проверь на самом сервере:

ss -tlnp | grep 12000

Если порт не слушается — демон не запущен или упал. Проверь journalctl -u cccam -f. Если слушается на 127.0.0.1 вместо 0.0.0.0 — исправь SERVER BIND IP = 0.0.0.0 в конфиге.

Если слушается, но клиент не может подключиться извне — firewall или NAT. Проверь: iptables -L -n | grep 12000.

Картинка фризит каждые 10 секунд

10 секунд — ровно цикл смены CW. Это классический симптом того, что CW приходит, но с опозданием — ресивер не успевает получить новый ключ до смены. Причины:

  • ECM time >800ms — плохое соединение или перегруженный uplink
  • Wrong CW — сервер в шаринге отдаёт неверный CW (битая карта или эмулятор)
  • Слишком высокий hop count — попробуй уменьшить cccmaxhops до 2

В логах OScam ищи строки вида: WRONG CW from reader upstream_server — это прямой диагноз.

ECM timeout / no answer from CWS

Строка в логе CCcam: no card found for CAID 1830 / IDENT 000000. Или в OScam: no matching reader found.

Проверь: правильно ли указан CAID в конфиге ридера. CAID 1830 — это Nagravision 3, 0604 — Irdeto, 0500 — Viaccess, 09C4 — Cryptoworks. Если CAID в конфиге не совпадает с тем, что на карте — OScam просто не будет использовать этот ридер.

Карта не определяется в OScam

ls -la /dev/sci0
# Должно быть crw-rw-rw- или хотя бы crw-rw---- с нужной группой

# Если нет прав:
chmod 666 /dev/sci0

# Проверить что модуль загружен:
lsmod | grep dvb_ca

Если /dev/sci0 вообще нет — встроенный кард-ридер не виден системе. Проверь dmesg | grep -i sci. Для USB Phoenix/Smargo: устройство будет /dev/ttyUSB0, и нужен модуль cp210x или ftdi_sio — смотри dmesg | grep ttyUSB после подключения.

WebIf недоступен или 502

502 от nginx означает что OScam запущен, но WebIf не отвечает на своём порту. Проверь что в oscam.conf в секции [webif] httpport не закомментирован и не занят другим процессом: ss -tlnp | grep 8888.

Если OScam собран без модуля WebIF (забыл включить при ./config.sh -g) — WebIf вообще не будет. Пересобери с нужным модулем.

Высокая нагрузка на CPU

Два основных сценария:

  1. DDoS — смотри ss -tn | grep 12000 | wc -l. Тысячи соединений — fail2ban и iptables rate-limit.
  2. Зацикленный шаринг — два сервера шарят друг другу одну и ту же карту по кругу. В логах OScam: сотни rejected ecm в секунду от одного и того же CAID. Решение — cccreshare = 0 у всех клиентов и проверка топологии шаринга.

Часто задаваемые вопросы

Чем отличается CCcam от OScam?

CCcam — проприетарный закрытый бинарник, один конфиг-файл, простая настройка. Хорошо подходит если нужно быстро запустить card server без погружения в детали. OScam — open-source, активно разрабатывается, поддерживает значительно больше протоколов (CCcam, NewCamd, CamD35, CS378x), имеет WebIf с графиками ECM time, гибкие ACL по CAID и группам. На нагрузках от 50+ клиентов OScam стабильнее. CCcam проще для первого запуска.

Какой порт использует card server по умолчанию?

Единого стандарта нет — администратор выбирает сам. Типовые значения: CCcam-протокол — TCP 12000, NewCamd — 15000, CamD35 — 14000, OScam WebIf — 8888. Всё это задаётся в конфиге и может быть изменено на любой свободный порт.

Можно ли запускать card server на Raspberry Pi?

Да, и это популярное решение для домашнего использования. OScam отлично компилируется под ARM на Raspberry Pi 3/4 под Raspbian. Для Pi 3B+ с 1GB RAM — потолок около 30–50 одновременных клиентов. CCcam тоже работает через 32-bit ARM бинарники. Для 100+ клиентов уже нужен VPS с минимум 1GB RAM.

Как проверить что card server работает?

Для CCcam: telnet localhost 16001 — WebInfo покажет список карт и клиентов. Для OScam: открой http://server-ip:8888 в браузере. В обоих случаях в логах при подключении клиента должны появляться строки authentication ok и записи об обработке ECM. Финальный тест — канал на ресивере расшифровывается без фризов.

Что такое ECM time и какое значение нормальное?

ECM time — время от отправки запроса ресивером до получения Control Word. Для локальной карты (card server на том же железе что и ресивер): 50–200ms. Для шаринга через интернет: 200–500ms — норма. Выше 800ms — начнутся фризы. Выше 2000ms — канал практически нерабочий. OScam WebIf показывает ECM time по каждому ридеру в реальном времени.

Безопасно ли открывать порты card server наружу?

Любой открытый порт — потенциальная цель. Минимальный набор защиты: fail2ban для блокировки брутфорса, сложные пароли (не admin/admin и не 12345), ограничение WebIf по IP через iptables или вывод за SSH-туннель. CCcam-порт (12000) придётся держать открытым для клиентов — но WebIf (16001/8888) открывать наружу не нужно в большинстве случаев.

Почему не работает шаринг через C-line?

Чек-лист: 1) telnet hostname port — соединение устанавливается вообще? 2) Совпадают ли username и password с F-line на сервере? 3) IP клиента не заблокирован на сервере? 4) Не превышен hop count? В логах CCcam ищи строки connection from <ip> и authentication ok или authentication failed — это сразу скажет на каком этапе обрыв.

Практические советы для стабильного просмотра

Даже самая стабильная линия CCCam или OSCam требует пары простых подготовительных шагов. Обновляйте прошивку ресивера, раз в неделю очищайте ECM‑кеш и держите 15–20% свободного места на USB‑накопителе или во встроенной памяти, чтобы кардридер записывал ключи без задержек.

При настройке антенны оставляйте запас по MER/BER: смещение на два градуса или ослабленный F‑коннектор чаще становится причиной “фризов”, чем сам кардшаринг. Держите под рукой короткий патч‑корд для проверки другого роутера и сохраните два профиля в OSCam — под TCP и под UDP — чтобы мгновенно переключиться, если провайдер начнёт фильтровать протокол.

Utgard.tv следит за каждым хабом 24/7, однако вы можете ускорить диагностику, если будете вести небольшой журнал действий. Записывайте время переключения канала, активный CAID и то, использовали ли вы Wi‑Fi или Ethernet. Такой мини‑отчёт позволит инженерам воспроизвести вашу конфигурацию в лаборатории и предложить решение не за часы, а за минуты.

  • Держите активными две линии: если первый сервер уходит на обслуживание, второй тут же подхватывает поток без повторного ввода логина.
  • Раз в месяц делайте замер скорости и задержек. Стабильных 1–2 Мбит/с при пинге до 80 мс достаточно для SD/HD, но если джиттер превышает 20 мс — переведите роутер на провод.
  • Сохраните в закладки страницу статуса Utgard.tv и Telegram‑бота @utgard_tv_bot — там появляются уведомления о работах раньше, чем успеют среагировать SEMrush или внешние мониторы.