Skip to content

By Тодор in FreeBSD, Linux, Solaris

Да изпратим писмо с прикачени файлове в bash.
Удобно и лесно това става с меил-клиента mutt:
# echo "Body" | mutt -s "Subject" -a file1 -a file2 user@domain.tld

Tags: , , , , , ,

By Тодор in FreeBSD, Linux, Solaris

Най-сигурният начин за изпращане на поща от какъвто и да е сървър е препращането на писмата към пощенски сървър, който отговаря на всички стандарти, така че кореспонденцията идваща от него да не се счита за спам и да не бъде филтрирана.
Ще дам пример как sendmail ще “релейва” през пощенските сървъри на Гугъл. Това означава, че задължително трябва да имаме активен пощенски акаунт в gmail.com.

В /etc/mail/sendmail.mc намираме следният ред:
dnl define(`SMART_HOST', `smtp.your.provider')dnl
и го корегираме на:
define(`SMART_HOST', `smtp.gmail.com')dnl

Следва компилация на направените промени:
# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
(Необходимо е пакета sendmail-cf да бъде инсталиран)

В /etc/mail/access добавяме реда с данните за аутентикация:
AuthInfo:smtp.gmail.com "U:username@gmail.com" "P:password" "M:PLAIN"

Следва отново “компилация” на направената промяна:
# makemap hash /etc/mail/access < /etc/mail/access

Всички домейни писмата, до които не трябва да се изпращат към smart host-а се описват в /etc/mail/local-host-names по един на ред:

loclahost
localhost.localdomain
hostmaster.kamenitza.org

Така ще избегнете всички писма генерирани от локалните демони да излизат в Интернет.

И рестартиране на sendmail:
# /etc/init.d/sendmail restart

Не забравяйте да настроите sendmail да се стартира автоматично с операционната система:
# chkconfig sendmail on

Туй то :)

Tags: , , , , ,

By Тодор in Мрън-мрън

И все пак личната собственост не е неприкосновена…
Ей така си заварих колата тази сутрин.


Мамка му!

By Тодор in Linux

За да сме сигурни, че няма да загубим някаква информация обикновено я архивираме, нали? Веднъж месечно, веднъж седмично, веднъж дневно? Ами ако ни е необходимо по-често архивиране, на ресурс, който постоянно се актуализира, като база данни например? Някои сървъри за бази данни (като mysql) осигуряват собствено репликиране върху отдалечен сървър.

Нещо по-добро е репликирането на цяла файлова система на блоково ниво. Всяка една промяна върху диска се репликира моментално каквато и да е тя – и то без софтуерът, който ползва тази файлова система да разбере.

Удобен начин да се направи това в линукс е чрез DRBD. Тъй като репликацията е на много ниско ниво, не можем да репликираме отделни директории или файлове – работим с цели дискове или дялове (партишъни). Тъй като не всеки разполага със свободен диск/дял, който да ползва за репликацията, ще дам пример с “изкуствен” диск, създаден във файл върху текущата файлова система (loopback image). Т.е. правим един файл с размер 1GB, присъединяваме го като виртуален локален диск, правим му файлова система по желание и вече е в бизнеса ;)

Създаваме файл с размер 1GB (на двата сървъра между, които ще репликираме):
# dd if=/dev/zero of=/root/disk.img bs=1M count=1024

Сега да го прилепим към локално устройство /dev/loop0:
# losetup /dev/loop0 /root/disk.img

Това до тук ще работи, но докато не рестартираме машината. За тази цел правим един init-скрипт, който да върши тази работа при стартиране на операционната система:

#!/bin/bash
# lofsd:         Loopback filesystem
#
# chkconfig:    - 10 80
# description:  Creates loopback device
DRBD_SRC="/root/disk.img"
DRBD_DEVICE="/dev/loop0"
LOSETUP_CMD="/sbin/losetup"
RETVAL=0
start() {
        echo "Connecting loop devices $DRBD_DEVICE"
        $LOSETUP_CMD $DRBD_DEVICE $DRBD_SRC
        RETVAL=$?
        return $RETVAL
}
stop() {
        echo "Releasing loop devices $DRBD_DEVICE"
        $LOSETUP_CMD -d $DRBD_DEVICE
        RETVAL=$?
        return $RETVAL
}
restart() {
    stop
    sleep 1
    start
}
case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        restart
    ;;
        *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac
