Skip to content

By Тодор in Mikrotik, Openwrt

Mikrotik рутерите поддържат (някаква) виртуализация. Не е кой знае колко ползваема, но е достатъчно да се инсталира openwrt с asterisk и виртуалната машина да служи за телефонна централа с красив уеб интерфейс и поддръжка на SIP и IAX.

Ето параметрите на виртуалната машина:

/metarouter
add memory-size=48MiB name=mr1
/metarouter interface
add dynamic-bridge=LAN type=dynamic virtual-machine=mr1

Изтеглете openwrt от тук.
Качете файла на рутера. От winbox избирате “Import Image” и внасяте gz файла.
Виртуалката тръгва и ако всичко е наред трябва да има и мрежа с Интернет.

Инсталаторът на пакети има счупен линк в списъка с хранилищата си, който трябва да се премахне:
В /etc/opkg.conf сложете коментар пред последния ред:
#src X-Wrt http://downloads.x-wrt.org/xwrt/kamikaze/packages/mr-mips/packages

Следва инсталацията на Asterisk:

opkg update
opkg install libopenssl asterisk18 asterisk18-codec-alaw asterisk18-chan-iax2 asterisk-gui
/etc/init.d/asterisk enable

Сменете паролата на admin потребителя в /etc/asterisk/manager.conf и стартирайте демона:
/etc/init.d/asterisk start

Уеб интерфейса е достъпен на порт 8088.

Хав фун!

By Тодор in Mikrotik

Динамичните ИП адреси са гадни, но са добър начин Интернет доставчиците да пестят средства и ресурси. На стандартния домашен клиент това не се отразява особено. Вероятно повече от 90% от хората нямат и идея какво е ИП адрес.
Та на темата – “прокарването” на VPN тунел между клиенти с динамични адреси е предизвикателство, което може лесно да бъде ликвидирано. Необходимо е все пак обаче да имаме някакъв начин да открием адреса на крайната точка. Удобни са всевъзможните dyndns услуги, предлагани от самите Интернет доставчици или от купища сайтове.
Скрипта може да се ползва и от двете страни на тунела с малки изменения:

:global rip [:resolve kamenitza.ddns.net]
:log info "IP resolved: $rip"
/int gre set gre-to-pst remote-address=$rip
/ip ipsec policy set [/ip ipsec policy find comment="vpn1"] dst-address="$rip/32" sa-dst-address=$myip
/ip ipsec peer set [/ip ipsec peer find comment="vpn1"] address=$rip

В случая се отнася за IPSec криптиран GRE тунел.
След това се прави scheduler задача:
/system scheduler 
add interval=1h name=dyn-vpn on-event="/system script run dyn-vpn" policy=ftp,reboot,read,write,policy,test,password,sniff,

Понеже в конфигурацията на такъв тунел влиза и локалния WAN ИП адрес, може да се наложи и той да бъде автоматично открит и корегиран, където е необходимо на динамичния рутер:

:global myip [/ip address get [find interface=WAN] address]
:global myip [:pick $myip 0 [:find $myip "/"]]
/ip ipsec policy set [/ip ipsec policy find comment="vpn"] src-address="$myip/32" sa-src-address="$myip"

Това също трябва да влезе в scheduler-а по същия начин.

By Тодор in Linux

Една бърза бележка за нещо необходимо най-често при копиране на файлове от windows към *nix.
Премахване на Х атрибута на всички файлове в текущата директория и поддиректориите:
find . -type f -exec chmod -x {} +
Добавяне на Х атрибута на всички директории в текущата, рекурсивно:
find . -type d -exec chmod +x {} +

By Тодор in Mikrotik

Най-елементарното против навлеци, което май го има даже и в официалната документация. За ползване тип copy/paste:

/ip firewall filter
add action=drop chain=input comment=”Drop all blacklisted” src-address-list=blacklist
add action=add-src-to-address-list address-list=blacklist address-list-timeout=1w3d chain=input comment=’Add to blacklist’ connection-state=new dst-port=22 log=yes log-prefix=Blacklisted protocol=tcp src-address-list=stage3
add action=add-src-to-address-list address-list=stage3 address-list-timeout=30m chain=input comment=’Add to stage3′ connection-state=new dst-port=22 protocol=tcp src-address-list=stage2
add action=add-src-to-address-list address-list=stage2 address-list-timeout=5m chain=input comment=’Add to stage2′ connection-state=new dst-port=22 protocol=tcp src-address-list=stage1
add action=add-src-to-address-list address-list=stage1 address-list-timeout=1m chain=input comment=’Add to stage1′ connection-state=new dst-port=22 protocol=tcp

By Тодор in Linux

В случай, че се налага postfix да праща писма, като се аутентикира пред друг пощенски сървър, ползвайки един потребител за всичката изходяща кореспонденция.

