Спутниковый интернет на SkyStar1 и SkyStar2 под Linux


Автор: Денис Евстигнеев
Оригинал: carpenter.bofh.ru

Содержание

Предисловие

Для чего я взялся писать этот дайджест? Для себя. Чтобы при переустановке не разыскивать снова разрозненные описания и компоненты программного обеспечения, не выискивать заметки в сети, пытаясь в очередной раз составить из ста зайцев одну целую лошадь.

Статья сделана откровенно в «детском» стиле — делай раз, делай два. Сам я Linux знаю плохо, потому старался сделать всё нарочито подробно. Буду рад любым комментариям, дополнениям, исправлениям. Всё слать на Carpenter@wormhole.ru

Предполагается, что Вы уже закрепили и настроили антену, сигнал принимается более чем прекрасно. Если же нет, то очень настоятельно рекомендую почитать статью «Установка и настройка спутниковой антены»[13]. Лучше и не напишешь!

Писался этот дайджест (а это именно дайджест, обзор. Т.е., ничегонового в нём нет — всё это сборная солянка с кучей ссылок) нарочито подробно, так чтобы человек также плохо знающий Linux, как и я, смог бы «поднять» сетевое подключение хотя бы за пару часов.

1. Подготовка

Подготовка к работе всегда занимает времени больше, чем сама работа

Народная мудрость

Самый простой на мой взгляд путь — это работать с ветвью ядра версии 2.6.xx. На данный момент на сайте kernel.org доступная версия 2.6.13.1. Насколько я понял, начиная с версии 2.6.11, благодаря стараниям NuclearCat встроенные в ядро драйвера DVB-карт SkyStar 11 и SkyStar 2 прекрасно работают.

1.1 SkyStar 1. Linux kernel v2.6.1x.x

Итак, если Вы подробнейшим образом ознакомились со статьёй Алексея Силякова «DVB-карта SkyStar-1, релиз 1.5. Technotrend. Работа над ошибками.»[1], очаровались сервисами, предоставляемыми этой картой и стали её счастливейшим обладателем (за какие-нибудь 190$-200$) то лучше ничего и придумать нельзя, как использовать её в среде #nix. Она вполне работоспособна как под FreeBSD, так и в среде Linux

Сейчас мы устанавливаем карточку SkyStar 1 под Linux, с ядром версии не ниже 2.6.11. Сам я экспериментировал с ядром 2.6.12.2.

Должен Вас предупредить, что карта эта — весьма капризная особа и к ней, как минимум понадобится дополнительный охладитель. Впрочем, это отдельная история и о ней можно подробно почитать в статье Николая Штермеля «Охлаждение SkyStar 1»

В файл конфигурации надо доабавить следующие опции ([m] — в виде модуля, [y] — собрать вместе с ядром):

# # Digital Video Broadcasting Devices # DVB=[y] CONFIG_DVB=[y] CONFIG_DVB_CORE=[m|y] CONFIG_DVB_VES1X93=[m|y] CONFIG_DVB_AV7110=[m|y] CONFIG_DVB_AV7110_OSD=[y] CONFIG_VIDEO_SAA7146=[m|y] CONFIG_VIDEO_SAA7146_VV=[m|y] CONFIG_VIDEO_VIDEOBUF=[m|y] CONFIG_VIDEO_TUNER=[m|y] CONFIG_VIDEO_BUF=[m|y] CONFIG_VIDEO_BTCX=[m|y] CONFIG_VIDEO_IR=[m|y]

После сборки должен получится следующий набор модулей[2]:

dvb-ttpci

Основной драйвер полнофункциональных карт, основанных на чипсете AV7110.

videodev

Модуль ядра Video4Linux. Это основной модуль, предоставляющий доступ к аналоговой «картинке» mpeg2-декодера av7110.

v4l2-common

Модуль вспомогательных функций драйверов Video4Linux-2.

v4l1-compat

Модуль вспомогательных функций для обратной совместимости приложений, использующих Video4Linux-1.

dvb-core

Модуль ядра DVB. Обеспечивает поддержку работы с утройствами каталога /dev/dvb/adapter/

saa7146

Ядро драйвера SAA7146. Необходим для работы со всеми устройствами, основанными на чипсете saa7146.

saa7146_vv

Поддержка функций Видео и Виртуальных Двоичных Интерфейсов (VBI — Video Binary Interface). Этот модуль необходим только для работы с полнофункциональными DVB-картами.

video-buf

Вспомогательный модуль saa7146 для захвата видеопотока. Модуль для захвата видеопотока.

dvb-ttpci

Основной драйвер карт основанных на AV7110 и полнофункциональных DVB-S/C/T

Подгружать модули в память и перезагружаться с обновлённым ядром пока рановато. Вряд-ли dvb-ttpci загрузится без необходимых программных средств — firmware. Этот файл будет загружаться непосредственно в исполнительное устройство карты, примерно также, как подгружаются firmware-файлы в софтварные модемы. Так, что необходимо в зависимости от версии карты загрузить с сайта LinuxTV необходимый файл:

 NameLast ModifiedSize
Parent Directory09-Jun-2005 19:52-
dvb-ttpci-01.fw-261a14-Nov-2004 00:48221k
dvb-ttpci-01.fw-261b14-Nov-2004 00:48221k
dvb-ttpci-01.fw-261c14-Nov-2004 00:48221k
dvb-ttpci-01.fw-261d26-Dec-2004 01:02227k
dvb-ttpci-01.fw-261f06-Jul-2005 00:44229k

А можно нигде эти файлы не искать и загрузить нужный файл при помощи скрипта, находящегося в документации, прилагающейся к исходному коду ядра — Documents/dvb/get_dvb_firmware

Нужный файл надо переименовать в dvb-ttpci-01.fw и положить в папку /lib/firmware. (Расположение этой директории, как правило определяется переменной FIRMWARE_DIR в файле /etc/hotplug/firmware.agent.)

