Прокси для OScam: настройка reader-прокси 2026
Прокси для OScam — тема, где каждый второй форумный пост говорит о разном, и это главная причина путаницы. Одни имеют в виду SOCKS5-туннель для трафика, другие — промежуточный сервер в цепочке кардшаринга. Это принципиально разные вещи, и если не понимать разницу, конфиг будет нерабочим независимо от того, сколько часов в него вложено.
Здесь разбираю оба случая: и настройку proxy-reader в oscam.server, и заворачивание трафика через внешний туннель на уровне ОС. С реальными конфигами, командами и расшифровкой логов.
Что такое прокси в контексте OScam и зачем он нужен
OScam может быть одновременно сервером для клиентов и клиентом для вышестоящего источника. Это и есть прокси-режим: принять запрос ECM снизу, передать вверх, вернуть CW обратно. Никакой физической карты в этой схеме нет.
Прокси для OScam в большинстве случаев — это именно такой relay-сервер, который настраивается через секцию [reader] в oscam.server. Не SOCKS5, не HTTP-прокси — а reader с network-протоколом.
Разница между прокси-reader и обычным cardreader
Обычный cardreader в OScam смотрит на физическое устройство: device = /dev/ttyUSB0 или PCSC. У него есть реальная смарт-карта, он сам декодирует ECM.
Proxy-reader смотрит на хост и порт вышестоящего сервера: device = upstream.example.com,12000. Карты у него нет — он ретранслирует запросы дальше по цепочке. Protocol здесь будет cccam, newcamd или camd35 — зависит от того, что отдаёт вышестоящий сервер.
Сценарии применения: реле, цепочки, скрытие IP, агрегация источников
Реле нужно, когда вышестоящий сервер не принимает подключения с вашего IP напрямую, а промежуточная точка — принимает. Или когда надо собрать несколько источников в один сервер и раздавать клиентам из одной точки.
Агрегация источников — тоже распространённый случай: несколько [reader] с разными серверами, все в одной группе, OScam сам балансирует между ними по скорости ответа.
Чем OScam-прокси отличается от системного SOCKS/HTTP-прокси
Встроенной поддержки SOCKS5 для протоколов newcamd и cccam в OScam нет. Это не баг, это просто не реализовано. Если вам нужно завернуть исходящий card-трафик через SOCKS5, делать это надо на уровне операционной системы — через redsocks, tun2socks или VPN-интерфейс.
Веб-интерфейс OScam (httpport) — другое дело, его можно и нужно прятать за nginx как reverse-proxy. Но это только веб-морда, не card-протоколы.
Настройка proxy-reader в oscam.server
Конфиги OScam лежат в разных местах в зависимости от образа. На Enigma2-боксах обычно /etc/tuxbox/config/oscam/, на Debian/Ubuntu-серверах — /etc/oscam/, на некоторых сборках /var/keys/ или /usr/keys/. Файл, который нас интересует — oscam.server.
Вот минимальная рабочая секция proxy-reader:
[reader]
label = upstream_cccam
protocol = cccam
device = upstream.example.com,12000
user = myuser
password = mypassword
group = 1
cccversion = 2.3.0
cccmaxhops = 10
ccckeepalive = 1
reconnecttimeout = 30
inactivitytimeout = 60
Параметры секции [reader]: protocol, device, user, password
protocol должен совпадать с тем, что ожидает вышестоящий сервер. CCcam-сервер — cccam. Newcamd-сервер — newcamd. Не угадывайте, смотрите в настройки источника.
device — это hostname,port без пробелов. Если вышестоящий сервер за CGNAT или с динамическим IP, нужен DDNS: в поле device прописываете доменное имя вроде myserver.ddns.net,12000, а не IP. Иначе при смене адреса придётся лезть в конфиг вручную.
Ключевые поля: group, cccversion, cccmaxhops, ccckeepalive
group — это связующее звено между reader и account. Reader с group = 1 будет отдавать карты только тем account, у которых тоже прописано group = 1. Без совпадения групп карты не пробрасываются — и это самая частая причина, почему схема не работает.
cccmaxhops определяет, с какой глубины хопов принимать карты. По умолчанию обычно 0 или 1, а это значит, что карты, которые вышестоящий сервер сам получил от третьего сервера, к вам уже не дойдут. При построении цепочек ставьте cccmaxhops = 10 или даже выше.
ccckeepalive = 1 включает keepalive-пинги, чтобы соединение не рвалось при простое. Для прокси-режима это обязательно.
Порты по умолчанию и inactivitytimeout
CCcam слушает на порту 12000 — это де-факто стандарт. Newcamd обычно 15050, но конкретный порт всегда определяет вышестоящий сервер. Проверяйте именно там.
inactivitytimeout — если соединение простаивает дольше заданного времени (в секундах), OScam его разрывает и переподключается. Значение 60 секунд — разумный компромисс. Слишком большое значение приводит к зависанию мёртвых соединений: сокет открыт, данные не идут, OScam этого не замечает.
Параметр reconnecttimeout и audisabled для прокси-режима
reconnecttimeout = 30 означает, что после разрыва OScam подождёт 30 секунд перед повторной попыткой. Слишком маленькое значение — флуд подключениями, вас могут забанить на вышестоящем сервере. Слишком большое — долгий простой при временных сетевых проблемах.
Параметр audisabled = 1 отключает логирование AU (card update) для этого reader. Если reader — чисто прокси без физической карты, AU всё равно не работает, и запись лишних ошибок в лог только мешает диагностике.
Раздача через oscam.user и построение цепочки серверов
OScam-прокси одновременно является клиентом для вышестоящего сервера и сервером для нижестоящих клиентов. Настройка «серверной» части делается в oscam.user.
Секция [account]: создание исходящего пользователя для клиента
[account]
user = client1
password = clientpass
group = 1
cccreshare = 10
uniq = 0
Этот account будет выдавать карты клиенту, подключающемуся к нашему прокси. cccreshare определяет, сколько уровней пересдачи разрешено: если клиент сам является сервером и пересдаёт карты дальше, именно это поле ограничивает глубину.
Связывание reader и user через одинаковый group
Логика простая: reader получает карты с вышестоящего сервера и помечает их группой. Account может раздавать только карты из групп, которые в нём прописаны. Нет совпадения групп — нет карт. Это не очевидно из документации, но именно здесь застревает большинство.
Если у вас несколько reader из разных источников, можно дать им разные группы и управлять доступом: одному клиенту — одна группа карт, другому — другая.
cccmaxhops и cccreshare при реле далее по цепочке
При построении цепочки важно согласовать оба параметра. cccmaxhops в oscam.server — сколько хопов принимаем от вышестоящего. cccreshare в oscam.user — сколько разрешаем пересдавать нашим клиентам.
Если вышестоящий сервер ограничивает cccreshare = 1, то даже с большим cccmaxhops у нас карты будут только первого уровня. Это ограничение со стороны источника, обойти его нельзя.
Пример двухзвенной цепочки: источник → прокси → конечный клиент
Схема: Источник (CCcam, порт 12000) → Прокси OScam → Клиент (OScam/CCcam)
На прокси-сервере в oscam.server:
[reader]
label = source_server
protocol = cccam
device = source.example.com,12000
user = proxyuser
password = proxypass
group = 1
cccmaxhops = 8
ccckeepalive = 1
reconnecttimeout = 30
inactivitytimeout = 60
audisabled = 1
В oscam.user на том же прокси-сервере:
[account]
user = endclient
password = endpass
group = 1
cccreshare = 5
Клиент подключается к прокси по его IP и CCcam-порту (тот, что прописан в oscam.conf в секции [cccam], параметр port). Прокси принимает ECM-запрос от клиента, передаёт на источник, получает CW, возвращает клиенту.
При двойном NAT — если прокси-сервер сам за роутером — нужен проброс порта на роутере. Входящие клиенты должны доставать до прокси, иначе connection refused.
Маршрутизация трафика OScam через внешний прокси/VPN
Если задача — скрыть реальный IP сервера от вышестоящего источника, прокси для OScam на уровне приложения здесь не поможет. Нужно заворачивать трафик на уровне ОС.
Почему встроенного SOCKS5 для card-протоколов нет
OScam открывает TCP-соединения напрямую, без какого-либо прокси-слоя в коде. Разработчики не реализовывали SOCKS5 для newcamd/cccam — просто не было такой задачи в дизайне. Так что все инструкции вида «пропишите SOCKS5 в OScam» — это либо про что-то другое, либо неработающий совет.
Обёртка через redsocks/iptables для принудительного проксирования
redsocks принимает TCP-трафик и перенаправляет его через SOCKS5 или HTTP-прокси. Связка выглядит так: iptables перехватывает исходящий трафик от процесса oscam на нужные порты и перенаправляет на локальный порт redsocks, а тот уже туннелирует через внешний прокси.
Пример правила iptables (для исходящего трафика на порт 12000):
iptables -t nat -A OUTPUT -p tcp --dport 12000 -j REDIRECT --to-port 12345
Где 12345 — локальный порт redsocks. Это грубый пример; в реальной установке нужно фильтровать по UID процесса oscam или по конкретным целевым IP.
Альтернатива: туннель через VPN-интерфейс на уровне ОС
Проще и надёжнее — поднять WireGuard или OpenVPN, добавить маршрут для IP-адреса вышестоящего сервера через VPN-интерфейс. Тогда весь трафик к источнику идёт через туннель автоматически, без iptables-правил.
Осторожно: если VPN-провайдер блокирует нестандартный порт 12000 (такое бывает на дешёвых коммерческих VPN), соединение не поднимется. Проверяйте проходимость порта через nc -vz upstream.example.com 12000 с VPN-адреса перед тем, как перестраивать маршрутизацию.
httpport и веб-интерфейс OScam за reverse-proxy (nginx)
Веб-интерфейс OScam слушает на порту, заданном в oscam.conf — обычно httpport = 8888. Его можно и нужно прятать за nginx с TLS и basic-auth.
Минимальный блок в конфиге nginx:
location /oscam/ {
proxy_pass http://127.0.0.1:8888/;
proxy_set_header Host $host;
auth_basic "OScam";
auth_basic_user_file /etc/nginx/.htpasswd;
}
TLS-сертификат — Let's Encrypt через certbot, это занимает две минуты. Снаружи будет виден только 443-й порт nginx, порт 8888 остаётся недоступным извне.
Диагностика и типичные ошибки прокси-соединения
Большинство проблем с прокси для OScam диагностируются за 10 минут, если знать, куда смотреть. Главное — включить нормальный уровень логирования.
Чтение oscam.log: статусы CONNECTED, CARDOK, no matching
Уровень логирования задаётся в oscam.conf в секции [global]: параметр loglevel. Значение 8 даёт полный debug. Можно также запустить OScam с флагом -d 8 прямо из командной строки.
Что искать в логе:
CONNECTED— reader успешно подключился к вышестоящему серверуCARDOK— карты получены и доступныno matching reader— ECM-запрос пришёл, но ни один reader не смог его обработать. Обычно проблема с group или с тем, что нужная карта вообще не пришла от источникаdisconnectedс последующимreconnecting— нормальный цикл, если не слишком частый
Ошибка «cmd05» и несовпадение версий CCcam
cmd05 в логе — это ошибка handshake CCcam-протокола. Чаще всего причина — несовпадение cccversion между вашим proxy-reader и вышестоящим сервером. Если источник ожидает CCcam 2.3.0, а у вас прописано 2.1.4, рукопожатие может не состояться.
Попробуйте значения 2.3.0, 2.2.1, 2.1.4 — какое принимает источник. Иногда помогает убрать параметр вообще и дать OScam согласовать версию самостоятельно.
ECM timeout и превышение допустимой задержки в цепочке
Каждый хоп в цепочке добавляет сетевую задержку. Типичный лимит ECM timeout на приёмнике — от 3000 до 6000 мс. При двух-трёх промежуточных серверах с ping 80–100 мс каждый, сумма легко перевалит за лимит.
Решение: сокращать цепочку, выбирать серверы с минимальным ping, и проверять ecmwhitelist / ecmcachedenabled в oscam.conf — кэш ECM снижает нагрузку на повторные запросы.
Loop detection и конфликт nodeid
CCcam-протокол защищается от петель: если одна и та же карта вернётся на сервер, который уже её отдал, соединение разрывается. Идентификатор сервера — nodeid, он задаётся в oscam.conf в секции [cccam].
Если два разных OScam-сервера в цепочке имеют одинаковый nodeid (например, оба использовали дефолтное значение), source-сервер думает, что это петля, и отключает один из них. Задайте уникальный nodeid на каждом сервере явно: 16 hex-символов, например nodeid = A1B2C3D4E5F60001.
Проверка портов через telnet/nc и tcpdump
Перед тем как копаться в конфигах, убедитесь, что порт вообще доступен:
# Проверка доступности порта
nc -vz upstream.example.com 12000
# Или через telnet
telnet upstream.example.com 12000
# Захват трафика на порту 12000
tcpdump -i any -n port 12000
tcpdump покажет, идут ли пакеты вообще. Если nc зависает без ответа — порт закрыт фаерволом или NAT не пробит. Если соединение устанавливается, но OScam сразу отключается — проблема в протоколе или аутентификации.
При тестировании цепочки проверяйте каждое звено отдельно: сначала прокси → источник, потом клиент → прокси. Пытаться отладить сразу всю цепочку — потеря времени.
Поддерживает ли OScam работу через SOCKS5-прокси напрямую?
Нет. Для протоколов newcamd и cccam встроенной поддержки SOCKS5 нет — ни в каком параметре конфига это не настраивается. Проксирование card-трафика делается на уровне ОС: через redsocks + правила iptables или через маршрутизацию исходящего трафика через VPN-интерфейс. Веб-интерфейс OScam (httpport) можно вынести за nginx, но это только HTTP, не card-протоколы.
Чем proxy-reader отличается от обычного cardreader?
Обычный cardreader работает с физической картой через device = /dev/ttyUSB0 или PCSC-интерфейс и сам декодирует ECM. Proxy-reader подключается к вышестоящему сетевому серверу через device = host,port и protocol cccam/newcamd. У него нет своей карты — он ретранслирует чужие запросы. Можно думать о нём как о сетевом клиенте, который прикидывается ридером.
Какие порты использовать для прокси-соединения?
CCcam по умолчанию работает на порту 12000, newcamd обычно на 15050, mgcamd-протокол часто на 1000. Но конкретный порт всегда определяет вышестоящий сервер — смотрите в его настройках. В oscam.server порт прописывается в параметре device: device = host,порт. Доступность проверяйте через nc -vz host порт.
Почему карты не доходят через цепочку из нескольких серверов?
Три самые частые причины. Первая — занижен cccmaxhops в секции [reader]: карты с дальних хопов просто не принимаются. Вторая — cccreshare на отдающей стороне ограничивает пересдачу, и до конца цепочки карты не долетают. Третья — сработала loop detection из-за одинакового nodeid на двух серверах. Проверяйте по порядку: loglevel 8, смотрите на CARDOK и «no matching reader».
Как скрыть реальный IP сервера OScam?
Заворачивать исходящий card-трафик через VPN-интерфейс или redsocks — на уровне ОС, не в самом OScam. Веб-морду прятать за reverse-proxy nginx с TLS и basic-auth. При этом учитывайте рост задержки: каждый лишний хоп добавляет RTT, и при длинных цепочках ECM timeout на клиенте может не укладываться в лимит 3000–6000 мс.
Почему растут ECM timeout при использовании прокси?
Каждый промежуточный сервер добавляет сетевую задержку туда и обратно. Два сервера с ping 80 мс каждый дают минимум 320 мс только на транспорт, плюс время обработки. Клиент ждёт CW не дольше лимита — обычно 3000–6000 мс. Решение: сокращать число хопов, выбирать физически близкие серверы, включать ECM-кэш в OScam и не ставить inactivitytimeout слишком большим, чтобы зависшие соединения своевременно переподключались.