iptables restrict access based on time

понеделник, септември 28th, 2009

Като съм започнал с howto like статиите, нека да напиша подобна и за едно от другите неща, които ми се наложи да правя експресно напоследък. А именно ограничаване на достъпа до дадена услуга базирано на времето (час, ден, седмица, месец…). Начини да се направи това има доста, но аз се спрях на този с iptables.
Time модула, обаче не се поддържа по подразбиране и е необходимо пачване на iptables и ядрото с patch-o-matic. Това всъщност не е точно така, посредством xtables в по-новите версии на ядрото и iptables поддръжката на time модула (а и не само) е налична. Но CentOS 5 ползва ядро 2.6.18 и iptables 1.3.5, така че са необходими някои промени. И така ето и основните стъпки, по които трябва да преминем ако имаме желание да филтрираме достъп на базата на времето.

  • Инсталираме някои нужни пакети ако не са налични:
yum install kernel-devel kernel-headers iptables-devel ncurses ncurses-devel rpm-build redhat-rpm-config
  • Сваляме и инсталираме src rpm пакетите на ядрото и iptables:
cd /usr/local/src/
wget http://ftp.iasi.roedu.net/mirrors/centos.org/5.3/updates/SRPMS/kernel-2.6.18-128.7.1.el5.src.rpm
wget http://centos.nano-box.net/5.3/os/SRPMS/iptables-1.3.5-4.el5.src.rpm
rpm -ivh kernel-2.6.18-128.7.1.el5.src.rpm
rpm -ivh iptables-1.3.5-4.el5.src.rpm
  • Билдваме модифицирания код на ядрото.
cd /usr/src/redhat/SPECS
rpmbuild -bp --target=$(arch) kernel-2.6.spec
rpmbuild -bp iptables.spec
  • Коригираме Makefile.
cd /usr/src/redhatBUILD/kernel-2.6.18/linux-2.6.18.x86_64/
vim Makefile

където променяме

EXTRAVERSION = -prep
EXTRAVERSION = -128.7.1.el5
  • Сваляме и разархивираме patch-o-matic
cd /usr/local/src/
wget http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20090909.tar.bz2
tar -jxvf patch-o-matic-ng-20090909.tar.bz2
  • Стартираме patch-o-matic и пачваме ядрото
export KERNEL_DIR=/usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/
export IPTABLES_DIR=/usr/src/redhat/BUILD/iptables-1.3.5/
./runme --download
./runme time
  • Прекомпилираме ядрото като използваме стария .config
cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/
cp /boot/config-2.6.18-128.7.1.el5 .config
make menuconfig
Избираме Networking –> Networking Options –> Network packet filtering (replaces ipchains) –>  IP: Netfilter configuration, и маркираме Time match support, след което запазваме конфигурацията.
  • Компилираме и инсталираме модула
make modules_prepare
 make M=net/ipv4/netfilter
 strip --strip-debug net/ipv4/netfilter/ipt_time.ko
 cp net/ipv4/netfilter/ipt_time.ko /lib/modules/2.6.18-128.7.1.el5/kernel/net/ipv4/netfilter/
 chmod a+x /lib/modules/2.6.18-128.7.1.el5/kernel/net/ipv4/netfilter/ipt_time.ko
 depmod 2.6.18-128.7.1.el5
  • Компилираме и инсталираме iptables
cd /usr/src/redhat/BUILD/iptables-1.3.5/
make install  KERNEL_DIR=/usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64 BINDIR=/sbin LIBDIR=/lib64 MANDIR=/usr/share/man install
  • Зареждаме модула
modprobe ipt_time
  • Прилагаме правила по следния синтаксис:
iptables RULE -m time --timestart TIME --timestop TIME --days DAYS -j ACTION

където:

--timestart TIME : Time start value . Format is 00:00-23:59 (24 hours format)

--timestop TIME :  Time stop value.

--days DAYS :    Match only if today is one of the given days. (format: Mon,Tue,Wed,Thu,Fri,Sat,Sun ; default everyday)

Допълнителна информация:

http://linux.lcpe.uni-sofia.bg/manuals/openintegra/xfs/RHEL_xfs_RPM.html
http://wiki.centos.org/HowTos/BuildingKernelModules
http://www.cyberciti.biz/tips/iptables-for-restricting-access-by-time-of-day.html
http://www.iptables.org/documentation/HOWTO/netfilter-extensions-HOWTO-2.html

Osprey 230 Linux Driver Sound Patch

четвъртък, септември 24th, 2009