Если карта установлена в компьютер, то можно попытаться всё это загрузить: modprobe dvb_core dvb_shutdown_timeout=0 dvb_net_debug=1 и dvb-ttpci videodev v4l2-common v4l1-compat saa7146 saa7146_vv video-buf dvb-ttpci.

Обратите внимание на параметр, передаваемый при загрузке модуля dvb_coredvb_shutdown_timeout=0. Дело в том, что карты SkyStar 1 и SkyStar 2 для защиты от перегрева при отсутствии нагрузки выключаются и теряют связь. Число 0 означает не выключаться никогда.[2]

Если всё прошло успешно, то dmesg | less должен показать примерно такую распечатку:

dvb-ttpci: gpioirq unknown type=0 len=0 dvb-ttpci: info @ card 0: firm f0240009, rtsl b0250018, vid 71010068, app 8000261d dvb-ttpci: firmware @ card 0 supports CI link layer interface dvb-ttpci: Crystal audio DAC @ card 0 detected saa7146_vv: saa7146 (0): registered device video0 [v4l2] DVB: registering frontend 0 (ST ST V0299 DVB-S)... dvb-ttpci: found av7110-0.

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

1.2 SkyStar 1, Linux, Ядро 2.4.xx

Для меня, как для человека знакомого с Linux весьма поверхностно, существование двух вполне пополуярных веток ядер было и остаётся загадкой. Быть может, подразумеваеются ветви Stable, Current и Release? Или нечто подобное тому, как до сих пор довольно популярно использование FreeBSD v4.11? Точно не знаю.

Так или иначе, но мне пришлось проэкспериментировать с ядром 2.4.31.

В отличие от ядра 2.6.xx.x в нём драйверов для карт SkyStar 1 и SkyStar 2 нет. Драйвера придётся загрузить с опять-таки с сайта LinuxTV. На данный момент это — linuxtv-dvb-1.1.1.tar.bz2[327K]. Правда, во многих местах в сети, в частности в статьте, размещённой на сайте General Satellite «Программное обеспечение под Linux 2.4»[3], утверждается, что эти драйвера для работы с интернет не годятся — всё нормально загружается, но спутник не «лочится». У меня, правда, всё заработало. Возможно, что информация просто устарела.

Во всяком случае, в большинстве сетевых заметок, настоятельно рекомендуется взять альтернативные драйвера от Дениса Федорищенко (NuclearCat)[5]ss1linux-rc5.tar.gz[1.8M].

В сети есть немало статей, посвящённых установке и настройке DVB-драйверов в под ядром Linux v2.4.xx.x, в частности, например, статьи Сергея Мазенкова «Как запустить интернет через DVB-S под Linux 2.4»[4], Сергея Ткачова «Digital Video Broadcasting или как заставить работать TechniSat SkyStar-1 под Linux»[6] или «Установка спутникового Internet под Linux»[7]

Все эти руководства, кроме последнего, предлагают устанавливать dvbds-2, dvbd3. Желательно созданный Andrix'ом[8]. Даже в знаменитом Sat-HOWTO[10] предлагается использовать этот путь, но я даже пробовать этот вариант не стал: во-первых сразу отпугнула фраза в Readme2, , а во-вторых, для полноценной компиляции и установки dvbd необходимо загрузить драйверы siemens_dvb-0.8.2.tar.gz, причём именно данной версии. Кроме того, об этом, как выше было сказано, в сети написано более чем достаточно и подробно.

Как мне кажется, данная концепция на сей день несколько устарела, так что остановим наше внимание на «штатных» драйверах: linuxtv-dvb-1.1.1.tar.bz2 от LinuxTV.

Порядок установки вполне соответствует декларированному в прилагаемом Readme-файле. Нужно только не забыть скачать firmware (в моём случае это файл dvb-ttpci-01.fw-261d) «Раскручиваем» куда-нибудь полученный исходник: tar -jxvf linuxtv-dvb-1.1.1.tar.bz2, заходим в получившуюся директорию linuxtv-1.1.1. Файл firmware помещаем в поддиректорию build-2.4, переименовав его в dvb-ttpci-01.fw.

Не стоит забывать, что надо сделать ссылку /usr/src/linux из того места, где находятся исходные годы Вашего ядра. В моём случае это выглядело так: ln -sf /usr/src/linux-2.4.31 /usr/src/linux.

