Ключевые слова:dvb, linux, (найти похожие документы)
From: Vsevolod Balashov <http://vsevolod.balashov.name>
Date: Mon, 28 Feb 2007 14:31:37 +0000 (UTC)
Subject: Настройка спутникового интернета в linux
Оригинал: http://vsevolod.balashov.name/2007/2/28/dvb-sat-linux
Я живу в крайне тяжелых онлайновых условиях.
О безлимитной выделенке нет и речи. ;) До недавнего времени доступ в
интернет у меня дома был посредством gprs, а с недавних пор к нему
добавилась спутниковая тарелка. В домашнем сетевом хозяйстве раздачей
трафика занимался старый пентиум, тихо жужжащий в углу. Все было
настроено 1 раз и забыто. Но однажды он умер...
Переставив dvb карту в живой компьютер, я внезапно обнаружил
отсутствие бекапа конфигов и большие пробелы в памяти как вообще все
это работает. Пришлось вспоминать. Далее описываю по горячим следам.
Все нижеописанное происходит в ubuntu последней версии. Настрою
соединение через globax без vpn.
Ставлю утилиты работы с dvb картой. У меня, как и у многих skystar2,
но когда нибудь я куплю twinhan ;).
$ sudo aptitude install dvb-utils
Нужно сделать что бы карта не "засыпала". Что это и как - об этом
можно почитать в многочисленных околоспутниковых форумах. Решение
следующее: Добавляем файлик, который грузит модуль карты с параметром,
запрещающим засыпание.
$ cat /etc/modprobe.d/dvb-core
options dvb-core dvb_shutdown_timeout=0
Теперь нужно выгрузить/загрузить этот модуль (и все зависимые от
него). Я просто перезагрузил компьютер.
Качаю дистрибутив (ссылка может устареть) globax for linux,
извлекаю из него исполняемый файл globax. Остальное не требуется.
$ ls /usr/local/sbin/globax
/usr/local/sbin/globax
Конфиг глобакса. Получен мною от провайдера stv.su и используется
практически без изменений.
$ cat /etc/globax.conf
[server]
port = 6768
log = /var/log/globax.log
datatimeout = 60
[remote]
name = globax
server = 195.10.212.10:1111
login = globax_login
passwd = globax_password
speed_in = 320000:384000
speed_out = 3000
mtu = 576
mru = 1500
flush_time = 500
[local]
# http/https proxy
remote = globax
port = 127.0.0.1:3128
service_int = 0
[local]
# socks 4/4a/5 proxy
remote = globax
port = 127.0.0.1:1080
service_int = 2
[local]
# transparent port
# http://faq.spacegate.com.ua/index.php?action=artikel&cat=7&id=97&artlang=ru
remote = globax
port = 127.0.0.1:8000
transparent
Globax в процессе работы пишет логи, и их надо чистить. =) Поскольку
неизвестно, умеет ли он переоткрывать файловый дескриптор по сигналу,
а экспериментировать лень - делаю так же как с рельсами.
$ cat /etc/logrotate.d/globax.logrotate
/var/log/globax.log {
rotate 7
missingok
compress
delaycompress
notifempty
copytruncate
}
Параметры настройки dvb карты на спутник. Они хранятся, как правило, в
файле channels.conf. Для моего провайдера нагуглить их почему то не
получилось. Я долго тупил. Потом понял, что они есть в отладочном
выводе команды szap, которых предостаточно на форумах. Вот сравните:
$ sudo szap -c /etc/channels.conf -n 1 -x
reading channels from file '/etc/channels.conf'
zapping to 1 'stv':
sat 0, frequency = 11595 MHz V, symbolrate 29270000, vpid = 0x1040, apid = 0x1040
using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
status 00 | signal 5353 | snr f8f8 | ber 00000000 | unc 00000000 |
status 1f | signal 4040 | snr 3333 | ber 00000000 | unc 00000042 | FE_HAS_LOCK
И теперь собственно сам файл. Для спутникового интернета важны
частота, поляризация и символьная скорость.
$ cat /etc/channels.conf
stv:11595:v:0:29270:0:0:0
Скрипт, который собирает все это вместе, настраивает dvb карту и
запускает globax.
$ cat /etc/init.d/dbvd
#!/bin/sh
PATH=/usr/sbin:/usr/bin:/sbin:/bin
NAME=`basename $0`
# https://cabinet.stv.su/index.php?m=info
IP="192.168.XXX.XXX"
MAC="00:00:C0:A8:XX:XX"
PID="4160"
# https://cabinet.stv.su/index.php?m=conf
GLOBAX_BIN="/usr/local/sbin/globax"
GLOBAX_CONF="/etc/globax.conf"
CHANNELS_CONF="/etc/channels.conf"
do_szap()
{
szap -c $CHANNELS_CONF -n 1 -x
}
do_ifup()
{
dvbnet -p $PID
ifconfig dvb0_0 $IP
ifconfig dvb0_0 hw ether $MAC
echo 0 > /proc/sys/net/ipv4/conf/dvb0_0/rp_filter
}
do_ifdn()
{
ifconfig dvb0_0 down
dvbnet -d 0
}
do_glup()
{
$GLOBAX_BIN $GLOBAX_CONF
sleep 2
kill `ps ax|grep ${GLOBAX_BIN}|head -n +1|awk '{print $1}'`
}
do_gldn()
{
killall $GLOBAX_BIN
}
case "$1" in
start)
echo "starting $NAME..."
do_szap
do_ifup
do_glup
;;
stop)
echo "stoping $NAME..."
do_gldn
do_ifdn
;;
reload)
do_szap
;;
restart)
do_ifdn
rmmod b2c2_flexcop_pci b2c2_flexcop \
mt352 mt312 bcm3510 stv0299 stv0297 nxt200x lgdt330x \
dvb_pll dvb_core
sleep 2
modprobe b2c2_flexcop_pci
do_szap
do_ifup
;;
*)
echo "usage: $NAME start|stop|reload|restart"
exit 3
;;
esac
exit 0
Устанавливаю его в автозагрузку и запускаю.
$ sudo update-rc.d dvbd start 99 S .
$ sudo invoke-rc.d dvbd start
Нисходящий канал готов. Время настроить программы на использование
http/socks прокси, а неимеющие таких настроек соксифицировать с
помощью, например, tsocks (есть в дистрибутиве).
За рамками рассмотрения остались:
* прокладка тунелля pptp l2tp openvpn или какого другого
* кеширование http трафика squid или oops
* прозрачное проксирование (последняя секция в globax.conf)
* автоматизация поднятия наземного канала diald
И тут выясняется одна неприятная особенность:
Встроенные в globax http/https и socks4a/5 позволяют подключаться к
интернет ресурсам используя доменные имена (то есть не преобразуя их в
IP адреса на локальном компьютере) Но некоторые программы все равно
желают локального разрешения имен. Им нужен локальный доступ к dns
серверу. По медленному и дорогому наземному каналу.
Пару слов об оптимизации наземного канала:
Ставлю локальный кеширующий сервер dnsmasq
$ sudo aptitude install dnsmasq
К идущему в пакете конфигу добавляю 1 строчку:
$ cat /etc/dnsmasq.conf | grep resolv-file
resolv-file=/etc/ppp/resolv.conf
Теперь dnsmasq при отстутствии у себя информации о доменном имени
будет запрашивать один из серверов имен наземного провайдера.
В конфиге дозвона к наземному провайдеру
(/etc/ppp/peers/provider_name) у меня присутствует:
* nodefaultroute
* usepeerdns
Скрипты выполняемые при поднятии и опускании интерфейса я выключил за
ненадобностью.
$ sudo chmod -x /etc/ppp/ip-up.d/*
$ sudo chmod -x /etc/ppp/ip-down.d/*
А потом написал свой, попроще. В нем сохраняю имена dns серверов
провайдера и прописываю маршруты к ним, и к серверу globax.
$ cat /etc/ppp/ip-up.d/0dvb-up
#!/bin/sh
PATH=/usr/sbin:/usr/bin:/sbin:/bin
GLOBAX_IP="195.10.212.10"
route add -host $DNS1 gw $IPREMOTE
route add -host $DNS2 gw $IPREMOTE
echo "#" >/etc/ppp/resolv.conf
echo "nameserver $DNS1" >>/etc/ppp/resolv.conf
echo "nameserver $DNS2" >>/etc/ppp/resolv.conf
killall -sighup dnsmasq
route add -host $GLOBAX_IP gw $IPREMOTE
Последний штрих:
$ cat /etc/resolv.conf
nameserver 127.0.0.1
Эта вся пертушка с up/down скриптами затеяна потому что по умолчанию
они либо переписывают /etc/resolv.conf либо не отдают имена dns
серверов. Подозреваю, есть более элегантное решение ;)
Придумал сейчас как с помощью socat, iptables и какой то матери
натравить dnsmasq через globax на dns сервер спутникового провайдера.
Пойду поиграюсь... =)
UPDATE Отдельные борцы за чистоту терминов оскорбились, что я
клиентскую часть globax обозвал сервером. Исправил. ;)
UPDATE2 Оказывается есть такие особенности как "интерференция" и
"залипание". Если кто с ними сталкивался, пожалуйста опишите как они
выглядят и, по возможности, как с ними бороться. А то мне как то
везет. Или не везет. ;) Спасибо. :)
UPDATE2.1 Немного дороботал скрипт /etc/init.d/dvbd по идее теперь
если его запускать с параметром reload то это должно быть борьбой с
интерференцией. А с параметром restart - борьба с залипанием.
Пресловутыми "интреференцией" и "залипанием".
А вот скрипт, для автоматизации проверок, путем вызова из crontab
$ cat /usr/local/sbin/dvb-check
#!/bin/sh
# если статус карты не 1f значит она не залочена.
if [ '1f' != `femon | head -3 | tail -1 | awk '{print $2}'` ]; then
invoke-rc.d dvbd reload
else
#если карта залочена, а нету пидов с трафиком значит она повисла.
if [ '10' != `dvbtraffic | head -10 | wc -l` ]; then
invoke-rc.d dvbd restart
fi
fi
Славно! И для Убунту подойдет... Странно, у меня в modprobe.d указано, чтобы карта не засыпала, а не работает. Какая может быть причина? 7.10 Убунту GNU/Линукс