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 — это сразу скажет на каком этапе обрыв.

Practical checklist for smooth viewing

Even the best CCCam or OSCam line needs two or three simple preparations. Update your receiver firmware, reset the ECM cache once a week and keep 15–20% free space on the USB stick or internal flash so that the reader can store keys without delays.

When tuning a dish, aim for MER/BER reserve: a two‑degree offset or a loose F‑connector often causes the “freezing” that users blame on cardsharing. Keep a short patch cord to test alternative routers, and save two profiles in OSCam — one for TCP, one for UDP — so you can switch instantly if your ISP starts filtering a protocol.

Utgard.tv monitors each hub 24/7, but you can speed up diagnostics by keeping a short log of your receiver actions. Note the time when you changed the channel, which CAID was active and whether you used Wi‑Fi or Ethernet. This tiny “journal” helps engineers reproduce your environment in the lab and return with a solution in minutes instead of hours.

  • Keep two line slots enabled: if the first server hits a maintenance window, the second one instantly takes over without re-entering credentials.
  • Run a monthly speed and latency test. Stable 1–2 Mbps with ping <80 ms is enough for SD/HD, but if jitter exceeds 20 ms, switch the router to wired mode.
  • Save the Utgard.tv status page and Telegram bot @utgard_tv_bot to bookmarks — they publish maintenance notices before SEMrush or uptime monitors raise alerts.