Теперь можно запустить (прямо из linuxtv-1.1.1/build-2.4 make.

Поправим файл linuxtv-1.1.1/build-2.4:

# DVB core insmod ./dvb-core.o

на

# DVB core insmod ./dvb-core.o dvb_shutdown_timeout=0

Это, опять таки, необходимо, чтобы карта при отсутствии каких-либо действий, самопроизвольно не выключилась. Если загрузка модулей прошла удачно, то следующей командой должна быть ./insmod.sh load (её следует запускать только из linuxtv-1.1.1/build-2.4)

Если lsmod покажет что-то вроде этого:

dvb-core 39616 0 [ttusb_dec dvb-ttusb-budget dvb-ttpci mt312 cx24110 grundig_29504-491 grundig_29504-401 tda1004x ves1820 stv0299 alps_tdmb7 alps_tdlb7 ves1x93]

К моему удивлению, dmesg | less наличия dvb-ttpci устройства не показал, но карта работала! Впрочем, об этом будем говорить несколько позже. На данный момент dmesg выдал следующее:

Linux video capture interface: v1.00 saa7146: register extension 'dvb'. PCI: Found IRQ 5 for device 00:09.0 saa7146_core: found saa7146 @ mem d09f4000 (revision 1, irq 5) (0x13c2,0x0000). DVB: registering new adapter (Siemens/Technotrend/Hauppauge PCI rev1.3). probe_tuner: try to attach to Siemens/Technotrend/Hauppauge PCI rev1.3 stv0299.c: setup for tuner BSRU6, TDQB-S00x DVB: registering frontend 0:0 (STV0299/TSA5059/SL1935 based)... Siemens/Technotrend/Hauppauge PCI rev1.3 adapter 0 has MAC addr = 00:d0:5c:03:8b:14 DVB: AV7110(0) - firm f0240009, rtsl b0250018, vid 71010068, app 8000261b DVB: AV7110(0) - firmware supports CI link layer interface av7110(0): Crystal audio DAC detected saa7146_fops: saa7146 (0): registered device video0 [v4l2] av7110: found av7110-0. saa7146: register extension 'budget dvb'. saa7146: register extension 'budget_ci dvb'. saa7146: register extension 'budget dvb /w video in'.

Если нас всё устраивает, то можно зайти в linuxtv-1.1.1 и набрать make install и настроить автоматическую загрузку модулей при запуске системы, на забыв про dvb-core dvb_shutdown_timeout=0

1.3. SkyStar 2, Linux kernel v2.6.xx.x

Теперь попробуем установить SkyStar 2. Пожалуй, самое толковое руководство по этому вопросу сделано NuclearCat — «Руководство по установке SkyStar2 под Linux 2.4»[9].Это вполне понятно — кто лучше автора расскажет о том, как оно всё работает. И даже не важно, что оно сделано для ядра 2.4 — для ядер ветки 2.6.xx.x технология будет почти такой же, за исключением того, что с сайта LinuxTV нам ничего загружать не придётся. «Родные» драйвера ядра вполне работоспособны. Таким образом, нам осталось добавить в /usr/src/linux/.config следующие настройки:

# # Digital Video Broadcasting Devices # CONFIG_DVB=y CONFIG_DVB_CORE=m # # Supported FlexCopII (B2C2) Adapters # CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_DVB_B2C2_FLEXCOP_PCI=m CONFIG_DVB_B2C2_FLEXCOP_USB=m # CONFIG_DVB_B2C2_FLEXCOP_DEBUG is not set CONFIG_DVB_B2C2_SKYSTAR=m # # DVB-S (satellite) frontends # CONFIG_DVB_STV0299=m CONFIG_DVB_MT312=m

Ну чтож, теперь наберём в директории cd /usr/src/linux/ && make mrproper && make modules && make modules_install. Модули готовы.

Понадобится нам всего три из них: dvb-core, stv0299, skystar2. Как и в случае со SkyStar 1 при загрузке модуля dvb-core следует загружать с параметрами dvb_shutdown_timeout=0. В противном случае, сигнала Вы просто не увидите!

Итак: modprobe dvb-core dvb_shutdown_timeout=0 dvb_net_debug=1 && modprobe stv0299 && modprobe skystar2. dmesg должен показать следующее (MAC-адрес должен соответсвовать MAC-адресу с метки на Вашей карте):

drivers/media/dvb/b2c2/skystar2.c: FlexCopIIB(rev.195) chip found drivers/media/dvb/b2c2/skystar2.c: the chip has 38 hardware filters driver_initialize MAC address = 00:d0:d7:0c:d3:1d:34:cf DVB: registering new adapter (SkyStar2). DVB: registering frontend 0 (ST STV0299 DVB-S)...

Если Вы видите что-то подобное у себя, значит драйвера установлены вполне удачно.

1.4. SkyStar 2, Linux v2.4.xx

Процесс установки под ядром 2.4.xx.x почти идентичен установке под 2.6.xx.x, за исключением того, что нам придётся взять драйвера linuxtv-dvb-1.1.1.tar.bz2 с LinuxTV или «родные» драйвера от NuclearCat — linuxtv-dvb-1.1.1a.tar.bz2.

Как и в случае с картой SkyStar 2, нам понадобится «раскрутить» драйвера в какую-нибудь директорию: tar -jxvf linuxtv-dvb-1.1.1.tar.bz2, зайти в полученную папку и набрать make. Не будем, также, забывать, что в /usr/src/linux должен находится исходный код ядра Linux.

Если процесс компилляции прошёл удачно, заходим в linuxtv-1.1.1/build-2.4 и загружаем модули: ./insmod.sh load. dmesg должен показать что-то вроде:

Linux video capture interface: v1.00 saa7146: register extension 'dvb'. saa7146: register extension 'budget dvb'. saa7146: register extension 'budget_ci dvb'. saa7146: register extension 'budget dvb /w video in'. usb.c: registered new driver Technotrend/Hauppauge USB-Nova usb.c: registered new driver ttusb-dec PCI: Found IRQ 5 for device 00:09.0 skystar2.c: FlexCopIIB(rev.195) chip found skystar2.c: the chip has 38 hardware filters DVB: registering new adapter (Technisat SkyStar2 driver). probe_tuner: try to attach to Technisat SkyStar2 driver stv0299.c: setup for tuner Samsung TBMU24112IMB DVB: registering frontend 0:0 (STV0299/TSA5059/SL1935 based)...

Если всё выглядит так, то считаем установку удачной и можем позволить себе запустить cd linuxtv-1.1.1 && make install и прописываем автозагрузку модулей при запуске системы.

2. Сетевой интерфейс

— А теперь, дорогие товарищи пассажиры, пристегнитесь. Мы попытаемся вместе со всей этой фигнёй взлететь.

Из анекдота

Остальные действия от версии ядра почти не зависят, так что дальше разбиения на разделы 2.4 и 2.6 не будет. Также будет почти сходна настройка карт SkyStar 1 и SkyStar 2.

Итак, если у Вас не установлена devfs, то Вам придётся создать соответсвующие интерфейсы. Лучше всего это сделать при помощи скрипта, предлагаемого NuclearCat в заметке «Руководство по установке SkyStar2 под Linux 2.4.». Почему-то в драйверах linuxtv-1.1.1.tar.bz2 скрипт так и неисправлен, так что копируйте его у NuclearCat и запускайте: ./makedev-dvb.sh. Впрочем, думаю, что лучше использовать devfs.

Теперь настаёт достаточно сложный и ответственный момент: нам предстоит настроить карту на приём информации. Для этого понадобится набор утилит linuxtv-dvb-apps-1.1.0.tar.bz2, всё с того же сайта LinuxTV. Если мы под ядром 2.4.xx.x, то всё в порядке — просто распаковываем поставку, заходим в получившуюся директорию linuxtv-dvb-apps-1.1.0 набираем make, если же ядро 2.6.xx.x, то нужно зайти в директорию linuxtv-dvb-apps-1.1.0/util/ и набрать make. После компилляции, получившиеся файлы:

linuxtv-dvb-apps-1.1.0/utils/av7110_loadkeys/evtest

linuxtv-dvb-apps-1.1.0/utils/av7110_loadkesy/av7110_evtest

linuxtv-dvb-apps-1.1.0/utils/dvbdate/dvbdate

linuxtv-dvb-apps-1.1.0/utils/dvbnet/dvbnet

linuxtv-dvb-apps-1.1.0/utils/dvbtraffic

linuxtv-dvb-apps-1.1.0/utils/scan/dvb-c

linuxtv-dvb-apps-1.1.0/utils/scan/dvb-s

linuxtv-dvb-apps-1.1.0/utils/scan/dvb-t

linuxtv-dvb-apps-1.1.0/utils/szap/czap

linuxtv-dvb-apps-1.1.0/utils/szap/szap

linuxtv-dvb-apps-1.1.0/utils/szap/tzap

либо в локальный ~/bin, в /usr/local/bin/ или ещё куда-нибудь, в «исполняемую» директорию. В этой «игре» нам понадобится всего три утилиты: szap, dvbnet и dvbtraffic

Теперь нам предстоит «рассказать» карте о том, с каким транспондером и с каким каналом ей предстоит работать. Например, я использую Сервис Raduga, спутник Intelsat-904:

частота11595 GHz
поляризацияВертикальная
скороть передачи29270 Msps
PID4152

Формат файла, содержащего в себе описания каналов S-диапазона таков:

ПолеЗначениеОписание
Название канала/сервиса-

Если есть символы, отличные от буквенно-цифровых или пробелы, то название заключить в двойные кавычки.

ЧастотаGHz

Частота передачи канала со спутника в GHz.

поляриазцияv/h

Поляриазция: v — вертикальная, h — горизонтальная (соответственно, для круговой h — левая круговая, v — правая круговая)

diseqc0/1

Если принимающая головка одна, то «0», если больше, то «1»

symbol rateMsps

Скороcть символьной передачи данных (symbol rate — Mega symbols per rate)

V-PIDномер

Идентификатор Пакетов Видеопотока (Video Packet Identificator)

A-PIDномер

Идентификтора Аудио Пакетов (Audio Packet Identificator)

SIDномер

Идентификатор Сервиса (используется только в цифровом вещании) для использованием рессивера определённого сервиса (Service ID)

Соответственно, создаём файл /etc/channels.conf и делаем в нём запись:

Raduga:11595:v:0:29270:0:0:0

Конечно, можно было бы и создать файл, скажем с названием Intelsat-904.60W и нашпиговать его параметрами транспондеров. Ну путь это будет спутник Intelsat-904 W60°. Параметры можно будет взять с сайта SatCodX:

S 11155000 H 2963000 3/4 S 11491000 V 5787000 3/4 S 11520000 V 12000000 3/4 S 11529000 V 2893000 3/4 S 11555000 H 2927000 5/6 S 11595000 H 29270000 5/6 S 11595000 V 29270000 7/8

«напустить» scan на этот файл. Если всё верно настроено и антена хорошо сориентирована, то на экране получится что-то вроде

scanning Intel904.60W using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0' initial transponder 11595000 H 29270000 7 initial transponder 11595000 V 29270000 7 initial transponder 11520000 V 12000000 3 >>> tune to: 11595:h:0:29270 WARNING: >>> tuning failed!!! >>> tune to: 11595:h:0:29270 (tuning failed) WARNING: >>> tuning failed!!! >>> tune to: 11595:v:0:29270 WARNING: filter timeout pid 0x0011 WARNING: filter timeout pid 0x0000 WARNING: filter timeout pid 0x0010 >>> tune to: 11520:v:0:12000 0x0000 0x0001: pmt_pid 0x0105 MIR-Teleport -- Moskow (running) 0x0000 0x0002: pmt_pid 0x0106 Teleport MIR -- HTB (running) 0x0000 0x0003: pmt_pid 0x0107 MIR-Teleport -- MIR-TV (running) 0x0000 0x0004: pmt_pid 0x0108 MIR Teleport -- MGOU (running) 0x0000 0x0006: pmt_pid 0x010a MIR-Teleport -- MIR Radio Service (running) 0x0000 0x0007: pmt_pid 0x0101 MIR-Teleport -- MAYAK FM (running) 0x0000 0x0008: pmt_pid 0x0100 MIR-Teleport -- MIR Service (running) 0x0000 0x0009: pmt_pid 0x0102 Mir Teleport -- Radio MIR (running) Network Name 'NDS' dumping lists (8 services) Moskow:11520:v:0:12000:512:650:1 HTB:11520:v:0:12000:515:653:2 MIR-TV:11520:v:0:12000:514:652:3 MGOU:11520:v:0:12000:517:655:4 MIR Radio Service:11520:v:0:12000:0:660:6 MAYAK FM:11520:v:0:12000:0:662:7 MIR Service:11520:v:0:12000:513:651:8 Radio MIR:11520:v:0:12000:0:665:9 Done.

Только беда в том, что сервисы данных scan не «отловит» (обратите внимание на строчку >>> tune to: 11595:h:0:29270 WARNING: >>> tuning failed!!! Как раз, нужный мне транспондер) так что для настроек на Интернет Провайдера, придётся создавать файл channels.conf вручную.

Попробуем настроить карту на приём данных: /bin/szap -c /etc/channels.conf. Опять же, если всё было сделано верно, то мы увидим на экране следующее:

brat3 util # szap -c /etc/channels.conf -n 1 -x reading channels from file '/etc/channels.conf' zapping to 1 'I904': sat 0, frequency = 11595 MHz V, symbolrate 29270000, vpid = 0x0000, apid = 0x0000 using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0' status 03 | signal ba7a | snr 7aeb | ber 000026cd | unc 00000000 | status 1f | signal b8fe | snr cfe1 | ber 000005c6 | unc 00000000 | FE_HAS_LOCK

Понятно, что если сигнал по той или иной причине пропал, ну например, произошло затенение отражателя, то эту процедуру надо повторить.

Осталось активировать сетевой интерфейс. Будьте внимательны — всё завист от того, какой тип фильтрации сетевых пакетов использует Ваш Интернет Провайдер. Если фильтрация пакетов идёт по MAC-адресу, то исправлять ничего не надо. Если фильтрация идёт по IP-адресу, то необходимо установить MAC-адрес карты в нужное значение. Например, если выданный мне провайдером IP-адрес 10.252.155.40, то его необходимо перевести в шестнадцатеричную форму: 0A:FC:9B:28 и прибавить в начале ещё два нуля: 00:00:0A:FC:9B:28. Иногда, правда, провайдер добавляет специальный префикс. Например, 02:00:0A:FC:9B:28. Впрочем, всю эту информацию вы у него и должны узнать.

Адрес карты устанавливаем произвольный, причём, желательно, чтоб этот адрес не попадал ни в одну из внутренних подсетей. Ну, например, для моей сети вполне подойдёт адрес 10.95.2.1, Поскольку внутренняя подсеть у меня 10.95.1.0/24. Итак:

1. Настраиваем фильтрацию по PID-у, указанному провайдером (Идентификатору Пакетов) и создаём сетевой интерфейс. Например: dvbnet -p 4152.

brat3 root # dvbnet -p 4152 DVB Network Interface Manager Version 1.1.0-TVF (Build Fri Aug 12 14:12:43 2005) Copyright (C) 2003, TV Files S.p.A Device: /dev/dvb/adapter0/net0 Status: device dvb0_0 for pid 4152 created successfully.

2. Присваиваем интерфейсу IP-адрес и MAC-адрес. Здесь будьте внимательны — если вы сделаете что-то неверно, то tcpdump будет показывать наличие траффика, но работать ничего не будет.

ifconfig dvb0_0 10.95.2.1 netmask 255.255.255.255 broadcast 255.255.255.255

ifconfig dvb0_0 hw ether 00:00:0A:FC:9B:28

route add 10.95.2.1 dev dvb0_0

Теперь ifconfig должен показать что-то в этом роде:

dvb0_0 Link encap:Ethernet HWaddr 00:00:0A:FC:F3:9F inet addr:10.95.2.1 Bcast:255.255.255.255 Mask:255.255.255.255 UP BROADCAST RUNNING NOARP MULTICAST MTU:4096 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) Base address:0x1038