В /etc/postfix/generic се добавя:

root@localhost.localdomain realuser@domain.tld
nagios@localhost.localdomain realuser@domain.tld
root@hostname realuser@domain.tld
nagios@local.domain   realuser@domain.tld
root@local.domain     realuser@domain.tld

Всеки локален потребител се описва тук. Срещу него пишем с какъв адрес да се замени, преминавайки през postfix. След това postmap /etc/postfix/generic.

В /etc/postfix/main.cf:

mydomain = local.domain
myorigin = $mydomain
relayhost = mail.domain.tld
smtp_sasl_auth_enable = yes
smtp_sasl_mechanism_filter = plain, login
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_generic_maps = hash:/etc/postfix/generic
sender_canonical_maps = hash:/etc/postfix/sender_canonical

/etc/postfix/sasl_passwd:
mail.domain.tld realuser:password
След това postmap /etc/postfix/sasl_passwd.

/etc/postfix/sender_canonical:
*       realuser@domain.tld
След това postmap /etc/postfix/sender_canonical.
Postfix ще тръгне след тази конфигурация, но вероятно няма да изпраща писма, докато не бъдат инсталирани съответните пакети cyrus-sasl… Ще познаете по грешките във /var/log/maillog при опит за изпращане на писмо.

By Тодор in Linux

Това е примерна конфигурация на пощенски сървър с локални системни потребители. Бързо и лесно за не особено голям брой пощенски кутии. Конфигурацията включва поддръжка на криптирани протоколи, спам филтриране, както и DKIM подписване на изходящата кореспонденция.

Postfix конфигурацията.
/etc/postfix/main.cf:

smtpd_banner = mail.kamenitza.org ESMTP
biff = no
append_dot_mydomain = no
readme_directory = no
smtpd_tls_cert_file=/etc/ssl/postfix.crt
smtpd_tls_key_file=/etc/ssl/postfix.key
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
myhostname = mail.kamenitza.org
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = kamenitza.org, mail.kamenitza.org
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
message_size_limit = 50000000
recipient_delimiter = +
inet_interfaces = all
home_mailbox = Maildir/
virtual_alias_maps = hash:/etc/postfix/virtual
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_rbl_client zen.spamhaus.org,
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client 0spam.fusionzero.com,
    reject_rbl_client bl.spamcannibal.org,
    reject_rbl_client blackholes.five-ten-sg.com,
    reject_rbl_client blackholes.intersil.net,
    reject_rbl_client dnsbl.sorbs.net,
    reject_rbl_client dnsbl-0.uceprotect.net,
    reject_rbl_client dnsbl-1.uceprotect.net,
    reject_unauth_destination
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
disable_vrfy_command = yes

/etc/postfix/virtual:
todor@kamenitza.org        todor
t@kamenitza.org       todor

Да не се забрави и postmap /etc/postfix/virtual след това.

Dovecot
/etc/dovecot/conf.d/10-auth.conf:

disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-system.conf.ext

/etc/dovecot/conf.d/10-mail.conf:
mail_location = maildir:~/Maildir
mbox_write_locks = fcntl

/etc/dovecot/conf.d/10-master.conf:
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }
}

/etc/dovecot/conf.d/10-ssl.conf:
ssl = yes
ssl_cert = </etc/ssl/postfix.crt
ssl_key = </etc/ssl/postfix.key

Opendkim – подписването на писмата.
/etc/opendkim.conf:

PidFile         /var/run/opendkim/opendkim.pid
Mode            s
Syslog          yes
SyslogSuccess   yes
LogWhy          yes
UserID          opendkim:opendkim
Socket          inet:8891@localhost
Umask           002
Canonicalization        relaxed/simple
Domain          kamenitza.org
Selector        default
KeyFile         /etc/opendkim/keys/default.private

Генериране на сертификата в /etc/opendkim/keys/
opendkim-genkey -d kamenitza.org

Ако има нужда с -s се посочва селектора. В случая ползваме default.
Съдържанието на default.txt се добавя като TXT запис в DNS конфигурацията на домейна:
default._domainkey IN TXT "v=DKIM1; k=rsa; p=MI..."

By Тодор in Linux

То това е валидно не само за тази дистрибуция но и за всички с по-нови ядра.
В общи линии проблема е в така нареченото “reverse path filtering”, което с прости думи казано пречи на трафика да влиза през един интерфейс, а да излиза през друг. Подобно на анти-спуфинг защита. Най-често това е сценарий с резервирани връзки, динамично рутиране с няколко доставчика и подобни. Аз го забелязах при BGP рутиране, при което Интернет и БГ трафик идват по различни интерфейси.
В подобни сценарии е необходимо това филтриране да бъде спряно със следния ред в /etc/sysctl.conf:
net.ipv4.conf.default.rp_filter = 0