Реших да драсна няколко реда относно този проблем, защото информацията в нета е доста оскъдна. Накратко, capture картите на Osprey от серия 230 (и не само те), но в моя случай ставаше дума за такава имат проблем със звука. Те варират от пълната му липса до едно дразнещо бучене, макар и да се чува някакво подобие на звук. По-често срещаният проблем е вторият и причината всъщност е във високият gain. Из мейлинг листите има доста въпроси относно този проблем, но малка част от тях водят до някакво решение.

До ядро 2.6.9 Viewcast са имали собствени драйвери за Linux за своите карти, но в последствие тяхната разработка е била прехвърлена на общността и в частност на хората зад v4l/dvb. Драйверите за v4l поначало са част от linux ядрото. В ядрото идващо с CentOS 5.2, а именно 2.6.18 нужните драйвери за разпознаване и работа на Osprey картите са налице. Това са bttv за video и snd_bt87x за звука. И докато видеото може да се каже че е с перфектно качество, то както вече стана дума не можем да кажем това и за звука. При малко по-усилено търсене могат да се намерят едни стари пачове от 2006-та година, които са решавали проблема посредством btaudio, но на мен те не ми свършиха работа. Patch-ът, който всъщност работи, може да бъде намерен ето тук . (Понеже той не може да бъде видян без регистрация за v4l mail листата, то ще направя и local mirror).

И така, ако в dmesg, или /var/log/messages виждаме нещо подобно:

bttv: driver version 0.9.18 loaded
bttv: using 8 buffers with 2080k (520 pages) each for capture
bttv: Bt8xx card found (0).
bttv0: Bt878 (rev 17) at 0000:0b:04.0, irq: 19, latency: 132, mmio: 0xd8000000
bttv0: detected: Osprey-200 [card=88], PCI subsystem ID is 0070:ff01
bttv0: using: Osprey 200/250 [card=88,autodetected]
bttv0: gpio: en=00000000, out=00000000 in=00ffffff [init]
bttv0: osprey eeprom: card=89 'Osprey 210/220/230' serial=5436547
bttv0: osprey eeprom: Changing card type from 88 to 89
bttv0: tuner absent
bttv0: registered device video0
bttv0: registered device vbi0

то картата ни е разпозната, модулът е зареден и можем да я ползваме по предназначение (засега без звук).

Ето и основните стъпки, по които да се ръководи човек сблъскал се с подобен род проблем, като те като цяло са малко redhat specific, но не би трябвало да бъде проблем да се ползват и за други дистрибуции.

  • Сваляваме osprey-snd-patch.
cd /usr/src/
wget http://just4nick.net/blog/wp-content/uploads/2009/09/osprey-snd.patch
  • Сваляме сорс кода на v4l-dvb и го разархивираме.
wget http://linuxtv.org/hg/~tap/bttv/archive/tip.tar.gz
tar -zxvf bttv-35ddb77b68f8.tar.gz
mv bttv-35ddb77b68f8 v4l-dvb
  • Прилагаме patch-a.
patch --dry-run -p1 -d v4l-dvb < osprey-snd.patch

Както се вижда и от самия код ползваме опцията на patch за суха тренировка –dry-run. Така се предпазваме от грешки. Ако всичко е наред, би трябвало да видим нещо от този род:

patching file linux/drivers/media/video/bt8xx/bttv-if.c
patching file linux/drivers/media/video/bt8xx/bttv.h
Hunk #1 succeeded at 302 (offset 1 line).
patching file linux/sound/pci/bt87x.c
Hunk #7 succeeded at 437 (offset 2 lines).
Hunk #9 succeeded at 778 (offset 2 lines).
Hunk #11 succeeded at 984 (offset 2 lines).
Hunk #12 succeeded at 1084 (offset 2 lines).
Hunk #13 succeeded at 1109 (offset 2 lines).

След което можем да пристъпим към същинското прилагане на patch-а с командата:

patch -p1 -d v4l-dvb < osprey-snd.patch
  • Инсталираме kernel-devel, kernel-headers, redhat-rpm-config, rpm-build.
yum -y install kernel-devel kernel-headers redhat-rpm-config rpm-build
  • Сваляме и инсталираме src rpm-a на ядрото.
cd /usr/local/src/
wget ftp://mirror.switch.ch/pool/3/mirror/centos/5.3/updates/SRPMS/kernel-2.6.18-128.4.1.el5.src.rpm
rpm -ivh kernel-2.6.18-128.4.1.el5.src.rpm
  • Билдваме модифицирания код на ядрото.
cd /usr/src/redhat/SPECS
rpmbuild -bp --target=$(arch) kernel-2.6.spec
  • Коригираме Makefile.
cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/
vim Makefile

където променяме

EXTRAVERSION = -prep

EXTRAVERSION = -128.4.1.el5
  • Компилираме и инсталираме driver-ите.
