Archive

Archive for February, 2009

Шифрование диска с помощью GEOM-ELI

February 8th, 2009 No comments

Создание:

1
2
3
4
5
6
7
8
# kldload /boot/kernel/geom_eli.ko
# dd if=/dev/random of=/root/da0.key bs=64 count=1
# geli init -s 4096 -K /root/da0.key -e Blowfish -a hmac/sha512 -l 384 /dev/da0
# dd if=/dev/random of=/dev/da0.eli bs=1m
# newfs /dev/da0.eli
# mount /dev/da0.eli /mnt/private
# umount /mnt/private
# geli detach da0.eli

Использование:

1
2
3
4
5
6
7
8
9
#!/bin/sh
if [ -c /dev/da0.eli ]
then
        umount /mnt/share/case/backup
        geli detach da0.eli
else
        geli attach -k /root/da0.key /dev/da0
        mount /dev/da0.eli /mnt/share/case/backup/
fi

Ссылки:
http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/disks-encrypting.html
http://www.lissyara.su/?id=1566

Tags:

Установка Verlihub с поддержкой Lua

February 6th, 2009 No comments

Устанавливаем из портов net-p2p/verlihub и net-p2p/verlihub-plugins-luascript.
Ложим скрипты в каталог /usr/local/etc/verlihub/scripts.
В DC используем следующие команды:
!luaload /usr/local/etc/verlihub/scripts/file.lua
!luaunload /usr/local/etc/verlihub/scripts/file.lua
!luareload /usr/local/etc/verlihub/scripts/file.lua

Мой первый бот:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
aRange = {
["127.0.0.1-127.0.0.255"] = 1,
["10.128.0.1-10.128.255.254"] = 1,
["10.129.0.1-10.129.255.254"] = 1,
["10.130.0.1-10.130.255.254"] = 1,
["192.168.0.1-192.168.255.254"] = 1,
["213.79.108.1-213.79.111.254"] = 1,
["172.16.127.1-172.16.127.255"] = 1,
}
 
--function VH_OnParsedMsgChat(nick, data)
function VH_OnUserLogin(nick)
--  if (string.find(data,"^/me%s")) then
    res, myinfo = VH:GetMyINFO(nick)
    _, _, sharess = string.find(myinfo,"(%d+)$$")
--      _, _, action = string.find(data,"^/me%s+(.+)")
    _, ip = VH:GetUserIP(nick)
 
    local Allow,Range = Func.CheckIP(GetIP(nick))
    local res,class = VH:GetUserClass(nick)
 
--if (Allow == 0) and (res and class <= 2)
--VH:SendDataToUser("$To: sNick From: $<"..sBotName.."> nForbidden. Your IP: "..ip.." is not inside LocalNetwork |", sNick)
 
    shares = sharess / 1024 / 1024 / 1024;
    _, _, share = string.find(shares,"^(%d*)")
 
    if (class < 3) then
        if (tonumber(sharess) < 53687091200 ) then
            if (Allow == 0) then
--              VH:SendDataToAll("** "..nick.." disconnect wrong user, nothing share|",5,10);
                VH:SendDataToUser("$To: Case From: Verlihub $<VerliHub> user: "..nick..", akado ("..ip.."), low share ("..share.."), disconnect|", "Case")
            else
--              VH:SendDataToAll("** "..nick.." share something normal user|",5,10);
                VH:SendDataToUser("$To: Case From: Verlihub $<VerliHub> user: "..nick..", zelcom ("..ip.."), low share ("..share.."), alive|", "Case")
            end
        else
        --  VH:SendDataToAll("** "..nick.." welcome aboard, normal share user|",5,10);
            if (Allow == 0) then
                VH:SendDataToUser("$To: Case From: Verlihub $<VerliHub> user: "..nick..", akado ("..ip.."), normal share ("..share.."), alive|", "Case")
            else
                VH:SendDataToUser("$To: Case From: Verlihub $<VerliHub> user: "..nick..", zelcom ("..ip.."), normal share ("..share.."), alive|", "Case")
            end
        end
    else
        VH:SendDataToUser("$To: Case From: Verlihub $<VerliHub> user: "..nick..", operator, alive|", "Case")
--      VH:SendDataToAll("** "..nick.." welcome aboard, operator|",5,10);
    end
 
--  end
    return 1
end
 
Func = {}
 