а в таблице маршрутизации должна появится следующая строка:

Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.95.2.1 0.0.0.0 255.255.255.255 UH 0 0 0 dvb0_0

Настал трепетный момент проверки работоспособности сетевого интрефейса. Вариантов два. Самый простой:

# tcpdump -ni dvb0_0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on dvb0_0, link-type EN10MB (Ethernet), capture size 96 bytes 21:42:01.020568 IP 217.10.39.84.80 > <GW_IP>88.2909: . 1195548608:1195549945(1337) ack 1701755686 win 57491 21:42:01.020584 IP 217.10.39.84.80 > <GW_IP>88.2909: . 1337:2674(1337) ack 1 win 57491 21:42:01.020586 IP 217.16.19.219.80 > 10.252.246.254.2394: S 3017247152:3017247152(0) ack 4146269160 win 5840 <mss 1460>

Вот когда такое по экрану ползёт, рука сама тянется «напустить» на всё это sniffit, но мы это делать не будем, поскольку неприлично подглядывать за чужим траффиком. Так делают только очень нехорошие дяди. Нам вполне должно быть достаточно того, что всё работает, однако!

Второй вариант проверки работоспособности интерфейса и того проще:

brat3 root # dvbtraffic 0365 10 p/s 1 kb/s 15 kbit 1029 89 p/s 16 kb/s 134 kbit 1030 166 p/s 30 kb/s 250 kbit 1031 774 p/s 142 kb/s 1164 kbit 1036 312 p/s 57 kb/s 469 kbit 1037 616 p/s 113 kb/s 926 kbit 1038 1035 p/s 190 kb/s 1557 kbit 1039 678 p/s 124 kb/s 1020 kbit 1040 91 p/s 16 kb/s 137 kbit 1042 119 p/s 21 kb/s 180 kbit 1050 1 p/s 0 kb/s 2 kbit 1051 2161 p/s 396 kb/s 3250 kbit 1056 5 p/s 0 kb/s 8 kbit 1057 359 p/s 65 kb/s 540 kbit 1058 961 p/s 176 kb/s 1445 kbit 1059 5 p/s 0 kb/s 8 kbit 1101 244 p/s 44 kb/s 367 kbit 1102 222 p/s 40 kb/s 334 kbit 1103 9 p/s 1 kb/s 14 kbit 1104 166 p/s 30 kb/s 249 kbit 1105 49 p/s 8 kb/s 73 kbit 1109 1095 p/s 201 kb/s 1647 kbit 2000 9177 p/s 1684 kb/s 13802 kbit -PID--FREQ-----BANDWIDTH-BANDWIDTH- 0365 9 p/s 1 kb/s 14 kbit