exit $?
exit $RETVAL

Записваме го под името /etc/init.d/lofsd. След това го правим изпълним:
# chkmod +x /etc/init.d/lofsd

Регистрираме скрипта като системна услуга и го активираме:

# chkconfig --add lofsd
# chkconfig lofsd on

До тук вече имаме един локален виртуален диск на /dev/loop0 и нищо повече. Сега е ред да инсталираме и самото DRBD:
# yum -y install drbd kmod-drbd

Конфигурационният му файл /etc/drbd.conf, е съвсем празен веднага след инсталацията, но има много добре коментиран примерен такъв в /usr/share/doc/drbd. Набързо спретвам следната конфигурация, която изглежда сложна само на пръв поглед (еднаква е и за двата сървъра):

global { usage-count no; }
resource repdata {
    protocol C;
    startup { wfc-timeout 0; degr-wfc-timeout     120; }
    disk { on-io-error detach; }
    net {  cram-hmac-alg "sha1"; shared-secret "ie74t6384"; }
    syncer { rate 10M; }
    on n1.kamenitza.org {
        device /dev/drbd0;
        disk /dev/loop0;
        address 10.0.0.1:7788;
        meta-disk internal;
    }
    on n2.kamenitza.org {
        device /dev/drbd0;
        disk /dev/loop0;
        address 10.0.0.2:7788;
        meta-disk internal;
    }
}

Няма да коментирам кой ред какво върши – вероятно само очевидните неща като, пътища до устройства и адреси ще трябва да редактирате – останалото е почти универсално. Все пак, ако се интересувате – разгледайте примерният drbd.conf, който е изключително добре коментиран. Когато приключите с конфигурацията – копирайте я и на вторият сървър.

Време е да инициализираме мета-данните (и на двата сървъра):

# drbdadm create-md repdata
v08 Magic number not found
v07 Magic number not found
v07 Magic number not found
v08 Magic number not found
Writing meta data...
initialising activity log
NOT initialized bitmap
New drbd meta data block sucessfully created.

Сигурно веднага ще опитате да стартирате услугата, но може да ударите стена:

# /etc/init.d/drbd start
Restarting all DRBD resourcesNo response from the DRBD driver! Is the module loaded?
Command '/sbin/drbdsetup /dev/drbd0 down' terminated with exit code 20
command exited with code 20
ERROR: Module drbd does not exist in /proc/modules

Ами това помага :) :
# modprobe drbd

След като сте стартирали сървиса (и на двата сървъра), можете да наблюдавате статуса на дисковия ресурс ето така:

# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03            11:30:17
 0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 oos:1048508

Ако някой забелязва – и двете копия са вторични (secondary). Такива ще си останат, докато ние не изберем, кой да е водещият сървър и в неговия шел пуснем ето това:
# drbdadm -- --overwrite-data-of-peer primary repdata

Я да видим статуса:

# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03            11:30:17
 0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
    ns:16932 nr:0 dw:0 dr:19168 al:0 bm:1 lo:0 pe:4 ua:70 ap:0 oos:1031676
        [>....................] sync'ed:  2.0% (1031676/1048508)K
        finish: 0:00:59 speed: 16,832 (16,832) K/sec

Сякаш работи и вече тече репликация, а? :)
Остана да направим една файлова система на DRBD диска:
# mkfs -t ext3 /dev/drbd0

И да го монтираме (създайте директорията /mnt/disk и на двата сървъра, но го монтирайте само на първия):
mount /dev/drbd0 /mnt/disk

След приключване на репликацията, нещата изглеждат горе долу така:

# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17
 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r---
    ns:56 nr:1412 dw:1468 dr:21 al:2 bm:3 lo:0 pe:0 ua:0 ap:0 oos:0

Ами можем вече да го изпробваме. Копирайте някакви файлове на диска преди това.
Ръчно размонтираме и правим вторичен първият сървър (n1):
# umount /mnt/disk ; drbdadm secondary repdata

Сега отиваме на втория (n2) и правим следното:
# drbdadm primary repdata ; mount /dev/drbd0 /mnt/disk