Tags: , , , , , , , , , , ,

By Тодор in Linux, Openwrt

Давам пример за създаването на оптималната RRD база данни за събиране на мрежов трафик:

rrdtool create router.rrd --step 300 --start N  \
  DS:in:COUNTER:600:0:37500000000    \
  DS:out:COUNTER:600:0:37500000000    \
  RRA:AVERAGE:0.5:1:288      \
  RRA:AVERAGE:0.5:12:8760

Това означава, че:
– стъпката на графиката е 5мин
– двете полета за данни, in и out могат да приемат стойности от 0 до 37500000000
– ако повече от 10мин няма данни, се приема UNKNOWN
– първият архив съдържа последните 288 измервания – 288 * 300сек = 86400сек (24ч)
– вторият архив съдържа 8760 броя от осреднената стойност на всеки 12 измервания, т.е. средната скорост за всеки час (12*300сек=1ч); 8760часа=1година

Да взема да кажа и какво е 3750000000 :) Това е теоретичният максимум байтове, които могат да се навъртят от брояча на гигабитов порт за 5 минути.
Сметката е на база стандартен COUNTER64 брояч (от snmp), който брои octets (байтове).

1000000000bps/8=125000000Bps*300сек=37500000000байта

bps – bits per second (1000bits=1kbit)
Bps – bytes per second (1024bytes=1Kbyte)

Да се има предвид, че при мерене на COUNTER32 тази цифра е извън обхвата на брояча (4294967295) и при скорост от 1Gbps, за 5мин този брояч може да се превърти повече от 8 пъти :)

Tags:

By Тодор in Linux, Openwrt

Понеже винаги започвам да си ровя из бележките и сметките, когато дойде момента да правя нови RRD файлове, ще споделя детайлен пример при следене на температура:

rrdtool create t.rrd --step 300 --start N DS:v:GAUGE:600:-100:100 RRA:AVERAGE:0.5:1:288 RRA:MAX:0.5:288:3650 RRA:MIN:0.5:288:3650

Ако за период от 600 секунди не постъпят данни, приема UNKNOWN
Минимална температура -100
Максимална температура 100
В архива се съхраняват следните стойности:
– средното на всеки 5мин в продължение на 24 часа (86400/300=288 – в един ден има 288 пъти по 5минути)
– максималното от всеки ден в продължение на 3650 дни (288*300=1 ден, пазят се 3650 такива отчитания)
– минималното от всеки ден в продължение на 3650 дни

Може да си кажете, че 10години са много? Все пак RRD файла създаден от този пример е с големина 61KB, и ако този размер не ви притеснява – нека мислим с резерв за бъдеще 😉

Tags:

By Тодор in Openwrt

Това е пример, как да се случи така, че да имаме няколко отделни L3 интерфейса на рутера си с помощта на ВЛАНи:

config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config interface 'lan'
        option ifname 'eth0.1'
        option type 'bridge'
        option proto 'static'
        option ipaddr '192.168.0.1'
        option netmask '255.255.255.0'

config interface 'wan'
        option ifname 'eth1'
        option proto 'dhcp'
  #Clone/custom MAC on WAN
        option macaddr '00:aa:bb:cc:dd:ee'

config interface 'wifi'
        option ifname 'wlan0'
        option proto 'dhcp'

config switch
        option name 'eth0'
        option reset '1'
        option enable_vlan '1'

config switch_vlan
        option device 'eth0'
        option vlan '1'
  #ports 2 and 3 here are ports 1 and 2 on the back of the router
        option ports '2 3 4t'

config switch_vlan
        option device 'eth0'
        option vlan '2'
  #port0 here is port4 on the back of the router
        option ports '0 4t'

config switch_vlan
        option device 'eth0'
        option vlan '3'
  #port1 here is port3 on the back of the router
        option ports '1 4t'

config interface 'dmz'
        option ifname 'eth0.2'
        option proto 'static'
        option ipaddr '192.168.1.1'
        option netmask '255.255.255.0'

config interface 'dmz2'
        option ifname 'eth0.3'
        option proto 'static'
        option ipaddr '192.168.2.1'
        option netmask '255.255.255.0'

В този пример имаме 1 WAN порт и 3 отделни вътрешни интерфейса.
Вътрешна мрежа 1: на портове 1 и 2
Вътрешна мрежа 2: на порт 3
Вътрешна мрежа 3: на порт 4

В конфигурацията пишем option ports ‘0 4t’, където под порт 4 се разбира вътрешния порт на суича, който го свързва с рутера – ъплинк един вид.

Tags: , , , ,

By Тодор in Windows

Да, ако HTML формата съдържа само едно единствено текстово поле, то тя не може да бъде събмитната с натискане на Ентер в Internet Explorer коя-да-е-версия. Страницата просто се презарежда, без да се събмитне (каква чудесна българска дума).
Наличието на този “дефект” във всички версии на IE подсказва, че навярно това е нарочно…