Теперь неплохо бы собрать это всё в один скрипт. Ну пусть он называется, скажем, dvb.sh. Честно сказать, я воспользовался готовым, который взял из заметки Виталия Прядко «Установка Skystar-2 на Linux (skystar dvb linux driver)»[12]

3. Ассиметричный доступ

Клопы отдельно, тараканы — отдельно

Народная мудрость

Думаю, что никому не открою страшной тайны, если скажу, что спутниковый доступ к Интернет ассиметричный. То есть, исходящий траффик должен идти по другому каналу, который, как правило, называют почему-то «наземным». Забавно, но в большей части случаев подключение к Интернет через спутник осуществляется через GPRS (EDGE) или CDMA мобильному телефону. Гораздо реже связь осуществляется через спутник же, но такое подключение обходится по себестоимости дороже трафика через GPRS-провайдера (порядок цен ~ .22$ за мегабайт). Правда подключение такое будет двунаправленным, а вовсе ни разу не симметричным — устройство для исходящего трафика отдельно, для входящего — отдельно.

Ниже я размещу картинку, дабы подчеркнуть размеры пропасти между пользователем, спутником и провайдером (что-то порядка 36.000 км до геостационарной орбиты спутника и столько же обратно):

Принципиальная схема спутникового подключения к Интернет.