И трябва да виждаме същите файлове, които преди това копирахме от сървър n1.

За да си улесним живота в бъдеще можем да редактираме и /etc/fstab, който до момента изглежда горе-долу така:

LABEL=/                 /                       ext3    defaults        1 1
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
LABEL=SWAP-sda2         swap                    swap    defaults        0 0

Добавяме следният ред най-долу:

/dev/drbd0              /mnt/disk               ext3    noauto          0 0

Така, че файлът да придобие този вид:

LABEL=/                 /                       ext3    defaults        1 1
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
LABEL=SWAP-sda2         swap                    swap    defaults        0 0
/dev/drbd0              /mnt/disk               ext3    noauto          0 0

Цялата тази глезотия става изключително полезна, когато се съвмести с Heartbeat. Тогава в /etc/ha.d/haresources добавяме следният ред:

n1.kamenitza.org   drbddisk::repdata Filesystem::/dev/drbd0::/mnt/disk::ext3::rw

Ще се радвам, ако някой успее да приложи това някъде и сподели коментари ;)

Tags: , , , , ,

By Тодор in Linux

Неизвестна грешка…
Никаква представа нямам какво я поражда – появява се когато си поиска при задаване на правила в iptables.
Ядрото е:
Linux xxx 2.6.18-274.7.1.el5 #1 SMP Thu Oct 20 16:21:01 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
Реших проблема като разреших centos-plus хранилището на yum:
/etc/yum.repos.d/CentOS-Base.repo:

[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

И актуализирах ядрото с
yum upgrade

Към явно по-прилична компилация:
Linux xxx 2.6.18-274.7.1.el5.centos.plus #1 SMP Thu Oct 20 19:28:06 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux

Проблема повече не се е появявал :)

Tags: , , ,

By Тодор in FreeBSD, Linux, Solaris

Имам предвид трансферирането на RRD базите данни от 64 битова платформа на 32 битова. Да, това не става просто с копиране на самите RRD файлове – те са различни в зависимост от това на каква платформа са създадени за по-добра оптимизация и бързодействие.

При просто копиране на файловете ще получаваме грешки от сорта на:
rrd_graph() ERROR: This RRD was created on another architecture

Най-доброто, което може да се направи е базите данни да се експортират в XML формат, след това тези XML файлове да се копират и да се конвертират обратно в RRD.

Експортиране в XML:
for i in `find -name "*.rrd"`; do rrdtool dump $i > $i.xml; done

Конвертиране обратно в RRD:
for i in `find -name "*.xml"`; do rrdtool restore $i `echo $i | sed s/.xml//g`; done

Енжой ;)

Tags: , , , ,

By Тодор in FreeBSD, Linux

Целта е да се изконфигурира прокси, което да допуска всеки “регистриран” клиент – такъв с име и парола.

Squid поддържа много методи за уторизация на потребители, но най-лесен ми се струва NCSA. Ще дам пример със squid на CentOS 5.6 64bit.

Създаваме файла с потребителските имена и пароли:
# htpasswd -c /etc/squid/passwd user
Само ще попита за парола.

Модула ncsa_auth обикновено е инсталиран заедно със squid. Можете да проверите ето така:
# rpm -ql squid | grep ncsa_auth

Следните няколко реда се добавят в squid.conf:

auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Please authenticate!
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

Без ACL запис няма да минем естествено :)

acl ncsa_users proxy_auth REQUIRED
http_access allow ncsa_users

Необходим е рестарт на squid.

By Тодор in Фун

Средното си образование изкарах в тогавашното ТМТ – Пазарджик, специалност електрообзавеждане на промишлени предприятия (ЕОПП). В 3-ти и 4-ти курс имахме часове при г-н Г. Гацев, който още е ярък спомен в съзнанието на всички ни. Не само с наученото в часовете при него, ами и с всичко преживяно. Меко казано е, че той беше голям чешит. Та в часовете при него си водех дневник с по-интересни фрази и на гърба на тетрадките си. Скоро попаднах на това и отново се смях доста. Ето и препис от почти всичко. Посмейте се.
Повечето ни часове бяха в електрическата лаборатория – стая напълно електро-обезопасена – дебел гумен балатум (2см), радиаторите, тръбите и всички метални хави бяха заградени с дървени решетки, влизаше се със специални „електроизолационни“ пантофи, за които събрахме по 11лв в началото на годината… другото си го представете.
(правописът следва интонацията и произношението)