cp configs/kernel-2.6.18-x86_64.config .config
make modules_prepare
cd /usr/src/v4l-dvb
make all
make install
make sound-install

Ако всичко мине успешно, то при изпълняването на

ls -la /lib/modules/2.6.18-128.4.1.el5/kernel/sound/pci/snd-bt87x.ko

би трябвало да видим, че модула е налице и е с текуща дата и час.

  • Зареждаме модула.
rmmod snd_bt87x
modprobe snd_bt87x

След което би трябвало да е възможно да коригираме sound capture посресдством alsamixer и да имаме нормално работещ звук.

Допълнителна информация:

http://linux.lcpe.uni-sofia.bg/manuals/openintegra/xfs/RHEL_xfs_RPM.html
http://wiki.centos.org/HowTos/BuildingKernelModules
http://www.google.bg/#hl=bg&q=linux+audio+problem+Osprey+230&meta=&fp=e366587b524c8386

that was yesterday…

сряда, юни 24th, 2009

10.00 a.m. – няма ток в collocation центъра

16.00 p.m. – dmesg | grep sda:

ReiserFS: sda1: warning: vs-13060: reiserfs_update_sd: stat data of object [91527 91528 0x0 SD] (nlink == 1) not found (pos 1) – (очертава се денят да е дълъг)

17.00 p.m.:

umount /dev/sda1
reiserfsck –check /dev/sda1

Checking internal tree..finished
Comparing bitmaps..finished
Fatal corruptions were found, Semantic pass skipped
1 found corruptions
###########

17.30 p.m.:

reiserfsck –scan-whole-partition –rebuild-tree /dev/sda1 – и стискам палци

17.30 – 23:00 p.m.

три бири в приятна компания :)

едно уиски докато чакам да минем от 80% на 100%

23;10 p.m.

###########
reiserfsck finished at Tue Jun 23 23:09:32 2009
###########

23:15 p.m.:

yum upgrade

00:30 p.m. – welcome to the machine :)


Преглед на „печата“ в телеграфен стил

вторник, май 19th, 2009

Какво ново при мен през последните 20-на дни, в които не съм се обаждал.

Доста работа, от което всъщност не се оплаквам. Обичам си работата, а когато правиш нови и интересни неща, времето минава неусетно. Когато не се получават както се очаква е малко неприятно (така се случва в последните 2 дни), главно заради недоглеждане от моя страна, но вече нещата се нареждат.

Единствения проблем е, че една машина има някакви хардуерни затруднения, които не мога да диагностицирам и се налага да я спра за да се опитам да разбера какво я мъчи. Проблемът е, че работи 24/7. В тази връзка си търся 2х1GB DDR 400 PC3200 или 2х512 на същата честота. Ако някой има, да се обади, черпя бири :)

Communicator-а ми се бъгна и се наложи да мигрирам към Blackberry, което има нестандартна qwerty клавиатура, която все още не мога да свикна.

Возих се няколко пъти на широкорекламираното разширение на първи метродиаметър. Като го удължат до Сердика, вероятно ще го ползвам по-постоянно. Сега ми се налага преход от 2.3 км. В това разбира се няма нищо лошо, особено с това хубаво време навън разхождането по Граф Игнатиев е повече от приятно (мъжката част от читателите ми, ще ме разбере).

Два от футболните отбори, на които симпатизирам (в случая чуждестранните) станаха шампиони на страните си и дори ще се срещнат в Рим в битка за Купата на Европейските Шампиони, известна след ’92 повече като Шампионска лига (името не е много правилно, но…от догодина ще има нови правила). Това ме изправя пред проблема, за кой от двата тима да викам на финала. Затова реших да се насладя изцяло на шоуто, и нека по-добрият победи (малко клиширано, но…). Само едно леко условие имам. Ако Барселона победи, то Бербатов да вкара гол за Юнайтед. Дано това накара малоумните английски журналя да спрат да го оплюват толкова нагло.

На няколко пъти споменавах за дипломната работа. В края на миналата година дадох на пауза, защото така или иначе разбрах, че не мога да запиша магистратура през февруари. Сега вече я завърших, дори си спретнах и скромна презентация от 25 слайда. Надявам се другата седмица да я предам, и до края на юни да приключа с този належащ и дълго протакан въпрос.

Догледах и Prison Break. Разгеле, че свърши, това всъщност трябваше да стане още след края на първи сезон, с малки уговорки може и втори. Но се подведоха по високия рейтинг и разводниха хубавата идея. Той именно затова беше висок, защото беше нещо различно. Лошото е, че интересните сериали взеха да приключват. Гледах и пилотната серия на Caprica, fork-a на Battlestar Galactica. За актьорите не искам да говоря. Ще ги видим натам, евентуално 2010. Според мен има потенциал, но изглежда, че ще има предимно тостери, хубавите силонки са кът нещо.Трябва да отида да гледам Star Trek – 80% от гледалите го са доволни. Аз така или иначе щях да ида всъщност.