Func.ComIP = function(curIP)
    local _,_,a,b,c,d = string.find(curIP, "(%d+).(%d+).(%d+).(%d+)")
    return a*16777216 + b*65536 + c*256 + d
end
 
Func.CheckIP = function(curIP)
    local _,_,a,b,c,d = string.find(curIP, "(%d*).(%d*).(%d*).(%d*)")
    if ( tonumber(a) and tonumber(b) and tonumber(c) and tonumber(d) ) then
        local UserIP = Func.ComIP(curIP)
        if UserIP then
            for Range, Table in pairs(aRange) do
                local _,_,R1,R2 = string.find(Range, "(%S+)-(%S+)")
                Range1 = Func.ComIP(R1)
                Range2 = Func.ComIP(R2)
                if UserIP >= Range1 and UserIP <= Range2 then
                    return 1,Range
                end
            end
        end
    end
    return 0
end
 
function GetIP(sNick)
    res, ip = VH:GetUserIP(sNick)
    return ip
end
Tags: ,

Переходим на Jabber

February 6th, 2009 No comments

Устанавливаем erlang-lite (без Java, X11, ODBC):

1
2
3
4
5
6
# cd /usr/ports/lang/erlang-lite/
# grep WITH Makefile 
WITHOUT_JAVA=   yes
WITHOUT_X11=    yes
WITHOUT_ODBC=   yes
# make install clean

Устанавливаем ejabberd (без ODBC):

1
2
3
4
# cd /usr/ports/net-im/ejabberd
# grep WITH Makefile 
.if defined(WITH_ODBC)
# make install clean

Устанавливаем pyicqt (с поддержкой ejabberd – WITH_EJABBERD):

1
2
3
# cd /usr/ports/net-im/jabber-pyicq
# make config
# make install clean

Добавляем в DNS следующие записи:

1
2
3
4
_xmpp-client._tcp.case.net.ru.  IN SRV 5 0 5222 case.net.ru.
_xmpp-server._tcp.case.net.ru.  IN SRV 5 0 5269 case.net.ru.
_jabber._tcp.case.net.ru.       IN SRV 5 0 5269 case.net.ru.
icq                             A 213.79.110.123

Настраиваем ejabberd – /usr/local/etc/ejabberd/ejabberd.cfg:

{acl, admin, {user, "case"}}.
{acl, local, {user_regexp, ""}}.
{access, pubsub_createnode, [{allow, all}]}.
{access, configure, [{allow, admin}]}.
{access, register, [{deny, all}]}.
{welcome_message, {"Welcome!", "Welcome to Jabber Service.  " "For information about Jabber visit http://jabber.org"}}.
{access, announce, [{allow, admin}]}.
{access, c2s, [{deny, blocked}, {allow, all}]}.
{shaper, normal, {maxrate, 1000}}.
{shaper, fast, {maxrate, 50000}}.
{access, c2s_shaper, [{none, admin}, {normal, all}]}.
{access, s2s_shaper, [{fast, all}]}.
{access, muc_admin, [{allow, admin}]}.
{access, muc, [{allow, all}]}.
{auth_method, internal}.
{hosts, ["case.net.ru"]}.
{max_user_sessions, 10}.
{language, "en"}.
{listen,
 [{5222, ejabberd_c2s,     [{access, c2s}, {shaper, c2s_shaper}, {max_stanza_size, 65536}, starttls, {certfile, "/usr/local/etc/ejabberd/ssl.pem"}]},
  {5223, ejabberd_c2s,     [{access, c2s}, {max_stanza_size, 65536}, tls, {certfile, "/usr/local/etc/ejabberd/ssl.pem"}]},
  {5269, ejabberd_s2s_in,  [{shaper, s2s_shaper}, {max_stanza_size, 131072} ]},
  {5247, ejabberd_service, [{access, all}, {hosts, ["icq.case.net.ru"], [{password, "secret"}]}]}
 ]}.
{s2s_use_starttls, true}.
{s2s_certfile, "/usr/local/etc/ejabberd/ssl.pem"}.
{outgoing_s2s_port, 5269}.
{modules,
 [
  {mod_register,   [{access, register}]},
  {mod_roster,     []},
  {mod_privacy,    []},
  {mod_adhoc,      []},
  {mod_configure2, []},
  {mod_disco,      []},
  {mod_stats,      []},
  {mod_vcard,      []},
  {mod_offline,    []},
  {mod_private,    []},
  {mod_irc,        []},
  {mod_muc,        [{access, muc},
                    {access_create, muc},
                    {access_admin, muc_admin}]},
  {mod_pubsub,     [{access_createnode, pubsub_createnode}]},
  {mod_time,       []},
  {mod_last,       []},
  {mod_version,    []}
 ]}.