Проблема може да бъде заобиколен, като просто добавим още едно скрито INPUT поле във формата:
<!--[if IE]><input type="text" style="display: none;" /><![endif]-->

Tags: , , , , , ,

By Тодор in Cisco

Ще покажа най-важната част от конфигурацията на Cisco рутер, който може да приема dial-up vpn клиенти закачащи се с Cisco VPN Client (има и алтернатива от Shrew Soft).

crypto isakmp policy 1
 encr aes
 authentication pre-share
 group 2
!
crypto isakmp client configuration group vpngroup
 key p4ssw0rd
 domain domain.local
 pool vpnpool
 acl 110
 netmask 255.255.255.255
!
crypto ipsec transform-set myset esp-aes esp-sha-hmac
!
crypto dynamic-map dynmap 10
 set transform-set myset
!
crypto map clientmap isakmp authorization list default
crypto map clientmap client configuration address respond
crypto map clientmap 10 ipsec-isakmp dynamic dynmap
!
interface FastEthernet1
 ip address dhcp
 ip nat outside
 crypto map clientmap
!
ip local pool vpnpool 192.168.55.100 192.168.55.200
!
ip nat inside source list 150 interface FastEthernet1 overload
access-list 110 permit ip 192.168.0.0 0.0.0.255 any
access-list 150 deny   ip 192.168.0.0 0.0.0.255 192.168.55.0 0.0.0.255
access-list 150 permit ip 192.168.0.0 0.0.0.255 any

Това което трябва да се настрои при клиента е групата vpngroup с парола p4ssw0rd.
В тази конфигурация вътрешната мрежа зад рутера е 192.168.0.0/24, а клиентите на криптирания тунел са 192.168.55.0/24. ACL 110 разрешава на вътрешната мрежа да мине през тунела, а ACL 150, който съдържа списък с какво трябва да се NAT-не, първо не позволява NAT в случай на трафик от 192.168.0.0/24 към 192.168.55.0/24 и второ разрешава NAT за всички останали дестинации.

Ако желаем да имаме още един фактор на идентификация т.е. да пита и за потребителско име и парола, освен конфигурираните вече група и парола на групата, добавяме следните няколко реда:

aaa new-model
aaa authorization network default local
crypto map clientmap client authentication list default

By Тодор in Cisco

Понякога се налага да не искаме да приемем маршрут по подразбиране в OSPF :)

ip prefix-list AllowedRoutes deny 0.0.0.0/0
ip prefix-list AllowedRoutes permit 0.0.0.0/0 le 32
router ospf 1
distribute-list prefix AllowedRoutes in 

Естествено, че не откривам топлата вода :)
Кредитите тук – https://supportforums.cisco.com/thread/2052012

Tags: , , , , , , , ,

By Тодор in Linux

В случай, че се наложи горещо включване на SATA диск, вероятно ще е необходимо на ръка да предизвикаме саниране за нови устройства:
echo "0 0 0" >/sys/class/scsi_host/host<N>/scan
Където N е номера на шината.
А може и така:
partprobe

By Тодор in Openwrt

Напоследък все по-често започнах да използвам Openwrt. Наложи се да мога да изпращам електронни писма през такава машинка. Избрах да ползвам ssmtp. Ето и пример как се случва всичко след инсталацията му.

Конфигурационният файл /etc/ssmtp/ssmtp.conf изглежда така:

root=postmaster
mailhub=smtp.gmail.com:465
authuser=accountname@gmail.com
authpass=SuperMegaQkataPar0la
rewriteDomain=gmail.com
hostname=gmail.com
FromLineOverride=YES
UseTLS=YES

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

Ето как изглежда и изпращането на писмо:
echo -e "From: Goshko <accountname@gmail.com>\nSubject: test subject\n\nMessage body" | ssmtp -vvv some@address.com

Това може лесно да се ползва в скрипт, като ще дам жокер и за нещо друго – името “Goshko” може да бъде различно всеки път. Например “Server A Power” или “Klimatik 02 Status” :)

Примерен скрипт за кратки нотификации – само с няколко думи в темата на писмото:

#/bin/sh
while getopts n:s:a: option
do
        case "${option}"
        in
                n) NAME=${OPTARG};;
                s) SUBJ=${OPTARG};;
                a) ADDR=${OPTARG};;
        esac
done
echo -e "From: $NAME <some@address.com>\nSubject: $SUBJ\n\n`date`" | ssmtp $ADDR

Работи по следния начин:
notify.sh -n 'Comms UPS' -s 'Power Down' -a admin@address.com
Ще изпрати съобщение, което в тялото си съдържа само датата на събитието.

Tags: ,