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
Два основных сценария:
- DDoS — смотри
ss -tn | grep 12000 | wc -l. Тысячи соединений — fail2ban и iptables rate-limit. - Зацикленный шаринг — два сервера шарят друг другу одну и ту же карту по кругу. В логах 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 или внешние мониторы.