Создаем сертификат:

1
2
3
4
5
6
7
# cd /usr/local/etc/ejabberd/
# openssl req -new -x509 -nodes -newkey rsa:1024 -days 3650 
-keyout privkey.pem -out server.pem -subj 
"/C=XX/ST=XX/L=XX/O=XX/OU=XX/CN=case.net.ru/emailAddress=case@case.net.ru"
# cat privkey.pem >> server.pem  
# rm privkey.pem 
# mv server.pem ssl.pem

Настраиваем pyicqt (приведены только изменения) – /usr/local/etc/jabber-pyicq.xml:

1
2
3
4
5
6
7
8
9
10
11
12
<jid>icq.case.net.ru</jid>
<spooldir>/var/spool/jabber</spooldir>
<pid>/var/jabberd/pid/PyICQt.pid</pid>
<mainServer>127.0.0.1</mainServer>
<mainServerJID>case.net.ru</mainServerJID>
<website>http://case.net.ru/</website>
<port>5247</port>
<secret>secret</secret>
<lang>en</lang>
<encoding>windows-1251</encoding>
<icqServer>login.icq.com</icqServer>
<icqPort>5190</icqPort>

Создаем необходимые каталоги:

1
2
3
# mkdir /var/spool/jabber
# mkdir -p /var/jabberd/pid
# chown ejabberd:ejabberd /var/spool/jabber /var/jabberd /var/jabberd/pid

Включаем демонов в /etc/rc.conf:

1
2
ejabberd_enable="YES"
jabber_pyicq_enable="YES"

Запускаем демонов:

1
2
# /usr/local/etc/rc.d/ejabberd start
# /usr/local/etc/rc.d/jabber-pyicq-transport start

Из под пользователя ejabberd проверяем статус и регистрируем пользователя:

1
2
3
4
[ejabberd@case.net.ru]$ ejabberdctl ejabberd@case status 
Node ejabberd@case is started. Status: started
ejabberd is running
[ejabberd@case.net.ru]$ ejabberdctl ejabberd@case register case case.net.ru password

Подключаемся к учетной записи через kopete и регистрируемся в службе ICQ Transport.

Устанавливаем mcabber:

1
2
3
4
5
6
# cd /usr/ports/net-im/mcabber
# grep WITH Makefile 
.if defined(WITH_GPGME)
.if defined(WITH_ASPELL)
.if defined(WITH_OTR)
# make install clean

Подключаемся через mcabber – ~/.mcabber/mcabberrc:

1
2
3
4
5
set username = case
set server = case.net.ru
set port = 5223
set ssl = 1
set ssl_verify = 0

Возникли проблемы с контактами на gmail.com – решилось отключением службы google talk для домена. )

Ссылки:
http://www.opennet.ru/base/net/jabber_icq_gate.txt.html

tcpflow

February 5th, 2009 No comments

Утилитка для отслеживания tcp потоков. Пример работы:

$ tcpflow -c -i vlan3 -p port 5190

Покажет весь icq трафик (вместе с данными).

Tags:

Nextboot

February 3rd, 2009 No comments

Для разовой загрузки в новую систему мы будем использовать nextboot. Это очень хорошая программа, которая позволяет загрузится с другим ядром\миром ОДИН раз. Если сервер будет перезагружен — снова загрузится наша старая система.

nextboot -D
nextboot -o vfs.root.mountfrom=ufs:/dev/ad2s1d -k kernel.test

Ключ -D сбрасывает конфигурацию nextboot, если она уже была. -o vfs.root.mountfrom указывает, где находится корневой раздел. Естественно, вместо ad2s1d должен быть указан ваш второй диск\раздел, а не мой, а -k — путь к ядру относительно /boot/.

Tags: ,

Считаем трафик через ipacctd

February 1st, 2009 No comments

/usr/ports/net-mgmt/ipacctd

/etc/rc.conf:

1
2
3
4
5
ipacctd_enable="YES"
ipacctd_flags="-v"
ipacctd_rules="all"
ipacctd_rule_all_flags="-p 10000 -f /var/log/ipacctd/ipacct.%F"
ipacctd_rule_all_pid="/var/run/ipacctd.pid"

/etc/rc.firewall:

1
${fwcmd} 3 add divert 10000 ip from any to any

http://www.lissyara.su/?id=1134

Tags:

Static ARP

February 1st, 2009 No comments

Статические ARP таблицы. Комп работает только с теми маками, которые явно указаны.
/usr/local/etc/rc.d/arp.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/sh
# Static ARP-table loader
 
case $1 in
        start)
                arp -d -a > /dev/null
                arp -f /usr/local/etc/arp.conf > /dev/null
                echo 'Static ARP-table is loaded'
                ;;
        stop)
                arp -d -a > /dev/null
                echo 'Static ARP-table is unloaded'
                ;;
        restart)
                arp -d -a > /dev/null
                arp -f /usr/local/etc/arp.conf > /dev/null
                echo 'Static ARP-table is reloaded'
                ;;
        status)
                arp -an
                ;;
        *)
                echo "Usage: `basename $0` {start|stop|restart|status}" >&2
                ;;
esac
exit 0

Ну и сама таблица с маками в таком вот виде:
/usr/local/etc/arp.conf:

1
2
3
4
5
6
7
8
9
10
11
12
172.16.127.2    00:0f:ea:1e:65:4a
172.16.127.3    00:15:c5:68:2f:e6
172.16.127.4    00:50:22:b0:88:a2
172.16.127.5    00:14:38:a5:f4:99
172.16.127.6    00:17:fa:ec:c0:13
172.16.127.7    00:a0:d1:ca:8d:ca
172.16.127.8    00:1f:c6:0e:a9:96
172.16.127.9    00:0d:88:f4:b5:7c
172.16.127.10   00:1e:58:a8:aa:46
172.16.127.11   00:22:15:b4:a7:6a
172.16.127.12   11:22:33:44:55:66
172.16.127.13   11:22:33:44:55:66
Tags: , ,

Установка nginx и php_fastcgi

February 1st, 2009 No comments

Променяли apache на nginx + fastcgi. Замечания:
- наверное должно работать быстрее
- в отличии от апачевских rewrite’ов – в nginx’овских вначале должно стоять ^/, а не просто ^
- красивый конфиг где все понятно
- под php надобно демона запускать, вот скриптик:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/bin/sh
#
 
# PROVIDE: php_fastcgi
# REQUIRE: DAEMON
# BEFORE:  LOGIN
# KEYWORD: shutdown
 
. /etc/rc.subr
 
name="php_fastcgi"
rcvar=`set_rcvar`
 
load_rc_config $name
 
: ${php_fastcgi_enable="NO"}
: ${php_fastcgi_user="www"}
: ${php_fastcgi_bindaddr="127.0.0.1"}
: ${php_fastcgi_bindport="9000"}
: ${php_fastcgi_children="5"}
: ${php_fastcgi_max_requests="1000"}
: ${php_fastcgi_allowed_env=""}
 
export PHP_FCGI_CHILDREN=${php_fastcgi_children}
export PHP_FCGI_MAX_REQUESTS=${php_fastcgi_max_requests}
 
command="/usr/local/bin/php-cgi"
command_args="-q -b ${php_fastcgi_bindaddr}:${php_fastcgi_bindport} &"
pidfile="/var/run/${name}.pid"
 
_allowed_env="ORACLE_HOME PATH USER PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS"
_allowed_env="${_allowed_env} ${php_fastcgi_allowed_env}"
 
start_precmd="${name}_start_precmd"
start_postcmd="ps -U ${php_fastcgi_user} -o 'pid,command'|grep ${command}|head -1|cut -f 1 -d ' ' > ${pidfile}"
stop_postcmd=": > ${pidfile}"
php_fastcgi_start_precmd()
{
    export USER=${php_fastcgi_user}
    E=
    for i in ${_allowed_env}; do
        eval _val="\$$i"
        if [ "${_val}_x" != "_x" ]; then
            eval _add="$i=$_val"
            E="${E} ${_add}"
        fi
    done
    command="env - ${E} ${command}"
}
 
load_rc_config $name
 
run_rc_command "$1"
Tags: ,