Во-первых, мы отправляем запрос к нашему спутниковому провайдеру через подключение к наземному Интернет-провайдеру, например, через GPRS, EDGE, CDMA или другим способом. Получив наш запрос наземный провайдер передаёт его Спутниковому Провадйдеру. Последний, в свою очередь, обрабатывает его и отправляет данные на спутник. Со спутника данные принимаются нашей спутниковой антеной и попадают через Спутниковую Карту на наш компьютер и, может быть, во внутренню интрасеть.

Современные спутниковые провайдеры как правило предоставляют наземное поключение по Виртуальной Частной Сети (VPN). На мой взгляд, самый простой способ осуществить подключение к сети — использовать OpenVPN. Начиная со второй версии, Клиент OpenVPN при подключении самостоятельно настраивает маршрутизацию и что, кстати, немаловажно при подключении через мобильный телефон GPRS, EDGE или CDMA, устойчиво «держит» связь (в отличие, скажем от P-t-P MPPE/MPPC подключения).

Кроме того, OpenVPN-подключение можно установить и через GPRS и EDGE. Такие провайдеры, как БиЛайн и МТС закрыли возможность подключения по обычному VPN.

3.1. OpenVPN.

Если Ваш провайдер предоставляет подключение через OpenVPN, то всё, что Вам нужно — это загрузить последнюю версию программного обеспечения, установить её. Далее, загрузить файлы ключей и конфигурационный файл у провайдера, положить их в какую-нибудь директорию (например /etc/openvpn/config/ и набрать из командной строки: openvpn --config client.config.

В простейшем виде, конфигурационный файл может выглядеть примерно так:

client dev tap dev-node <название_узла_подключения> proto udp remote <PROVIDER_IP> 55684 resolv-retry infinite nobind persist-key persist-tun ca <файл_сертификата_сервера> cert <файл_сертификата_клиента> key <файл_ключа_клиента> ns-cert-type server verb 3

Подробнее о настройке OpenVPN можно прочитать в OpenVPN ™ 2.x HOWTO[14]. Ну а если Вы и так всё правильно настроили, то при подключении OpenVPN-клиента должно получиться что-то в этом роде:

brat3 config # openvpn --config client.ovpn Sat Sep 17 21:01:00 2005 OpenVPN 2.0 i686-pc-linux [SSL] [LZO] [EPOLL] built on Aug 14 2005 Sat Sep 17 21:01:00 2005 IMPORTANT: OpenVPN's default port number is now 1194, based on an official port number assignment by IANA. OpenVPN 2.0-beta16 and earlier used 5000 as the default port. Sat Sep 17 21:01:00 2005 WARNING: file 'Client.key' is group or others accessible Sat Sep 17 21:01:00 2005 Control Channel MTU parms [ L:1573 D:138 EF:38 EB:0 ET:0 EL:0 ] Sat Sep 17 21:01:00 2005 Data Channel MTU parms [ L:1573 D:1450 EF:41 EB:4 ET:32 EL:0 ] Sat Sep 17 21:01:00 2005 Local Options hash (VER=V4): '2c50bd2c' Sat Sep 17 21:01:00 2005 Expected Remote Options hash (VER=V4): '0ddbb6e3' Sat Sep 17 21:01:00 2005 UDPv4 link local: [undef] Sat Sep 17 21:01:00 2005 UDPv4 link remote: <SERVER_IP>:55684 Sat Sep 17 21:01:08 2005 TCP/UDP: Incoming packet rejected from 127.0.0.1:53[2], expected peer address: <SERVER_IP>:55684 (allow this incoming source address/port by removing --remote or adding --float) Sat Sep 17 21:01:08 2005 TCP/UDP: Incoming packet rejected from 127.0.0.1:53[2], expected peer address: <SERVER_IP>:55684 (allow this incoming source address/port by removing --remote or adding --float) Sat Sep 17 21:01:10 2005 TLS: Initial packet from <SERVER_IP>:55684, sid=7bcc4f6c bae60adb Sat Sep 17 21:01:51 2005 VERIFY OK: depth=1, /C=RU/ST=MW/L=MOSCOW/O=RadugaVPN/emailAddress=support@telecom-service.net Sat Sep 17 21:01:51 2005 VERIFY OK: nsCertType=SERVER Sat Sep 17 21:01:51 2005 VERIFY OK: depth=0, /C=RU/ST=MW/O=RadugaVPN/CN=RadugaVPN/emailAddress=support@telecom-service.net Sat Sep 17 21:01:55 2005 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key Sat Sep 17 21:01:55 2005 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication Sat Sep 17 21:01:55 2005 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key Sat Sep 17 21:01:55 2005 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication Sat Sep 17 21:01:55 2005 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA Sat Sep 17 21:01:55 2005 [RadugaVPN] Peer Connection Initiated with <SERVER_IP>:55684 Sat Sep 17 21:01:56 2005 SENT CONTROL [RadugaVPN]: 'PUSH_REQUEST' (status=1) Sat Sep 17 21:01:57 2005 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway,dhcp-option DNS <SERVER_IP>, route-gateway <GW_IP>,ping 10, ping-restart 120, route 0.0.0.0 0.0.0.0 <GW_IP>, dhcp-option DNS 82.118.131.162, ifconfig <LOCAL_IP> 255.255.255.0' Sat Sep 17 21:01:57 2005 OPTIONS IMPORT: timers and/or timeouts modified Sat Sep 17 21:01:57 2005 OPTIONS IMPORT: --ifconfig/up options modified Sat Sep 17 21:01:57 2005 OPTIONS IMPORT: route options modified Sat Sep 17 21:01:57 2005 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified Sat Sep 17 21:01:57 2005 TUN/TAP device tap0 opened Sat Sep 17 21:01:57 2005 /sbin/ifconfig tap0 <LOCAL_IP> netmask 255.255.255.0 mtu 1500 broadcast <BROADCAST_IP> Sat Sep 17 21:01:57 2005 /sbin/route add -net <SERVER_IP> netmask 255.255.255.255 gw 212.119.97.85 Sat Sep 17 21:01:57 2005 /sbin/route del -net 0.0.0.0 netmask 0.0.0.0 Sat Sep 17 21:01:57 2005 /sbin/route add -net 0.0.0.0 netmask 0.0.0.0 gw <GW_IP> Sat Sep 17 21:01:57 2005 /sbin/route add -net 0.0.0.0 netmask 0.0.0.0 gw <GW_IP> Sat Sep 17 21:01:57 2005 /sbin/route add -net 0.0.0.0 netmask 0.0.0.0 gw <GW_IP> Sat Sep 17 21:01:57 2005 Initialization Sequence Completed

, где <LOCAL_IP> — IP-адрес, предоставленный Вам провайдером для подключения (если используется фильтрация по IP-адресу), <SERVER_IP> — адрес сервера, к которому осуществляется подключение, <BROADCAST_IP> — IP-адрес широковещательной передачи, <GW_IP> — IP-адрес шлюза.

Таблица маршрутизации после создания VPN-подключения, соответственно, будет выглядеть так:

Kernel IP routing table
DestinationGatewayGenmaskFlagsMetricRefUseIface
<EARTHLINK_GW>0.0.0.0255.255.255.255UH000ppp0
<SATLINK_GW><EARTHLINK_GW>255.255.255.255UGH000ppp0
<LOCAL_DVB_IP>0.0.0.0255.255.255.255UH000dvb0_0
<LOCAL_NET>0.0.0.0<LOCAL_NETMASK>U000eth0
<DVB_NETWORK>0.0.0.0<DVB_NETMASK>U000tap0
127.0.0.0127.0.0.1255.0.0.0UG000lo
0.0.0.0<EARTHLINK_GW>0.0.0.0UG000tap0

, где <EARTHLINK_GW> — шлюз для наземного подключения (в данном случае — ppp0); <SATLINK_GW> — шлюз спутникового подключения; <LOCAL_DVB_IP> — IP-адрес, присвоенный dvb-интерфейсу спутниковой карты; <LOCAL_NET>, <LOCAL_NETMASK> — соответственно, адрес локальной (интранет) сети (если есть) и маска подсети; <DVB_NETWORK>, <DVB_NETMASK> — адрес сети из которой Вам выдаётся IP-адрес при подключении и маска подсети.

Соответственно, ppp0 — интерфейс «наземного» подключения, tap0 — OpenVPN-подключение, dvb0_0 — интерфейс спутниковой карты, eth0 — сетевое подключение к внутренней (интранет) сети (если она, конечно же есть).

Ну чтож, всё, что осталось сделать — это запустить

brat3 root # ping ya.ru PING ya.ru (213.180.204.8) 56(84) bytes of data. 64 bytes from ya.ru (213.180.204.8): icmp_seq=1 ttl=50 time=623 ms 64 bytes from ya.ru (213.180.204.8): icmp_seq=2 ttl=50 time=598 ms 64 bytes from ya.ru (213.180.204.8): icmp_seq=3 ttl=50 time=519 ms

и убедиться, что всё работает… ну или не работает… тогда начинать всё сначала, проверять и перепроверять, тестировать оборудование… да мало ли?

Думаю, что в первую очередь, надо проверять, верно ли настроена филтрация IP-пакетов в спутниковой карте.

3.2 PPP MPPE/MPPC Подключение

Для меня это подключение, увы, оказалось несколько бесполезным: «наземное» подключение осуществляется через CDMA-аппарат Ubiquam-100, а он имеет свойство в моменты «затишья» выключаться. ppp-клиент, обнаружив, что связи нет, обрывает VPN соединение. Как с этим боротся, пока не разобрался. Впрочем, нет худа без добра: теперь могу подключаться к SkyLink со сжатием данных, что очевидно экономит траффик.

Для GPRS/EDGE-подключения MPPE/MPPD-подключение также оказалось бесполезным — нужные порты просто закрыты провайдером (у меня Билайн)

Кроме того, настройка этого подключения под Linux оказалась несколько более хлопотная, чем установка, настройка и подключение через OpenVPN. Ну да ладно, хватит жаловаться на неблагоприятные погодно-материальные условия! Начнём, пожалуй.

Во-первых, понадобится патч для ядра, ppp-клиента и самый ppp-клиент, версии не ниже, чем 2.4.2. Патчи можно взять на сайте MPPE/MPPC kernel module for Linux (бывший www.polbox.com). Ну а что же до ppp-клиента, то его домашний сайт находится там же где и всегда — PPP Web-page

Не забудьте, что версии патчей должны соответствовать версиям ядра и ppp-клиента.

Начнём с ядра. Предположим, что вы распаковали исходный код яра и сделали линк на /usr/src/linux и зали в эту директорию (патч остался в папке /usr/src/linux-2.XX.XX-mppe-mppc-1.X.patch.gz) Набираем команду: gzip -cd linux-2.XX.XX-mppe-mppc-1.X.pathc.gz && patch -p1.

Далее, набираем make mrproper && make menuconfig (ну или, к чему Вы там привыкли?) И находим в разделе «Network device support» «PPP (point-to-point protocol) support» и «Microsoft PPP compression/encryption (MPPC/MPPE)». Отмечаем их для компиляции.

Кроме того, в разделе «Cryptographic API» надо отметить «SHA Digest algorithm» и «ARC4 cipher algorithm»[15]. Сохраняем конфигурацию ядра и пересобираем его.

Теперь очередь pppd. «Раскручиваем» исходный код в какую-нибудь директорию, и накладываем патч: patch -p0 < ppp-2.4.X-mppe-mppc-1.X.patch.gz (patch (1)) и далее делаем всё по инструкции установки: ./configure && make && make install.

Теперь надо настроить конфигурационные файлы ppp. Начнём с файлов авториации: /etc/ppp/chap-secrets. CHAP (Challenge Handshake Authentication Protocol протокол аутентификации с предварительным согласованием вызова) Открываем файл /etc/ppp/chap-secrets и дописываем туда логин/пароль, выданные провайдером для подключения в хорошо знакомом всем формате:

#<login> <server> <password> <IP-Address> mylogin * mypassword *

Далее принимаемся за файл /etc/options.pptp:

# # Lock the port # lock # # Debug option # debug # # We don't need the tunnel server to authenticate itself # noauth # # Turn off transmission protocols we know won't be used # nobsdcomp nodeflate # # # lock # # We want MPPE # mppe required,stateless # # We want a sane mtu/mru # mtu 1000 mru 1000 # # Time this thing out of it goes poof # lcp-echo-failure 10 lcp-echo-interval 10 # Handshake Auth Method +chap : # +mschap-v2

Я пробовал увеличивать значение lcp-echo-failure, но почему-то к толковому результату это не привело. Связь всё равно до обидного быстро обрывалась.

Теперь редактируем файл самого подключения. Обычно эти файлы находятся в директории /etc/ppp/peers. Свой файл назвал Raduga по имени сервиса, к которому подключаюсь.

# # PPTP Tunnel configuration for tunnel 904.d-v.ru # Server IP: 904.d-v.ru # Route: add -host 80.81.208.34/0 gw 10.252.243.159 # # # Tags for CHAP secret selection # name mylogin -pap +chap -mschap -mschap-v2 debug noauth novj nobsdcomp noproxyarp nodeflate silent

Ну вот, пожалуй и всё. Можно набрать pptp-command start Raduga. Опять же, если всё правильно настроено, то вы логе Вы можете увидеть следующие сообщения:

Sep 18 00:24:17 brat3 pppd[1313]: Connect: ppp1 <--> /dev/pts/4 … Sep 18 00:24:58 brat3 pppd[1313]: sent [CHAP Response id=0x65 , na me = "MyLogin"] … Sep 18 00:24:58 brat3 pppd[1313]: rcvd [LCP EchoRep id=0x0 magic=0x39495f17] Sep 18 00:24:58 brat3 pppd[1313]: rcvd [CHAP Success id=0x65 "Access granted"] Sep 18 00:24:58 brat3 pppd[1313]: CHAP authentication succeeded: Access granted Sep 18 00:24:58 brat3 pppd[1313]: sent [CCP ConfReq id=0x1 ] …

Если Вы хотите поподробнее почитать о настройке VPN подключения, то обратитесь к более специальной статье. Например, рекомендую заглянуть в заметку Алекса Зорга «Настройка VPN (использование pptp-client'а)»[16].

Маскарадинг

Iptables

Ну тут всё просто (особенно, если заглянуть в «Masquerading Made Simple HOWTO»:[17]

$> modprobe ipt_MASQUERADE # If this fails, try continuing anyway $> iptables -F; iptables -t nat -F; iptables -t mangle -F $> iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE $> echo 1 > /proc/sys/net/ipv4/ip_forward

или, если Вы используете MPPC/MPPE-подключение:

$> modprobe ipt_MASQUERADE # If this fails, try continuing anyway $> iptables -F; iptables -t nat -F; iptables -t mangle -F $> iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE $> echo 1 > /proc/sys/net/ipv4/ip_forward

Что любопытно, теперь спутниковое подключение к Интернет будет доступно со всех компьютеров Вашей Локальной Сети.

Ipchains

Ой, разберитесь сами, не совсем понимаю, как это работает.

Вашъ CarpenterЪ


Ссылки

[1] Алексей Силяков «DVB-карта SkyStar-1, релиз 1.5. Technotrend. Работа над ошибками.» На мой взгляд, одна из самых подробных и разносторонних статей об этой, несомненно, по сей день популярной DVB-карте.

[2]  Файл Documentation/dvb/faq.txt из пакета документации ядра Linux 2.6.12.2

[3] «Програмное обеспечение под Linux» (обзор)

[4] «Как запустить интернет через DVB-S под Linux 2.4»

[5] Сайт NuclearCat'a

[6] «Digital Video Broadcasting или как заставить работать TechniSat SkyStar-1 под Linux»

[7] Установка спутникового Internet под Linux

[8] Сайт Andrix'а (dvbd, dvbroute)

[9] NuclearCat, s.o.v.a., «Руководство по установке SkyStar2 под Linux 2.4»

[10] Роберто Аркомано, Sat-HOWTO

[11] Denis Kot (DCot), «Настройка выхода в Internet через SkyStar2 (b2c2) под Linux (linux skystar dvb)»

[12] Виталий Прядко, «Установка Skystar-2 на Linux (skystar dvb linux driver)»

[13] «Установка и настройка спутниковой антены»

[14] OpenVPN 2.x HOWTO

[15] MPPE/MPPC kernel module for Linux

[16]  Alex Zorg, «Настройка VPN (использование pptp-client'а)»

[17] John Tapsell, Thomas Spellman, Matthias Grimm, «Masquerading Made Simple HOWTO»


Сноски

1 не стоит путать её, с картой SkyStar 1 CI — это несколько разные вещи, хотя утверждается, что эта карта работает вполне нормально работает с теми же драйверами. Что же до SkyStar 1, то она довольно давно снята с производства, хотя до сих пор свободно продаётся в России и странах СНГ.

Приобрести её можно, например здесь.

2Dont flame me if it does not work for you, destroys your computer or what-not. I take no responsibility. My intention was to modify Carsten's dvbd so that it does not need patching anymore (at least for me). I also added this docs, help for commandline flags acceptable by dvbd, and made a few extensions inside the program - consult the top of dvbd.c file if you are wondering.