(кара се на Ицо)
А уе м’че, не приказвай кат’ вятърна мелница !

(обяснява, че директорката иска да носим ръкавици по време на работа, за да не ни удари ток)
А… „изгъзици“, дет` му викате виъ…

(разяснява охрана на труда и първа помощ)
Ако… нали… са узувеш под напрежение…..

(разказва как някакъв ученик навремето изпитвал трансформатор)
Добре, че тогава камъните бяха меки и ни гу утрепа токъ…

(обяснява как да си правим протоколите)
Не бъди бълък!

(и на контролното упражнение който не е учил…)
Ша стани тчва детч ни са-а случвало…

(обяснява как се влиза в Енерго-то)
Тряа да има стратегия и тактика в тоя живот.

(показва ни една изпитваща програмка на Правец-осмаците)
Е т’ва тука, е машинка за писане на двойки !

(обяснява какво става с ученик (който е преписал) на изпит когато учителя пита)
„Защо?“ – и той умира прав

(говори за един от нашия клас, който отиде до ксерокса да снима)
Тя… Томата си знае работата…

(домашна работа)
На лис’ голям формат – устно…

(говори за тия от трети курс)
Въртят са кат’ индянци пред компютър…

(оформяне на срочните оценки)
Срока свършва ‘неска, утре започва на ново.

(става въпрос за Томата, когато беше болен)
Трудолюбив, ама изпуснал влака.

(три пъти му заби компютъра (осмака, който е поправял поне 60 пъти сам))
(мърмори си)
Толко са ми силите… или акъла… не знам…

(пак обяснява какво е на изпит)
‘Секи си гледа гъзъ до стената и не го интересува…

(девизът)
Работата по спасяване на давещия се е работа предимно на ръцете на самия давещ се.

(обяснява, че ако не учиш…)
Недей чакай да падне тавана! Киното е лятно.

(дава допълнителна (трудна) задача за домашна)
Внимание!!! – Задачата е орех.

(обяснява една схема)
Ако… ммм… и сега ! ммм…

(говори за Топалов, щото нали не учел, но пак минал)
Пие бира, плаща лимонада.

(Томата идва и вика „Ма той Топалов не носи ‘серокопията“)
Ша му спукам гьона!

(защо техниката е стара и потрошена)
Работата е държавна!
Организацията е българска.

(когато искаш да имаш по-висока оценка)
Ааа… Играта е „ти гониш !“

(защо тия, които са учили имат тройки, а Топалов, койъо не учи – също)
Даа… той Топалов прави инфлация на оценките… начи… ша дигнем ‘сички останали уценки с една единица.

(редовния мохабет когато си пропуснал нещо в протокола)
Ууубаче…

(излиза директорката от стаята и той са развиква)
Събрани сте повече народ за по-евтино!

(как се влиза в Енергото)
Тактиката печели битката, а стратегията войната!

(говори за наща група след контролното (имахме хубави оценки))
Хмм… групата има смисъл!

(някои не може да си направи задачата)
Тя… работата е мозъчна!

(пак)
Плуване се учи с плуване.

(говори за преговор)
Ако са задълбаеме в теорията по машини…

(началото на втория срок. пише двойка на Ицо)
Аз така… да та свикна, че сме след ваканция.

(разказва за някакъв ученик, който не учел)
Ай да видим дали ша остане на изпит!
ОПАААА! – Изпит.

(директорката отново му плямпа за ръкавици, но той вади едно ръководство поне 500 стр. и вика „Е тва е правилника – покажи ми къде пише нещо за ръкавици!“, директорката излиза след малко, той ни гледа и се хили)
Е т’ва е удар под… ребрата.

(нали техниката е стара и счупена…)
Аз съм длъжен да направя от нищо нещо.

(Гацев светка директорката по някав въпрос)
Директорката: „А-а-ами… ?!“
Гацев: „… ти командваш парада !“

(някой дето учи, ама не редовно)
То… тя… кокошката зела да мъти яйца, ама… не ги доизмътила.

(говори за Томата, който имаше няколко двойки)
Той тря’а да изкара поне две тройки… и едното да е четири !

(сочи на дъската)
Пиши заглавието – отзад на пред !

(иска да каже „трябва да си по-нисък от тревата“, нали, ако не си си научил урока)
Тря’а да си по-нисък от… ко беше там…

(диктува ни след упражнение на края на часа)
Пиши!
„Ако се появя по лаборатория без протокол – ще ме блъсне влак!“

(започва да диктува)
Хмм… Пиши!
Хмм… не, то’о волтметър не му е мястото тука…
Пиши!
И сега… ако латера беше на максимум, хммм, чай да видим к’о щеше да стане…
Добре. Пиши!
(влиза Христев: „Добър ден.“, Гацев: „Ай сядай, сядай, че няма време“)
И сега… Пиши!
(и би звънеца)

(навиква Ицо)
Ш, м’че бръкни в контакта, почувствай закона на Ом и си сядай на мястото бе!

Tags: , , ,

By Тодор in FreeBSD, Linux, Solaris

Важно е да следим, с колко свободно пространство разполагаме. Давам пример на едно роботче писано на bash, което изпраща e-mail (sms), когато свободното пространство на посочен дял от диска падне под определена граница:


#!/bin/bash

#------Configuration

#Send alert to this email address
EMAIL="35988xxxxxxx@sms.mtel.net"

#Partition which should be monitored
PARTITION="/dev/md1"

#If free space is less than this value in KB - send email
SPACELIMIT=1000000

#How long to wait in minutes to send another email
REMINDTIMEOUT=120

#Time format used in the message
TIME=`date +"%d.%m.%y %H:%M"`

#The marker prevents sending of too many messages
#Must be unique for each partition monitored.
#Add different numbers at the end of the file name for each partition
MARKER="/tmp/freespacereached"

#------END of Configuration

if [ -f $MARKER ]; then
    MARKERAGE=$(($((`date +%s`-`stat -c %Z $MARKER`)) / 60))
else
    MARKERAGE=0
fi

if [ $MARKERAGE -gt $REMINDTIMEOUT ]; then
    rm -f $MARKER
fi

FREESPACE=`df | grep "$PARTITION" | awk '{ print $4}'`
# Prevent crash in case of wrong partition configuration or data extraction
FREESPACE=$((FREESPACE+0));

if [ $FREESPACE -lt $SPACELIMIT ]; then
    MSG="$TIME - Spacecheck WARNING! - $((FREESPACE/1024))MB available on $PARTITION"
    if [ ! -f "$MARKER" ]; then
        echo $MSG | mail $EMAIL
        touch $MARKER
    fi
else
    rm -f $MARKER
fi

Изпълнението на скрипта се предоставя на cron, като се създава конфигурационен ред, подобен на този:


0 9-21 * * * /scripts/spacecheck.sh

Т.е. прави проверка на всеки кръгъл час, но няма да ни безпокои през нощта ;)

Машината, на която се изпълнява трябва да може да изпраща електронна поща, т.е. трябва да има работещ sendmail, postfix или друга алтернатива.

By Тодор in Фун

By Тодор in Cisco

Конкретен пример как да се направи автоматично прехвърляне към втори Интернет доставчик (или трасе) при пропадане на главната линия.

Рутер (IOS 12.4):
fe0 – 192.168.0.1/24 – вътрешна мрежа
fe1 – 100.100.100.123/24, GW: 100.100.100.1 – трасе1
fe2 – 200.200.200.123/24, GW: 200.200.200.1 – трасе2

Приемаме трасе1 за главна линия, а трасе2 за резервна, която ще се ползва единствено, когато трасе1 не работи. За диагностика дали трасето работи ще ползвам ping.
И двете трасета са за предоставяне на достъп до Интернет, така че за диагностика ще се пингва адрес някъде в Интернет. Избрах един от DNS сървърите на OpenDNS – 208.67.222.222.

Превключването между трасетата ще става като бива сменян шлюзът по подразбиране за рутера (default gateway). За тази цел трябва статично да рутираме заявките до 208.67.222.222 през трасе1 (главното трасе).

ip route 208.67.222.222 255.255.255.255 100.100.100.1

От предишната ми статия вече знаете как се правят пингващи роботчета в Cisco IOS, сега ще разширим малко възможностите на едно такова роботче:

ip sla 1
 icmp-echo 208.67.222.222 source-ip 192.168.0.1
 frequency 30
ip sla schedule 1 life forever start-time now
ip sla reaction-configuration 1 react timeout action-type triggerOnly

Бързо стават ясни фактите:
- пингва 208.67.222.222, като изпраща заявките от името на 192.168.0.1
- пингва през 30 секунди
- цикълът продължава вечно
- когато имаме timeout, това ще предизвика trigger събитие, което сега ще уловим:

track 1 ip sla 1

Пингачката вече трябва да работи, а това можете да проверите с:

debug ip icmp
term mon

Сега е момента да нагласим и самата маршрутизираща таблица на рутера така, че да се съобразява с пингачката и събитията генерирани от нея:

ip route 0.0.0.0 0.0.0.0 100.100.100.1 track 1
ip route 0.0.0.0 0.0.0.0 200.200.200.1 10

Сега какво означава това – първият ред ни дава шлюзът по подразбиране на главното трасе, но “track 1″ означава, че този route ще е валиден само, ако “спусъкът” track 1 разрешава, т.е. ако пингачката работи и пингвания IP адрес отговаря.
Вторият ред ни дава втори шлюз по подразбиране – този на резервното трасе. Но този route е с по-нисък приоритет (по-голяма метрика – 10), т.е. ще работи, само ако няма route с по-висок приоритет от него (по-ниска метрика).

Можете да видите статуса на track-а в рутиращата таблица ето така:

sh ip route track-table
 ip route 0.0.0.0 0.0.0.0 100.100.100.1 track 1 state is [down]

Когато е down (т.е. пингачката получава таймаути от пингвания адрес) – този route изобщо не съществува в таблицата за рутиране и рутера подхваща следващото налично трасе – през 200.200.200.1.

Дали има NAT или не на рутера няма значение.

Наздраве! :)

Tags: , , , , , ,

By Тодор in Cisco

Примера представлява просто изпращане на echo заявки към определен хост през определено време от Cisco IOS. За да повишим фън-фактора, самият cisco рутер ще изпраща тези заявки, а не потребителска машина от вътрешната мрежа.

Конкретно на мен това ми беше необходимо, за да поддържа установен site-to-site VPN, понеже, ако няма трафик през тунела – той се самоизключва, а включването му след това може да отнеме няколко ценни секунди или да провали опит за телефонен разговор (Call Manager Express).

При не-установен тунел и опит за телефонно (VoIP) обаждане от едната мрежа до другата, UDP трафикът който се генерира понякога е недостатъчен да “събуди” и установи VPN тунела. В резултат на което – провален разговор.

Ето и самият пример:

ip sla 1
 icmp-echo 192.168.10.1 source-ip 192.168.11.1
 frequency 30
ip sla schedule 1 life forever start-time now

Тук пингваме през 30 секунди ИП адреса 192.168.10.1 от името на 192.168.11.1 (интерфейса на рутера към вътрешната мрежа), като задачата ще се изпълнява до безкрайност – forever. Можете да си поиграете с параметрите спрямо вашите нужди.

Примерът е от IOS 15.1.

Tags: , , , , , ,

By Тодор in Linux

SNMP е най-удобния протокол да следим състоянието на… всичко – натоварване на мрежовите интерфейси, на процесора, на паметта и на какво ли още не. За темата на тази статия съм загатнал тук, но сега ще дам по-точен пример.

Ще споделя как може да се следи температурата на хард дисковете с негова помощ. Приемам, че сте конфигурирали snmpd правилно и демонът работи (за справка – тук).

В конфигурацията на демона – /etc/snmp/snmpd.conf добавяте това:

exec hdd1temp /root/hdd1temp.sh

Това е съдържанието на /root/hdd1temp.sh:

#!/bin/bash
/usr/sbin/smartctl -A /dev/sda | grep -i temperatur | awk '{print  $10}'

Задължително файлът да е изпълним (chmod +x …).

Рестарт на snmpd и нека проверим какво се случи:

# snmpwalk -v2c -c communitypass localhost UCD-SNMP-MIB::extOutput

Този пример със snmpwalk ще “изплюе” всички exec редове от snmpd.conf по ред на номерата им.

От тук нататък е въпрос на фантазия какво ще правите със събираните данни. Можете да си настроите аларма при превишаване на температурата с подходящ bash скрипт, както и да рисувате статистика с RRD или MRTG.

Ето така ще получите само конкретната стойност готова за по-нататъшна обработка:

# snmpwalk -v2c -Oqv -c communitypass localhost UCD-SNMP-MIB::extOutput.1

Примерът е от CentOS. За други дистрибуции файлът snmpd.conf може да е в друга директория, но останалото остава същото ;)
Енджой!

Tags: , , , , ,

By Тодор in Linux

Постановката е следната:
Линукс рутер който се ползва за NAT-ване на домашна/офис мрежа за достъп до Интернет.
Два Интернет доставчика за да има някаква резервираност.
В най-простия пример линукс рутера е с 3 лан-карти – Доставчик1, Доставчик2 и Вътрешна мрежа. Приемам, че можете да си конфигурирате маскирането (NAT) така, че вътрешната мрежа да има Интернет, но проблема ви е, че рутера не може да има едновременно два шлюза по подразбиране (default gateway). Добре де, за тези, които не знаят ще дам кратко примерче и за това :)

Доставчик1:
закачен е към eth0
IP: 100.100.100.12/255.255.255.0
GW: 100.100.100.1

Доставчик2:
закачен е към eth1
IP: 200.200.200.56/255.255.255.0
GW: 200.200.200.1

Вътрешна мрежа:
закачена е към eth2
192.168.1.1/24

Транслиране на изходящия трафик през интерфейсите към Интернет доставчиците:
# iptables -t nat -A POSTROUTING -j MASQUERADE
Маскирането по този начин работи дори и IP адреса да е динамичен.

От тук нататък дали ще ползваме Доставчик1 или Доставчик2 зависи само от това кой шлюз по подразбиране ще оставим активен на рутера – 100.100.100.1 или 200.200.200.1.

Сега едно малко скрипт-роботче ще проверява през 5 минути (или колкото вие решите) дали има връзка към Интернет. Проверката ще става като пингва един от ДНС сървърите на OpenDNS 208.67.222.222 (може и ИП адреса на някой root-DNS да сложите, няма значение – нещо което е винаги винаги на линия). Механизъмът е устроен така, че ако не получи отговор, ще подмени шлюза с този на другия доставчик.

#!/bin/bash
GW1=100.100.100.1
GW2=200.200.200.1
CHECK_HOST=208.67.222.222

DEFAULT_GW=`ip route list | grep default | awk '{print $3}'`
if /bin/ping -n -c 5 $CHECK_HOST 1>/dev/null 2>/dev/null; then
  echo "Link OK"
else
  echo "Link down! Switching..."
  if [ $DEFAULT_GW==GW1 ]; then
    ip route del default
    ip route add default via $GW2
  else
    ip route del default
    ip route add default via $GW1
  fi
fi

Копирайте този скрипт в текстов файл, направете го изпълним (chmod +x filename) и го добавете в crontab за изпълнение през определено време.

В този пример и двата доставчика са еднакво предпочитани. Т.е. когато от Д1 отпадне и преминем на Д2 – ще останем на Д2 дори и след като Д1 възстанови нормална работа. И така докато ползваният в момента доставчик не отпадне.

В следващ пост ще покажа и пример с 2 доставчика, в който се следи състоянието на 2те линии едновременно и можем да конфигурираме предпочитан и резервен доставчик.

Tags: , , , , , , ,

By Тодор in Linux

По подразбиране в RHEL/CentOS паролите на потребителите се съхраняват под формата на MD5 hash.
Дали е така може да се провери с тази команда:
# authconfig --test | grep hashing

За да променим алгоритъма за генериране на hash-ове пишем това:
# authconfig --passalgo=sha512 --update

Всички нови пароли ще бъдат в SHA512 формат.

Tags: , , , , , ,