И на края, малко странно, но напоследък не слушам рок, особено следобедно време. Залагам на включен климатик и chill out, като мога да спомена един артист. Нещо негово може да се чуе тук.

Patch and recompile source rpm

четвъртък, април 30th, 2009

Както обикновено когато е последен работен ден изникват странни проблеми. Днес попаднах на интересен client/server side bug, който се наложи да оправям. Оказа се, че в PureFTPd има проблем засягащ timestamp на файлове. При upload на файл timestamp-а локално и този на сървъра се различават с по няколко часа, в зависимост от часовата зона, като за нашата часовете са 2. Това е когато се използва preserve timestamp опцията от страна на клиента, и е доста неудобно при синхронизация на файлове. За щастие проблема се оказа елементарен за решаване – описано е как да стане тук. Аз обаче нямах време да чакам bugfix от upstream-a и взех нещата в свои ръце. Реших да прекомпилирам source rpm и по-надолу ще опиша как точно може да се направи това.

  • Като за начало имаме нужда от rpm-build, така че ако го няма, се налага да го инсталираме :
yum -y install rpm-build
  • Намираме и инсталираме src rpm-а. В моя случай той е ето тук.
rpm -ivh pure-ftpd-1.0.21-15.el5.src.rpm
  • Отиваме в specs директорията:
cd /usr/src/redhat/SPECS/
  • Където подготвяме source за компилиране, като го разархивираме и apply-ваме вече дефинираните patch-ове
rpmbuild -bp pure-ftpd.spec

#Възможно е да има проблеми със зависимости, като естествено трябва да инсталираме посочените пакети, ако има такава необходимост

  • Отиваме в /usr/src/redhat/BUILD където би трябвало да има директория от рода pure-ftpd-1.0.21. Правиме й backup, който ще ползваме при генериране на patch-a в последствие.
cd /usr/src/redhat/BUILD

cp -r pure-ftpd-1.0.21 pure-ftpd-1.0.21.orig

Промяната, която трябва да направим е да заменим "mktime()" с "timegm()" във файла ftpd.c. И така с любимия файлов редактор vim, правим нужната промяна във файла /usr/src/redhat/BUILD/pure-ftpd-1.0.21/src/ftpd.c

  • Генерираме patch-a
diff -Naur pure-ftpd-1.0.21.orig/src/ftpd.c pure-ftpd-1.0.21/src/ftpd.c > ../SOURCES/pure-ftpd-1.0.21-utime.patch

като той трябва да съдържа нещо от рода:

1
2
3
4
5
6
7
8
9
10
11
--- pure-ftpd-1.0.21.orig/src/ftpd.c    2009-04-30 13:39:37.000000000 +0300
+++ pure-ftpd-1.0.21/src/ftpd.c 2009-04-30 13:40:55.000000000 +0300
@@ -2541,7 +2541,7 @@
tm.tm_mon--;
tm.tm_year -= 1900;
if (tm.tm_mon < 0 || tm.tm_year <= 0 ||
-       (ts = mktime(&tm)) == (time_t) -1) {
+       (ts = timegm(&tm)) == (time_t) -1) {
addreply_noformat(501, MSG_TIMESTAMP_FAILURE);
return;
}
  • Редактираме spec файла /usr/src/redhat/SPECS/pure-ftpd.spec като правим следните промени
Release:    15%{?dist}

на

Release:    15%{?dist}.1
  • Добавяме ред, в който описваме направения patch
Patch3:     pure-ftpd-1.0.21-utime.patch
  • в %prep секцията, добавяме следния ред, след другите patch-ове
%patch3 -p1 -b .utime
  • в %changelog секцията описваме направената промяна
1
2
* Thu Apr 30 2009 package maintainer <mail> - 1.0.21-15.1
- patch pure-ftpd "SITE UTIME" bug</mail>
  • остава да прекомпилираме пакета
rpmbuild -ba pure-ftpd.spec
  • Ако всичко мине гладко, готовият RPM трябва да се намира в /usr/src/redhat/RPMS/$arch/ и можем да пристъпим към update/инсталация на готовия пакет.

Още информация:

http://docs.fedoraproject.org/drafts/rpm-guide-en/ch-rpmbuild.html

http://linux.die.net/man/8/rpmbuild

Допълнение:

Настройка на winscp за Daylight saving time (DST) - http://winscp.net/eng/docs/ui_login_environment#daylight_saving_time

Stop ACTA