<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MyJournal</title>
	<atom:link href="http://yaroslav.berezhinskiy.name/feed/" rel="self" type="application/rss+xml" />
	<link>http://yaroslav.berezhinskiy.name</link>
	<description>Машины должны работать. Люди должны думать.</description>
	<lastBuildDate>Thu, 05 Apr 2012 12:27:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Визуальное резюме</title>
		<link>http://yaroslav.berezhinskiy.name/2012/04/visual_cv/</link>
		<comments>http://yaroslav.berezhinskiy.name/2012/04/visual_cv/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 12:27:48 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[Полезности]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[cv]]></category>
		<category><![CDATA[резюме]]></category>

		<guid isPermaLink="false">http://yaroslav.berezhinskiy.name/?p=889</guid>
		<description><![CDATA[Такое интересное резюме можно сделать на http://resumup.com/]]></description>
			<content:encoded><![CDATA[<p>Такое интересное резюме можно сделать на <a title="ResumUP" href="http://resumup.com/" target="_blank">http://resumup.com/</a></p>
<p><a href="http://yaroslav.berezhinskiy.name/wp-content/uploads/2012/04/visual_resume.png"><img class="aligncenter size-medium wp-image-888" title="visual_resume" src="http://yaroslav.berezhinskiy.name/wp-content/uploads/2012/04/visual_resume-300x253.png" alt="Визуальное резюме" width="300" height="253" /></a></p>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2012/04/visual_cv/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2012/04/visual_cv/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2012%2F04%2Fvisual_cv%2F&amp;title=%D0%92%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%80%D0%B5%D0%B7%D1%8E%D0%BC%D0%B5" id="wpa2a_2">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2012/04/visual_cv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Проксируем IPTV в HTTP</title>
		<link>http://yaroslav.berezhinskiy.name/2011/12/udpxy-iptv-to-http/</link>
		<comments>http://yaroslav.berezhinskiy.name/2011/12/udpxy-iptv-to-http/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 16:16:51 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[iptv proxy]]></category>
		<category><![CDATA[multicast]]></category>
		<category><![CDATA[tv]]></category>
		<category><![CDATA[udpxy]]></category>
		<category><![CDATA[смотреть]]></category>
		<category><![CDATA[телевизор]]></category>

		<guid isPermaLink="false">http://yaroslav.berezhinskiy.name/?p=840</guid>
		<description><![CDATA[Для тех зашел сюда в поисках халявного IPTV сразу даю ссылку на свой плейлист, &#8212; смотрите на здоровье. Для успешного просмотра у вас должен быть открыт 4022 порт на хост berezhinskiy.name Трансляция ограничена 6ю смотрящими одновременно. Для остальных &#8212; маленькое HOWTO на тему проксирования UDP multicast по протоколу HTTP: Решение реализуется с помощью udpxy и [...]]]></description>
			<content:encoded><![CDATA[<p>Для тех зашел сюда в поисках халявного IPTV сразу даю <a href="http://yaroslav.berezhinskiy.name/wp-content/uploads/2011/12/TV.m3u">ссылку на свой плейлист</a>, &#8212; смотрите на здоровье. Для успешного просмотра у вас должен быть открыт 4022 порт на хост berezhinskiy.name Трансляция ограничена 6ю смотрящими одновременно.</p>
<p>Для остальных &#8212; маленькое HOWTO на тему проксирования UDP multicast по протоколу HTTP:<br />
Решение реализуется с помощью udpxy и 2х строк в rc.conf. Для начала проверим активирована ли поддержка мультикаст на интерфейсе:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# ifconfig net0 | grep MULTICAST
net0: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; metric 0 mtu 1500
</pre>
<p>Ставим udpxy:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# cd /usr/ports/net/udpxy/ &amp;&amp; make install clean
</pre>
<p>Добавляем в rc.conf флаги запуска, стартуем и проверяем что порт слушается:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# cat /etc/rc.conf | grep udpxy
udpxy_enable=&quot;YES&quot;
udpxy_flags=&quot;-m net0 -p 4022 -S -c 6&quot;
# /usr/local/etc/rc.d/udpxy start
Starting udpxy.
# sockstat | grep udpxy
root     udpxy      56048 5  tcp4   *:4022                *:*
</pre>
<p>Флаги запуска:<br />
* -m &#8212; имя интерфейса мультикаст-каналов<br />
* -p &#8212; TCP порт для HTTP запросов к приложению<br />
* -c &#8212; максимальное количество клиентов, обслуживаемых одновременно<br />
* -l &#8212; записывать журнал приложения в указанный файл<br />
* -S &#8212; передавать статистику о клиентских соединениях<br />
Далее берем плейлист, который нам дал провайдер и изменяем под наши нужды:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# head tv_all.m3u
#EXTM3U
#EXTINF:0,1 - Channel 5 (Ukraine)
udp://@239.100.0.1:5004
#EXTINF:0,2 - 1+1 international (H264)
udp://@239.100.0.10:5004
#EXTINF:0,3 - UR1
udp://@239.100.0.101:5004
#EXTINF:0,4 - RADIO ERA
udp://@239.100.0.102:5004
#EXTINF:0,5 - L.Radio
# cat tv_all.m3u | sed -e 's@udp://\@@http://berezhinskiy.name:4022/udp/@' &gt; TV.m3u
</pre>
<p>Естественно, заменяем http://berezhinskiy.name:4022 на свои ip:port, запускаем VLC/winamp/wmp и проверяем работоспособность. Если что не фурычит &#8212; смотрим лог и гуглим :)<br />
Если вы оставили опцию -S в флагах запуска, &#8212; статистика будет доступна по адресу http://ip:port/status</p>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2011/12/udpxy-iptv-to-http/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2011/12/udpxy-iptv-to-http/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2011%2F12%2Fudpxy-iptv-to-http%2F&amp;title=%D0%9F%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D1%80%D1%83%D0%B5%D0%BC%20IPTV%20%D0%B2%20HTTP" id="wpa2a_4">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2011/12/udpxy-iptv-to-http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://yaroslav.berezhinskiy.name/wp-content/uploads/2011/12/TV.m3u" length="9142" type="audio/mpegurl" />
		</item>
		<item>
		<title>Бесплатный ssh доступ</title>
		<link>http://yaroslav.berezhinskiy.name/2011/12/free-ssh/</link>
		<comments>http://yaroslav.berezhinskiy.name/2011/12/free-ssh/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 13:07:56 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Полезности]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[консоль]]></category>
		<category><![CDATA[халявный ssh]]></category>

		<guid isPermaLink="false">http://yaroslav.berezhinskiy.name/?p=834</guid>
		<description><![CDATA[Обнаружилось что ресурсы моего домашнего сервера почти не используются. По этому решил сделать добро другим – бесплатно отдаю ssh к машине. Знаю, что многим ITшникам это может принести пользу если нужно что-то протестировать, подглядеть конфиг уже готового сервиса etc. Что уж говорить про анлимный канал и пробросы портов :) По этой ссылке можно узнать подробности [...]]]></description>
			<content:encoded><![CDATA[<p>Обнаружилось что ресурсы моего домашнего сервера почти не используются.<br />
По этому решил сделать добро другим – бесплатно отдаю ssh к машине. Знаю, что многим ITшникам это может принести пользу если нужно что-то протестировать, подглядеть конфиг уже готового сервиса etc. Что уж говорить про анлимный канал и пробросы портов :)<br />
<a href="/ssh-request/" target="_blank">По этой ссылке</a> можно узнать подробности и оформить запрос.</p>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2011/12/free-ssh/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2011/12/free-ssh/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2011%2F12%2Ffree-ssh%2F&amp;title=%D0%91%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D1%8B%D0%B9%20ssh%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF" id="wpa2a_6">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2011/12/free-ssh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пишем daemon на Python</title>
		<link>http://yaroslav.berezhinskiy.name/2011/10/demon-in-python/</link>
		<comments>http://yaroslav.berezhinskiy.name/2011/10/demon-in-python/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 17:45:25 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[daemon]]></category>
		<category><![CDATA[fork]]></category>
		<category><![CDATA[демон на питоне]]></category>

		<guid isPermaLink="false">http://yaroslav.berezhinskiy.name/?p=761</guid>
		<description><![CDATA[Нужно было написать демона для одного проекта. Чтобы себе на будущее жизнь облегчить &#8212; написал модуль. Возможно еще кому-нибудь понадобится. Копируем код, приведенный ниже и сохраняем под именем daemon.py Дальше нам нужно подключить модуль, написать подкласс для Daemon() и переопределить в нем метод run(). Пример рабочего кода: PROFIT Также есть поддержка работы в интерактивном режиме. [...]]]></description>
			<content:encoded><![CDATA[<p>Нужно было написать демона для одного проекта. Чтобы себе на будущее жизнь облегчить &#8212; написал модуль. Возможно еще кому-нибудь понадобится.<br />
Копируем код, приведенный ниже и сохраняем под именем daemon.py</p>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf8 -*-

__author__    = &quot;Yaroslav Berezhinskiy&quot;
__copyright__ = &quot;Copyright (C) 2011 Yaroslav Berezhinskiy&quot;

import os
import atexit
import sys
import time
from signal import SIGTERM 

#===========================================================================
# &quot;Итерация свойственна человеку, рекурсия божественна.&quot;
# Видно, у Б-га стек длинный. А мы останемся людьми.
#===========================================================================

class Daemon():
    pidfile = 'pidfile.pid'
    stdin='/dev/null'
    stdout='/dev/null'

    def daemonize(self):
        pid = os.fork()
        if pid == 0:
            os.setsid()
            pid = os.fork()
            if pid == 0:
                os.chdir(&quot;.&quot;)
                os.umask(0)
            else:
                sys.exit(0)
        else:
            sys.exit(0)

        atexit.register(self.delpid)

        pid = str(os.getpid())
        file(self.pidfile,'w+').write(&quot;%s\n&quot; % pid)
        return pid

    def descriptors(self):
        sys.stdout.flush()
        sys.stderr.flush()
        si = file(self.stdin, 'r')
        so = file(self.stdout, 'a+')
        os.dup2(si.fileno(), sys.stdin.fileno())
        os.dup2(so.fileno(), sys.stdout.fileno())

    def delpid(self):
        os.remove(self.pidfile)

    def start(self,interactive=False):
        if interactive:
            print &quot;Starting program in interactive mode&quot;
            self.run()
            return

        try:
            pf = file(self.pidfile,'r')
            pid = int(pf.read().strip())
            pf.close()
        except IOError:
            pid = None

        if pid:
            message = &quot;Daemon already running? (pid=%s)\n&quot;
            sys.stderr.write(message % pid)
            sys.exit(1)

        pid = self.daemonize()
        print &quot;Starting daemon.&quot;
        self.descriptors()
        self.run()

    def stop(self):
        try:
            pf = file(self.pidfile,'r')
            pid = int(pf.read().strip())
            pf.close()
        except IOError:
            pid = None

        if not pid:
            message = &quot;Daemon not running? (check %s)\n&quot;
            sys.stderr.write(message % self.pidfile)
            return

        print &quot;Stopping daemon.\nWaiting for PID: %s&quot; % pid
        try:
            while 1:
                os.kill(pid, SIGTERM)
                time.sleep(0.1)
        except OSError, err:
            err = str(err)
            if err.find(&quot;No such process&quot;) &gt; 0:
                if os.path.exists(self.pidfile):
                    os.remove(self.pidfile)
            else:
                print str(err)
                sys.exit(1)

    def restart(self):
        self.stop()
        self.start()

    def run(self):
        print &gt;&gt; sys.stderr, &quot;ERROR: Daemon not started\nYou need to override run() method in your subclass!&quot;
        sys.exit(1)
</pre>
<p>Дальше нам нужно подключить модуль, написать подкласс для Daemon() и переопределить в нем метод run().<br />
Пример рабочего кода:</p>
<pre class="brush: python; title: ; notranslate">
#!/usr/bin/env python
# -*- coding: utf8 -*-

import sys
import time
import daemon

class MyDaemon(daemon.Daemon):
    def __init__(self):
        #---------------------------- Override default PID file in Daemon() class
        daemon.Daemon.pidfile = &quot;my_pidfile.pid&quot;

    def run(self):
        while 1:
            time.sleep(1)

my_daemon = MyDaemon()

if len(sys.argv) &gt;= 2:
    if 'start' == sys.argv[1]:
        my_daemon.start()
    elif 'stop' == sys.argv[1]:
        my_daemon.stop()
    elif 'restart' == sys.argv[1]:
        my_daemon.restart()
    else:
        print &quot;Unknown command&quot;
        sys.exit(2)
    sys.exit(0)
</pre>
<p>PROFIT</p>
<p>Также есть поддержка работы в интерактивном режиме. При передаче значения interactive=True в метод start(), модуль не будет форкать процесс и уводить его в фон, что может быть весьма полезно при отладке кода:</p>
<pre class="brush: python; title: ; notranslate">
        my_daemon.start(interactive=True)
</pre>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2011/10/demon-in-python/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2011/10/demon-in-python/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2011%2F10%2Fdemon-in-python%2F&amp;title=%D0%9F%D0%B8%D1%88%D0%B5%D0%BC%20daemon%20%D0%BD%D0%B0%20Python" id="wpa2a_8">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2011/10/demon-in-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Поиск parent/child PIDов по имени процесса</title>
		<link>http://yaroslav.berezhinskiy.name/2011/03/find-childs-by-name/</link>
		<comments>http://yaroslav.berezhinskiy.name/2011/03/find-childs-by-name/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 20:58:25 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[bash]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Полезности]]></category>
		<category><![CDATA[child]]></category>
		<category><![CDATA[get PID]]></category>
		<category><![CDATA[parent]]></category>

		<guid isPermaLink="false">http://yaroslav.berezhinskiy.name/?p=739</guid>
		<description><![CDATA[Понадобилось получить список всех child&#8217;ов, поражденных процессом. Погуглил&#8230; спросил людей&#8230; В итоге написал сам. Получилось, имхо, забавно. Если изобрел велосипед &#8212; не кидайте камнями, а подскажите более простое решение. Вывод скрипта на моей бубунте для браузера Chrome:]]></description>
			<content:encoded><![CDATA[<p>Понадобилось получить список всех child&#8217;ов, поражденных процессом. Погуглил&#8230; спросил людей&#8230; В итоге написал сам. Получилось, имхо, забавно. Если изобрел велосипед &#8212; не кидайте камнями, а подскажите более простое решение.</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash

getPID() {
    pids=( )
    par_pids=(`ps -ef | grep $1 | grep -v grep | awk '{print $3}' | xargs`)
    real_pids=(`ps -ef | grep $1 | grep -v grep | awk '{print $2}' | xargs`)

    if [[ ${#real_pids[*]} -eq 1 ]]; then
        if [[ $2 = &quot;parent&quot; ]]; then
            pids=(${real_pids[@]})
        elif [[ $2 = &quot;child&quot; ]]; then
            # No such child for $1 process
            pids=( 0 )
            return 1
        fi
    else
        for (( i = 0; i &lt; ${#par_pids[*]}; i++ ))
        do
            for (( z = 0; z &lt; ${#real_pids[*]}; z++ ))
            do
                if [[ ${par_pids[$i]} = ${real_pids[$z]} ]]; then
                    if [[ $2 = &quot;parent&quot; ]]; then
                        pids=(${pids[@]} ${par_pids[$i]})
                    elif [[ $2 = &quot;child&quot; ]]; then
                        pids=(${pids[@]} ${real_pids[$i]})
                    fi
                fi
            done
        done
    fi

    pids=(`echo ${pids[@]} | tr &quot; &quot; &quot;\n&quot; | sort -u | xargs`)
    return 0
}

getPID chrome parent
echo &quot;Parents: ${pids[@]}&quot;
getPID chrome child
echo &quot;Childs: ${pids[@]}&quot;
</pre>
<p>Вывод скрипта на моей бубунте для браузера Chrome:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ ./get_pid.sh
Parents: 19212 19217
Childs: 19215 19238 19240 19244 19246 19250 19254 19258 19261 19264 19267 19273 19276 19281 19301 19334 19339 19346 19351 19367 19404
</pre>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2011/03/find-childs-by-name/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2011/03/find-childs-by-name/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2011%2F03%2Ffind-childs-by-name%2F&amp;title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA%20parent%2Fchild%20PID%D0%BE%D0%B2%20%D0%BF%D0%BE%20%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%B0" id="wpa2a_10">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2011/03/find-childs-by-name/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Подсчет среднего значения с помощю AWK</title>
		<link>http://yaroslav.berezhinskiy.name/2011/02/awk-mean-value/</link>
		<comments>http://yaroslav.berezhinskiy.name/2011/02/awk-mean-value/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 08:14:37 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Полезности]]></category>
		<category><![CDATA[average value]]></category>
		<category><![CDATA[awk]]></category>

		<guid isPermaLink="false">http://myjournal.org.ua/?p=711</guid>
		<description><![CDATA[По работе я часто имею дело дело с логами эпических размеров, в которых указано значение &#171;Total execution time&#187;. Для подсчета среднего/минимального/максимального времени выполнения, удобно использовать awk: Пример вывода команды для подсчета размера возвращаемого обьекта в логах апача:]]></description>
			<content:encoded><![CDATA[<p>По работе я часто имею дело дело с логами эпических размеров, в которых указано значение &#171;Total execution time&#187;. Для подсчета среднего/минимального/максимального времени выполнения, удобно использовать awk:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
awk 'BEGIN{all=0;count=0;max=0;min=1000;} {input=int($1);all=all+input;++count;if (min&gt;=input &amp;&amp; input!=0){min=input}; if (input&gt;=max){max=input};}END{print all/count &quot; &quot; min &quot; &quot; max}'
</pre>
<p>Пример вывода команды для подсчета размера возвращаемого обьекта в логах апача:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ egrep &quot;\s+200\s+&quot; access.log.1 | awk 'BEGIN{all=0;count=0;max=0;min=1000;} {input=int($10);all=all+input;++count;if (min&gt;=input &amp;&amp; input!=0){min=input}; if (input&gt;=max){max=input};}END{print all/count &quot; &quot; min &quot; &quot; max}'
794.36 152 2150
</pre>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2011/02/awk-mean-value/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2011/02/awk-mean-value/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2011%2F02%2Fawk-mean-value%2F&amp;title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D0%B5%D1%82%20%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B5%D0%B3%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8E%20AWK" id="wpa2a_12">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2011/02/awk-mean-value/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Сказы Леса &#8212; Еблан</title>
		<link>http://yaroslav.berezhinskiy.name/2011/02/skazy-lesa-eblan/</link>
		<comments>http://yaroslav.berezhinskiy.name/2011/02/skazy-lesa-eblan/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 09:22:58 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[Музыка]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[Юмор]]></category>
		<category><![CDATA[Еблан]]></category>
		<category><![CDATA[Клип]]></category>
		<category><![CDATA[Сказы Леса]]></category>

		<guid isPermaLink="false">http://myjournal.org.ua/?p=705</guid>
		<description><![CDATA[Имхо, это гениально&#8230;]]></description>
			<content:encoded><![CDATA[<p>Имхо, это гениально&#8230;</p>
<p style="text-align: center;"><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/LJj1iycRQns&amp;rel=0"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/LJj1iycRQns&amp;rel=0" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object></p>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2011/02/skazy-lesa-eblan/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2011/02/skazy-lesa-eblan/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2011%2F02%2Fskazy-lesa-eblan%2F&amp;title=%D0%A1%D0%BA%D0%B0%D0%B7%D1%8B%20%D0%9B%D0%B5%D1%81%D0%B0%20%E2%80%94%20%D0%95%D0%B1%D0%BB%D0%B0%D0%BD" id="wpa2a_14">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2011/02/skazy-lesa-eblan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Шифрование дисков в FreeBSD</title>
		<link>http://yaroslav.berezhinskiy.name/2010/02/encryption-device-freebsd/</link>
		<comments>http://yaroslav.berezhinskiy.name/2010/02/encryption-device-freebsd/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 13:23:56 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[bash]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[AES]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[geli]]></category>
		<category><![CDATA[geom_eli]]></category>

		<guid isPermaLink="false">http://myjournal.org.ua/?p=607</guid>
		<description><![CDATA[Для достижения нашей цели мы будем использовать GEOM класс доступный с FreeBSD версии 6.0 &#8212; GELI. Из достоинств: Использование инфраструктуры crypto(9): при наличии аппаратной криптографической поддержки, geli автоматически использует ее. Поддержка разнообразных криптоалгоритмов. Поддержка шифрованного корневого раздела. Поддержка двух независимых ключей шифрования (например, &#187;основного ключа&#187; и &#187;ключа компании&#187;). Высокая скорость работы geli за счет простого [...]]]></description>
			<content:encoded><![CDATA[<p>Для достижения нашей цели мы будем использовать GEOM класс доступный с FreeBSD версии 6.0 &#8212; GELI. Из достоинств:</p>
<ul>
<li>Использование инфраструктуры <a href="http://www.freebsd.org/cgi/man.cgi?query=crypto&#038;sektion=9">crypto(9)</a>: при наличии аппаратной криптографической поддержки, geli автоматически использует ее.</li>
</ul>
<ul>
<li>Поддержка разнообразных криптоалгоритмов.</li>
</ul>
<ul>
<li>Поддержка шифрованного корневого раздела.</li>
</ul>
<ul>
<li>Поддержка двух независимых ключей шифрования (например, &#187;основного ключа&#187; и &#187;ключа компании&#187;).</li>
</ul>
<ul>
<li>Высокая скорость работы geli за счет простого криптования сектор-сектор.</li>
</ul>
<ul>
<li>Поддержка криптования файловых систем случайным одноразовым ключом &#8212; например, для разделов подкачки или временных файловых систем.</li>
</ul>
<p>Приступим. Собираем ядро со следующими опциями:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
options         GEOM_ELI
device          crypto
</pre>
<p>Если не хотим собирать ядро &#8212; подгружем модулем и добавляем в /boot/loader.conf</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# kldload geom_eli
# echo &quot;geom_eli_load=\&quot;YES\&quot;&quot; &gt;&gt; /boot/loader.conf
</pre>
<p>Отмонтируем будущий крипто-раздел, <strong>НЕ забыв сбэкапить все данные</strong>, ибо нам прийдется их уничтожить.<br />
<span id="more-607"></span></p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# umount /dev/ad4s1g
umount: unmount of /dev/ad4s1g failed: Device busy
</pre>
<p>Если видим такое, используем флаг -f. Далее нам необходмио сгенерировать ключ, которым будет подписан раздел. Делаем просто:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# dd if=/dev/random of=/usr/local/etc/keys/my.key bs=1 count=256
# chmod 600 /usr/local/etc/keys/my.key
</pre>
<p>Этим действием мы создали ключ длинной 256 bit.<br />
Дальше инициализируем раздел и подписываем ключом:<br />
-I 256 &#8212; используем ключ длинной 256 bit<br />
-P &#8212; шифруем раздел без пароля. Если убрать эту опцию будет запрошен пароль при каждой попытке монтирования. Советую не использовать пароль, если вы шифруете системные диски, которые монтируются при загрузке.<br />
-K &#8212; путь к ключу<br />
/dev/ad4s1g &#8212; путь к девайсу</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# geli init -P -l 256 -s 4096 -K /usr/local/etc/keys/my.key /dev/ad4s1g
</pre>
<p>Мы только что инициализировали шифрованый раздел и подписали его нашим ключом. Напомню, что по умолчанию GELI использует алгоритм шифрования AES, если вам по каким-либо причинам нужно использовать другой алгоритм, это можно сделать добавив опцию -e. Включена поддержка алгоритмов AES, Blowfish, Camellia, а также морально и технически устаревшего 3DES.<br />
Присоединяем раздел:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# geli attach -p -k /etc/geli/server.key /dev/ad4s1g
</pre>
<p>После этого мы должны увидеть наш криптованый девайс:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# ls -l /dev/ad4s1g*
crw-r-----  1 root  operator    0,  90  2 фев 20:50 /dev/ad4s1g
crw-r-----  1 root  operator    0, 139  2 фев 20:50 /dev/ad4s1g.eli
</pre>
<p>Девайс имеет приставку .eli и любые обращения к этому девайсу будут пропущены через криптомашину и осядут в /dev/ad4s1g уже в шифрованном виде.<br />
Следующий шаг может быть пропущен, но если мы подходим к защите наших данных серьезно, мы обязаны его выполнить. Сейчас мы будем заполнять поверхность диска случайными данными. Обьясню для чего это нужно. Во-первых, &#8212; после того, как мы инициализировали шифрованый девайс, новые данные на него будут писаться уже в шифрованном виде, однако те данные, которые были на нем ранее еще можно вытащить. Во-вторых, &#8212; эту процедуру необходимо проделать, даже если вы шифруете новенький винт/флешку etc. Если кто-то захочет посмотреть на кол-во данных на винчестере &#8212; он увидит под зявязку забытый веник. Процедура может занять достаточно большое кол-во времени, по сему, запускаем и идем пить чай или спать:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# dd if=/dev/random of=/dev/ad4s1g.eli bs=1M
</pre>
<p>Как известно уилита DD не славится своей информативностью во время выполнения заданий. Для исправления ситуации предлагаю следующий workaround:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# killall -INFO dd
</pre>
<p>После этой команды dd единоразово выдаст в стдаут немного информации.<br />
После этого, мы наконец-то можем создать новую ФС и примонтировать девайс:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# newfs /dev/ad4s1g.eli
# mkdir /cryptFS
# mount /dev/ad4s1g.eli /cryptFS
</pre>
<p>Поздравляю. Девайс готов к использованию. Для отмонтирования выполняем последовательно:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# umount /dev/ad4s1g.eli
# geli detach /dev/ad4s1g.eli
</pre>
<p>На последок, по доброй традиции оптимизируем процесс сетапа, монтирования и размонтирования разделов, путем стругания очередного скрипта. Листинг я приводить не буду, ибо скрип получился не маленький (150 строк), но обьясню ключевые моменты. Качаем скрипт и делаем его исполняемым:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# fetch http://myjournal.org.ua/wp-content/uploads/2010/02/crypt.sh
# chmod +x crypt.sh
</pre>
<p>Дальше редактируем в скрипте переменные:<br />
<em>mount_path</em> &#8212; папка для монтирования<br />
<em>key</em> &#8212; созданный нами ранее ключ (можем закоментировать эту опцию, тогда при монтировании или сетапе вас об этом спросят)<br />
<em>chowner </em>- этому овнеру будет разрешено писать в крипто-папку<br />
<em>device </em>- путь к девайсу (без приставки .eli)<br />
Также вы можете закоментировать вообще все переменные, тогда скрипт будет каждый раз вас спрашивать, а овнером будет назначен root:wheel. Сделаем ссылку на скрипт и попытаемся смонтировать и отмонтировать диск:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# ln -s /path/to/crypt.sh /bin/crypt
# crypt -m
*** Mount /dev/ad4s1g
*** Device mount to folder /storage/samba/home/Encryption
# crypt -u
*** Umount /dev/ad4s1g
# crypt -u
*** Device /dev/ad4s1g already umount. Use /bin/crypt -m for mount.
</pre>
<p>Также, если лень инициализировать, форматировать и создавать ключи руками, коментим все переменные и запускаем:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# crypt -s
Enter full path to device [/dev/ad4s1g]: /dev/ad4s1g
Enter full path to key or type create for new key: /storage/samba/home/keys/berezhinskiy.key

+---------------------------------------+
|              WARNING!!!               |
| This operation will destroy all data  |
|          on selected slice            |
+---------------------------------------+
*** Device: /dev/ad4s1g

Confirm this action [yes|no]: yes
*** Starting encrypt device /dev/ad4s1g
*** Umount /dev/ad4s1g
*** Signature device key
*** Creating newfs from /dev/ad4s1g
Do you want to mount the disk now? [yes|no]: yes
Path for mount encryption device [/home/crypt]: /storage/samba/home/Encryption
*** Mount /dev/ad4s1g
*** Device mount to folder /storage/samba/home/Encryption
</pre>
<p>Вот и все. В следующей статье на эту тему я расскажу о том, как зашифровать все системные разделы и грузить ключ с usb flash, а может быть и бутиться мы будем тоже с флешки :)</p>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2010/02/encryption-device-freebsd/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2010/02/encryption-device-freebsd/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2010%2F02%2Fencryption-device-freebsd%2F&amp;title=%D0%A8%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%20%D0%B2%20FreeBSD" id="wpa2a_16">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2010/02/encryption-device-freebsd/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Реклама BSOD</title>
		<link>http://yaroslav.berezhinskiy.name/2010/01/ibox-bsod/</link>
		<comments>http://yaroslav.berezhinskiy.name/2010/01/ibox-bsod/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 16:13:46 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[Юмор]]></category>
		<category><![CDATA[bsod]]></category>
		<category><![CDATA[ibox]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[глюки]]></category>

		<guid isPermaLink="false">http://myjournal.org.ua/?p=603</guid>
		<description><![CDATA[Сегодня был на станции метро Святошин, видать с запуском рекламы Windows 7 на айбоксах начали рекламировать BSODы :)]]></description>
			<content:encoded><![CDATA[<p>Сегодня был на станции метро Святошин, видать с запуском рекламы Windows 7 на айбоксах начали рекламировать BSODы :)<br />
<a href="http://myjournal.org.ua/wp-content/uploads/2010/01/bsod_ibox.jpg"><img src="http://myjournal.org.ua/wp-content/uploads/2010/01/bsod_ibox-225x300.jpg" alt="bsod_ibox" title="bsod_ibox" width="225" height="300" class="aligncenter size-medium wp-image-604" /></a></p>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2010/01/ibox-bsod/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2010/01/ibox-bsod/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2010%2F01%2Fibox-bsod%2F&amp;title=%D0%A0%D0%B5%D0%BA%D0%BB%D0%B0%D0%BC%D0%B0%20BSOD" id="wpa2a_18">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2010/01/ibox-bsod/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Контролируем провайдера</title>
		<link>http://yaroslav.berezhinskiy.name/2010/01/uptime-provider/</link>
		<comments>http://yaroslav.berezhinskiy.name/2010/01/uptime-provider/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 11:10:52 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[bash]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Corbina]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[SLA]]></category>
		<category><![CDATA[uptime]]></category>

		<guid isPermaLink="false">http://myjournal.org.ua/?p=529</guid>
		<description><![CDATA[Всем сомнивающимся в количестве предоставляемых интернет-услуг, посвящается :) Я живу в Киеве, пользуюсь услугами провайдера Corbina Telecom (не путайте с Русской Corbin&#8217;ой), чем вполне доволен. За 20$ в месяц я имею неплохой канал шириной 100Mbit по &#171;Украине&#187; и 25Mbit в &#171;мир&#187;. Есть у меня балконная домашняя зверушка, которая шуршит кулерами и работает в режиме 24/7. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: right;">Всем сомнивающимся в количестве предоставляемых интернет-услуг, посвящается :)</p>
<p>Я живу в Киеве, пользуюсь услугами провайдера Corbina Telecom (не путайте с Русской Corbin&#8217;ой), чем вполне доволен. За 20$ в месяц я имею неплохой канал шириной 100Mbit по &#171;Украине&#187; и 25Mbit в &#171;мир&#187;. Есть у меня балконная домашняя зверушка, которая шуршит кулерами и работает в режиме 24/7. Используется для разных полезных и не очень целей: гейт для локалки, прокся, впн, файлопомойка, хостинг (в том числе хостит MyJournal.org.ua) etc. Заморочился я как-то вопросом статистики аптайма моего канала. Вот что с этого вышло:<br />
<span id="more-529"></span><br />
Открываем наш любимый mcedit/vim/ee/nano/notepad/word/photoshop o_O и рисуем скрипт:</p>
<pre class="brush: bash; title: ; toolbar: true; notranslate">
#!/bin/sh

###################################################
#                                                 #
#    Scripts for monitoring internet-link         #
#    Usage in cron:                               #
#    1 * * * * /path/to/script &gt;/dev/null 2&gt;&amp;1    #
#                                                 #
###################################################

#-------------------------------------------------#
#                  VARIABLE                       #
#-------------------------------------------------#

existip=192.5.5.241             # NS Internet Systems Consortium (ns.isc.org)
pid_file=/var/run/internet.pid  # Lock file
log_file=/var/log/internet.log  # Log file
dhcp=yes                        # Use dhcp?
dhcp_if=net0                    # DHCP external interface

#-------------------------------------------------#
#                    BODY                         #
#-------------------------------------------------#

nr=&quot;&quot;
ni=&quot;&quot;
my_name=$0
pid=$$

if [ ! -f $log_file ];then
        touch $log_file
        echo &quot; +------------------------------------------&quot; &gt;&gt; $log_file
        echo &quot; | A new file is created &quot; `date &quot;+%Y-%m-%d&quot;` &gt;&gt; $log_file
        echo &quot; +------------------------------------------&quot; &gt;&gt; $log_file
fi

if [ -f $pid_file ];then
    old_pid=`cat ${pid_file}`
    result=`ps aux | grep &quot;${old_pid}&quot; | grep &quot;${my_name}&quot;`
        if [ &quot;${result}&quot; ]; then
            exit 255
        fi
fi

echo ${pid} &gt; ${pid_file}

while !(test $ni);do
    if !(/sbin/ping -c 2 ${existip}) &gt;/dev/null 2&gt;&amp;1;then
        if !(test $nr);then
            nr=1
            timeobr=`date &quot;+%H:%M:%S&quot;`
        fi
        if [ ${dhcp} = yes ];then
            killall dhclient &gt;/dev/null 2&gt;&amp;1
            sleep 1
            /sbin/dhclient $dhcp_if &gt;/dev/null 2&gt;&amp;1
            sleep 3
        else
            sleep 3
        fi
    else
        if (test $nr);then
            echo `date &quot;+%Y-%m-%d`&quot; Internet was absent from $timeobr to &quot;`date &quot;+%H:%M:%S&quot;` &gt;&gt; $log_file
        fi
        ni=1
    fi
done

if [ -f ${pid_file} ]; then
    rm ${pid_file}
fi
</pre>
<p>Скрипт пингует указанный вами адрес, если он не доступен предполагает что канал умер, запоминает время падения, пишет пид в файл и входит в цикл, до тех пор пока не запингуется снова. После успешного пинга отписывает в лог-файл что, дескать, <a href="http://lurkmore.ru/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82%D1%8B">интернетов</a> небыло со стольки-то до стольки-то, после чего стирает пид и завершает работу до следующего старта. Пихаем в крон для запуска каждую минуту:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
1 * * * * /usr/local/etc/scripts/internet.sh &gt;/dev/null 2&gt;&amp;1
</pre>
<p>&#8230;Прошел годик-полтора и лог файл вырос в несколько тыщ строк, читать их стало, мягко говоря, затруднительно, да и пропускать незначительные подения какнала в 20-30 секунд стало тоже напряжно. Избавляемся от головной боли. Берем в руки перл и стругаем скрипт:</p>
<pre class="brush: perl; title: ; toolbar: true; notranslate">
#!/usr/bin/perl

###################################################
#                                                 #
#    Scripts for parsing internet-down log file   #
#    Usage:                                       #
#    /path/to/script YYYY MM                      #
#                                                 #
###################################################

#-------------------------------------------------#
#                  VARIABLE                       #
#-------------------------------------------------#

$logfile=&quot;/var/log/internet.log&quot;; # Path to log file

#-------------------------------------------------#
#                    BODY                         #
#-------------------------------------------------#

open(INTERNET, &quot;&lt;$logfile&quot;) || die(&quot;$0: could not open file: $!&quot;);

print &quot;------------+------------------------+\n&quot;;
print (&quot;Date        |\tHOUR\tMIN\tSEC  |\n&quot;);
print &quot;------------+------------------------+\n&quot;;

while (&lt;INTERNET&gt;){
    $str = $_;
    if ( $srt = ~ /(\d{4}-\d{2}-\d{2}).*(\d{2}:\d{2}:\d{2}).*(\d{2}:\d{2}:\d{2})/ ) {
        my $date = $1;
        my $time1 = $2;
        my $time2 = $3;

        ($year, $month, $day)=split('-',$date);
        ($from_hour, $from_min, $from_sec)=split(':',$time1);
        ($to_hour, $to_min, $to_sec)=split(':',$time2);

        $from_main = $from_hour*3600+$from_min*60+$from_sec;
        $to_main = $to_hour*3600+$to_min*60+$to_sec;
        $downtime = ($to_main - $from_main);
        if ( $downtime &gt; 30 and $year == $ARGV[0] and $month == $ARGV[1]){
            $downtime_all = $downtime_all+$downtime;
            $unit = &quot;seconds&quot;;
            if ( $downtime &lt; 3600) {
                $hour = 0;
                $min = int($downtime/60);
                $sec = $downtime-$min*60;
            }
            if ( $downtime &gt; 3600) {
                $hour = int($downtime/3600);
                $minsec = $downtime-$hour*3600;
                $min = int($minsec/60);
                $sec = $downtime-($hour*3600+$min*60);
            }
                $sec = sprintf(&quot;%02d&quot;,$sec);
                $min = sprintf(&quot;%02d&quot;,$min);
                $hour = sprintf(&quot;%02d&quot;,$hour);
                print &quot;$date  |\t$hour\t$min\t$sec   |\n&quot;;
        }
    }
}
if ( $downtime_all &lt; 3600 ) {
    $hour = 0;
    $min = int($downtime_all/60);
    $sec = $downtime_all-$min*60;
}
if ( $downtime_all &gt; 3600 ) {
    $hour = int($downtime_all/3600);
    $minsec = $downtime_all-$hour*3600;
    $min = int($minsec/60);
    $sec = $downtime_all-($hour*3600+$min*60);
}
$sec = sprintf(&quot;%02d&quot;,$sec);
$min = sprintf(&quot;%02d&quot;,$min);
$hour = sprintf(&quot;%02d&quot;,$hour);
print &quot;------------+------------------------+\n&quot;;
print &quot;All downtime:\t$hour\t$min\t$sec   |\n&quot;;
print &quot;------------+------------------------+\n&quot;;
</pre>
<p>Скрипт парсит наш лог-файл, и выводит время даунтайма в красивом и понятном виде. Рекомендую к пользованию в скриптах статистики. Запуск и вывод:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# ./downtime.pl 2010 01
------------+------------------------+
Date        |   HOUR    MIN     SEC  |
------------+------------------------+
2010-01-02  |   00      00      45   |
2010-01-05  |   00      09      14   |
2010-01-06  |   00      14      05   |
2010-01-06  |   00      00      54   |
2010-01-10  |   00      00      33   |
2010-01-11  |   00      00      34   |
2010-01-11  |   00      00      33   |
------------+------------------------+
All downtime:   00      26      38   |
------------+------------------------+
</pre>
<p>Подводим итоги. За весь 2009 год у меня небыло интернета по вине провайдера почти 67 часов. Тоесть процент даунтайма меньше 1%, чему я, безусловно, рад. Спасибо за хорошую теническую работу.</p>
<p><strong>UDP</strong> Не сочтите за рекламу. Мне действительно приятно, что Украина хоть немного пытается соответствовать мировым стандартам, приятно что витуха лежит в гофре, приятно видеть аккуратные шкафчики для свичей в подьездах, приятно знать что в шкафчиках управляемые свичи, а не барахло с радиорынка&#8230;<br />
Но нам еще расти и расти до того момента, пока мы начнем понимать что главный в Вашем &#171;бизнесе&#187;, дорогой провайдер &#8212; Клиент, а значит отношение должно быть соответствующее.</p>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2010/01/uptime-provider/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2010/01/uptime-provider/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2010%2F01%2Fuptime-provider%2F&amp;title=%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B8%D1%80%D1%83%D0%B5%D0%BC%20%D0%BF%D1%80%D0%BE%D0%B2%D0%B0%D0%B9%D0%B4%D0%B5%D1%80%D0%B0" id="wpa2a_20">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2010/01/uptime-provider/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FreeBSD Kernel NAT</title>
		<link>http://yaroslav.berezhinskiy.name/2009/11/freebsd-kernel-nat/</link>
		<comments>http://yaroslav.berezhinskiy.name/2009/11/freebsd-kernel-nat/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 19:02:54 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[ipfw]]></category>
		<category><![CDATA[kernel nat]]></category>
		<category><![CDATA[natd]]></category>
		<category><![CDATA[redirect port]]></category>
		<category><![CDATA[WD GreenPower]]></category>

		<guid isPermaLink="false">http://myjournal.org.ua/?p=479</guid>
		<description><![CDATA[Купил я себе новый HDD: WD GreenPower, емкостью 1 TB. Цель покупки &#8212; файло/медиапомойка. Организация любой помойки, при условии анлимного канала и аккаунта на torrents.ru &#8212; дело пустяковое. Через некоторое время активного использования торента (больше 20 раздач со скоростью > 1 Mb) начал замечать такую картину: Мало того, что natd светит адреса внутренних хостов, так [...]]]></description>
			<content:encoded><![CDATA[<p>Купил я себе новый HDD: WD GreenPower, емкостью 1 TB. Цель покупки &#8212; файло/медиапомойка. Организация любой помойки, при условии анлимного канала и аккаунта на torrents.ru &#8212; дело пустяковое. Через некоторое время активного использования торента (больше 20 раздач со скоростью > 1 Mb) начал замечать такую картину:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# top | grep natd
42549 root          1  45    0  9408K  2856K select   0:01  7.78% natd
</pre>
<p>Мало того, что natd светит адреса внутренних хостов, так он еще нехило потребляет системные ресурсы. Решено было переходить на &#171;ядерный&#187; нат. Добавляем в конфиг ядра опции для поддержки ipfw и ipfw nat:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
options         IPFIREWALL
options         IPFIREWALL_FORWARD
options         IPFIREWALL_VERBOSE
options         IPFIREWALL_VERBOSE_LIMIT=1000
options         IPFIREWALL_NAT
options         LIBALIAS
options         IPDIVERT
options         DUMMYNET
</pre>
<p>Далее:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# cd /usr/src
# make buildkernel KERNCONF=NEW_MY_CONF
....
# make installkernel KERNCONF=NEW_MY_CONF
</pre>
<p>Ребутимся и редактируем скрипт ipfw. Коментим те строки, где были правила divert и заменяем на правила ipfw nat:<br />
<span id="more-479"></span></p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
#       ${fwcmd} add divert natd all from any to any via ${inet_if}
#       ${fwcmd} add divert natd all from any to any via lo0

         ${fwcmd} nat 1 config ip ${inet_ip} log same_ports unreg_only
         ${fwcmd} add nat 1 all from ${lan_net} to any
         ${fwcmd} add nat 1 all from any to ${inet_ip}
</pre>
<p>, где ${inet_if} &#8212; интерфейс смотрящий &#171;наружу&#187;, ${lan_net} &#8212; внутренняя сеть (192.168.0.1/24), ${inet_ip} &#8212; внешняя пиха.<br />
unreg_only говорит ipfw натить только частные сети<br />
same_ports пытается оставлять те же номера портов<br />
Дальше нам нужно остановить нат:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# /etc/rc.d/natd stop
</pre>
<p>Дальше комментируем все строки связанные с natd в /etc/rc.conf и перегружаем правила ipfw. Проверяем работу kernel nat и наслаждаемся всеми его преимуществами.</p>
<p><strong>P.S.</strong> Для того, чтобы пробросить порт внутрь локальной сети, конфигурация ipfw nat должна выглядеть так:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
        ${fwcmd} nat 1 config ip ${inet_ip} unreg_only same_ports log redirect_port tcp 192.168.0.17:80 80
        ${fwcmd} add nat 1 all from ${lan_net} to any
        ${fwcmd} add nat 1 all from any to ${inet_ip}
</pre>
<p>Это будет означать что мы прокидываем все входящие tcp пакеты адресованные 80 порту на внешнем IP на 80 порт машины с адресом 192.168.0.17 </p>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2009/11/freebsd-kernel-nat/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2009/11/freebsd-kernel-nat/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2009%2F11%2Ffreebsd-kernel-nat%2F&amp;title=FreeBSD%20Kernel%20NAT" id="wpa2a_22">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2009/11/freebsd-kernel-nat/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Инсталляция FreeBSD с USB flash</title>
		<link>http://yaroslav.berezhinskiy.name/2009/11/install_freebsd_from_usb_flash/</link>
		<comments>http://yaroslav.berezhinskiy.name/2009/11/install_freebsd_from_usb_flash/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 10:03:37 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[freebsd с флешки]]></category>
		<category><![CDATA[install freebsd from usb]]></category>
		<category><![CDATA[usb freebsd]]></category>
		<category><![CDATA[инсталляция freebsd]]></category>
		<category><![CDATA[установка с flash]]></category>

		<guid isPermaLink="false">http://myjournal.org.ua/?p=443</guid>
		<description><![CDATA[Интернет кишит сложными подходами и зачастую не понятными реализациями этих простых действий. Я попытаюсь в разы упростить процесс создания загрузочного диска и инсталляции ОС в отсутствии CD драйва. После, мы напишем небольшой скрипт для автоматизации этого не хитрого процесса. Приступим. Моя флешка определяется у меня как da0 Будте внимательны с именами устройств, так как у [...]]]></description>
			<content:encoded><![CDATA[<p>Интернет кишит сложными подходами и зачастую не понятными реализациями этих простых действий. Я попытаюсь в разы упростить процесс создания загрузочного диска и инсталляции ОС в отсутствии CD драйва. После, мы напишем небольшой скрипт для автоматизации этого не хитрого процесса. Приступим.<br />
Моя флешка определяется у меня как da0<br />
<em>Будте внимательны с именами устройств, так как у Вас есть отличная возможность затереть нужный системный раздел.</em><br />
Создаем новый слайс, используя полный объем флешки:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# fdisk -I /dev/da0
</pre>
<p>Создаем label для размеченного раздела:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# bsdlabel -w -B /dev/da0s1
</pre>
<p>Форматируем раздел:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# newfs -f 8192 -b 65536 -U -o time /dev/da0s1a
</pre>
<p>Монтируем созданный  раздел в каталог /mnt</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# mount /dev/da0s1a /mnt
</pre>
<p>Теперь нам нужно скопировать содержимое образа FreeBSD на нашу флешку и отмонтировать накопитель. Для этих целей я использую DVD образ с сайта freebsd.org<br />
<span id="more-443"></span></p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# tar -C /mnt -xzf 7.2-RC2-i386-dvd1.iso.gz
# umount /mnt
</pre>
<p>Спешу вас поздравить. Процесс создания загрузочного диска завершен. Теперь переходим к фазе установки ОС, где нам предстоит проделать еще несколько нехитрых операций.<br />
Выставляем в BIOS загрузку с USB-HDD и начинаем грузиться. Несколько дальнейших операций я буду сопровожать скриншотами из терминала. Тут будут описаны только те шаги, которые отличаются от стандартной установки системы. После загрузки выбираем локацию и переходим в меню Configure:</p>
<p><a href="http://myjournal.org.ua/wp-content/uploads/2009/11/boot02.png"><img src="http://myjournal.org.ua/wp-content/uploads/2009/11/boot02-300x166.png" alt="boot02" title="boot02" width="300" height="166" class="aligncenter size-medium wp-image-458" /></a></p>
<p>В Configure выбираем fdisk, на системном диске (у меня это ad2) создаем freebsd-слайс и делаем его загрузочным. Далее инсталятор перейдет к диску ad0. Ничего с ним не делаем! это наша флешка! Просто нажимаем q для выхода из fdisk:</p>
<p><a href="http://myjournal.org.ua/wp-content/uploads/2009/11/boot03.png"><img src="http://myjournal.org.ua/wp-content/uploads/2009/11/boot03-300x165.png" alt="boot03" title="boot03" width="300" height="165" class="aligncenter size-medium wp-image-459" /></a><br />
Топаем в Label:</p>
<p><a href="http://myjournal.org.ua/wp-content/uploads/2009/11/boot04.png"><img src="http://myjournal.org.ua/wp-content/uploads/2009/11/boot04-300x166.png" alt="boot04" title="boot04" width="300" height="166" class="aligncenter size-medium wp-image-460" /></a></p>
<p>Размечаем системный диск ad2 стандартным для Вас образом. Далее в списке партиций мы видим нашу флешку (ad0s1a), выделяем её и жмем M для того, чтобы задать для нее точку монтирования. Пишем там /mnt:</p>
<p><a href="http://myjournal.org.ua/wp-content/uploads/2009/11/boot05.png"><img src="http://myjournal.org.ua/wp-content/uploads/2009/11/boot05-300x166.png" alt="boot05" title="boot05" width="300" height="166" class="aligncenter size-medium wp-image-461" /></a></p>
<p>Следующий шаг &#8212; указание источника для установки. В окне с просьбой &#171;Choose Installation Media&#187; выбираем 7 пункт: File System (установка с файловой системы). И вводим путь к каталогу с дистрибутивом freebsd, который находится на нашей флешке:</p>
<p><a href="http://myjournal.org.ua/wp-content/uploads/2009/11/boot06.png"><img src="http://myjournal.org.ua/wp-content/uploads/2009/11/boot06-300x165.png" alt="boot06" title="boot06" width="300" height="165" class="aligncenter size-medium wp-image-462" /></a></p>
<p>Ждем окончания процесса инсталляции:</p>
<p><a href="http://myjournal.org.ua/wp-content/uploads/2009/11/boot07.png"><img src="http://myjournal.org.ua/wp-content/uploads/2009/11/boot07-300x165.png" alt="boot07" title="boot07" width="300" height="165" class="aligncenter size-medium wp-image-463" /></a></p>
<p>Поздравляю! Вы только что установили freebsd с USB Flash драйва. Теперь осталось написать скрип для автоматизации процесса создания загрузочной флешки:</p>
<pre class="brush: bash; title: ; toolbar: true; notranslate">
#!/bin/sh

echo -n &quot;Enter flash drive name [da0]: &quot;
read drive_name

if [ -n ${drive_name} ] ; then
    drive_name=da0
fi

fdisk -I /dev/${drive_name}
bsdlabel -w -B /dev/${drive_name}s1
newfs -f 8192 -b 65536 -U -o time /dev/${drive_name}s1a
mount /dev/da0s1a /mnt
tar -C /mnt -xzf $1
umount /mnt
</pre>
<p>Запускаем так:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# crate_usb_boot.sh 7.2-RC2-i386-dvd1.iso.gz
</pre>
<p>, где 7.2-RC2-i386-dvd1.iso.gz путь к скаченому дистрибутиву.</p>
<p><strong>P.S.</strong> По окончании инсталляции убираем в BIOS&#8217;e загрузку с USB-HDD, но флешку не вынимаем.  После загрузки ОС не забываем отредактировать файл /etc/fstab, убрав из него строку с монтированием флешки в /mnt. Теперь можем извлечь накопитель и ребутнуться в нормальном режиме.</p>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2009/11/install_freebsd_from_usb_flash/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2009/11/install_freebsd_from_usb_flash/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2009%2F11%2Finstall_freebsd_from_usb_flash%2F&amp;title=%D0%98%D0%BD%D1%81%D1%82%D0%B0%D0%BB%D0%BB%D1%8F%D1%86%D0%B8%D1%8F%20FreeBSD%20%D1%81%20USB%20flash" id="wpa2a_24">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2009/11/install_freebsd_from_usb_flash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ArpGuard</title>
		<link>http://yaroslav.berezhinskiy.name/2009/11/arpguard/</link>
		<comments>http://yaroslav.berezhinskiy.name/2009/11/arpguard/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 16:27:29 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ARP]]></category>
		<category><![CDATA[ARPGuard]]></category>
		<category><![CDATA[защита от статического ip]]></category>
		<category><![CDATA[протокол arp]]></category>

		<guid isPermaLink="false">http://myjournal.org.ua/?p=366</guid>
		<description><![CDATA[Теория Вот что говорит нам о протоколе ARP педивикия: ARP (англ. Address Resolution Protocol — протокол разрешения адресов) — протокол канального уровня (англ. Data Link layer), предназначенный для преобразования IP-адресов (адресов сетевого уровня) в MAC-адреса (адреса канального уровня) в сетях TCP/IP. Более простыми словами можно сказать что ARP отвечает за соответствие пары IP-MAC.  ARP данные [...]]]></description>
			<content:encoded><![CDATA[<h2>Теория</h2>
<p>Вот что говорит нам о протоколе ARP <a href="http://ru.wikipedia.org/wiki/ARP" target="_blank">педивикия</a>:</p>
<blockquote><p>ARP (англ. Address Resolution Protocol — протокол разрешения адресов) — протокол канального уровня (англ. Data Link layer), предназначенный для преобразования IP-адресов (адресов сетевого уровня) в MAC-адреса (адреса канального уровня) в сетях TCP/IP.</p></blockquote>
<p style="text-align: justify; ">Более простыми словами можно сказать что ARP отвечает за соответствие пары IP-MAC.  ARP данные образуют кеш (таблицу) примерно такого вида:</p>
<p>(84.234.56.5) at 00:e0:4c:7e:e1:0c on net0<br />
(192.168.0.1) at 00:e0:4c:5a:dd:e6 on lan0<br />
(192.168.0.10) at 00:1c:bf:c6:b1:b7 on lan0</p>
<p style="text-align: justify; ">Таблица может быть динамической или статической. В случае динамического ARP-кеша, новые пары добавляются в него автоматически, путем ответа на широковещательный ARP-запрос. В противном случае на широковещательный запрос ответ не генерируется, а записи в таблицу нужно вносить руками. Чем нам может быть полезна статическая таблица?</p>
<p><span id="more-366"></span> 1) как средство защиты от подмены ip адресов;<br />
2) инструмент для бана хостов по MAC-адресу;<br />
3) защита от вручную сконфигурированных параметров сети;</p>
<p>Разберем по пунктам.</p>
<p style="text-align: justify; ">1) Средство защиты от подмены ip адресов.<br />
Вы администратор небольшой локальной сети, трафик на Вашем предприятии не анлимный и стоит денег. Каждый месяц Вы носите отчеты по использованию трафика работниками шефу. Отчеты генерируются по ip адресам сотрудников, ip жестко привязаны к MAC-адресам и прописаны на DHCP сервере. Так бы и жили долго и счастливо, &#8230;если бы не младший бухгалтер Вася. Вася, как оказалось в последствии, очень любил французские мелодрамы, но интернетов у него дома небыло, а брать фильмы в прокате &#8212; жаба давила.  И тут один далекий знакомый Василия рассказал ему как можно и фильмы смотреть, и деньги экономить. На следующий день, когда все разошлись на обед, Василий полез&#8230; Полез в свойства протокола TCP/IP и присвоил себе ip адрес главбуха&#8230; Окрыленный своей победой, Василий начал качать гигабайты мелодрам&#8230; В конце-концов, шеф списывает с З/П главбуха сумму, эквивалентную потраченным гигабайтам. А потом шум&#8230; гам&#8230; главбух орет: &#187; Не может быть! Это не я! Я не качала! И вообще не люблю я французские фильмы!!!&#187;&#8230; шеф тычит в нее Вашим отчетом о потраченном трафике&#8230; одним словом, дурдом. Вопрос решать надо и шеф нанимает для расследования консалтинговую компанию &#171;Нет проблем&#187;. В ходе расследования &#171;Нет проблем&#187; находит в кеше браузера Василия следы пребывания на искомых сайтах. А дальше все просто: Вы (из-за своей некомпетенции) и Василий (из-за своего жлобства) делят поровну долги за перерасход трафика и оплачивают работу компании &#171;Нет проблем&#187;.<br />
Все было бы иначе, если бы Вы использовали статическую ARP-таблицу. После подмены Василием ip адреса, шлюз не пустил бы его в интернеты из-за несоответствия пары IP-MAC. Тут стоит оговорится что это далеко не панацея от подмены адреса, так как MAC тоже может быть заменен на фальшивый, но не верю я что Василий справился бы с этой задачей.</p>
<p style="text-align: justify; ">2) инструмент для бана хостов по MAC-адресу.<br />
Если Вы любитель отстроить и забыть &#8212; это может Вам пригодится. Ибо больше не надо перегружать правила фаервола или рестартовать сквид. Можно приспособить под эти нужды статическую ARP-таблицу. Достаточно заменить в ней правильный MAC-адрес на не соответствующий адаптеру и забаненый юзер не пройдет дальше локальной сети.</p>
<p style="text-align: justify; ">3) защита от вручную сконфигурированных параметров сети.<br />
Если с первыми двумя примерами все достаточно ясно, то тут могут появится вопросы. Уточнение: тут пойдет речь не о &#171;подмене&#187; ip, а о банальном проникновении в сеть изнутри с целью посканить, поспуфить и выведать сурьезные коммерческие тайны. Что может помешать нам вручную указать IP не использующийся в локальной сети вообще? Верно. Статическая ARP-таблица. Тут у внимательного читателя должен возникнуть вопрос: &#171;Каким образом она может помешать, если IP, который поставит злоумышленник, вообще нет в сети&#187;. А кто Вам сказал что его нет? В этом и заключается хитрость &#8212; он есть. Фактически в сети может присутствовать сколь угодно мало хостов, вплоть до двух, но наша статическая таблица будет содержать все 255 возможных записей для каждого IP, в каждой подсети. Реальные IP адреса будут иметь свои реальные MAC&#8217;и, а остальные IP свои поддельные. В таком случае при попытке указать любой IP вручную, ОС расскажет Вам о том, что этот IP в данный момент занят и использовать его нельзя.</p>
<h2>От теории к практике</h2>
<p style="text-align: justify; ">Для того, чтобы увидеть ARP таблицу, достаточно ввести в терминале:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
#arp -an
? (192.168.0.1) at 00:00:00:00:00:00 on lan0 permanent published [ethernet]
? (192.168.0.2) at 00:00:00:00:00:00 on lan0 permanent published [ethernet]
? (192.168.0.3) at 00:00:00:00:00:00 on lan0 permanent published [ethernet]
? (192.168.0.4) at 00:00:00:00:00:00 on lan0 permanent published [ethernet]
</pre>
<p>Параметр -n говорит ARP&#8217;у о том, что не надо резолвить DNS имена хостов. Для того, чтобы очистить таблицу:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
#arp -da
192.168.0.1 (192.168.0.1) deleted
192.168.0.2 (192.168.0.2) deleted
192.168.0.3 (192.168.0.3) deleted
192.168.0.4 (192.168.0.4) deleted
</pre>
<p>Внести запись в таблицу о новой паре, а также забанить по MAC, для примера, написав нулевой. Не забываем, если arp-запись уже существует, сначала ее нужно удалить, и только потом добавлять новую. Ключа для изменения уже существующей, увы, нет:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
#arp -d 192.168.0.2
#arp -s 192.168.0.2 00:00:00:00:00:00 pub
</pre>
<p>Необходимо учитывать что ARP-таблица существует в памяти до первой перезагрузки. Такое положение вещей нас совсем не устраивает, если мы собираемся внедрять защиту от &#171;вручную&#187; выставленных IP. По этому &#8212; рисуем скрипт для автоматического обновления ARP-кеша, который и назовем ArpGuard.sh:</p>
<pre class="brush: bash; title: ; toolbar: true; notranslate">
#!/bin/sh
#
# Variable
#
config=&quot;/usr/local/etc/arpguard.conf&quot;
#
# Functions
#
Usage ()
{
echo &quot;Usage: `basename $0` {command}&quot;
echo &quot;&quot;
echo &quot;Command:&quot;
echo &quot;--------&quot;
echo &quot;start              - clear all arp records and load mac-list&quot;
echo &quot;stop               - clear all arp records&quot;
echo &quot;restart            - Such as start (for compatiblity)&quot;
echo &quot;status             - lists all arp records&quot;
echo &quot;deny {ip}          - deny access for specify ip-addr&quot;
echo &quot;clear {ip}         - clear arp record for specify ip-addr&quot;
echo &quot;info {ip}          - print info for specify ip-addr&quot;
echo &quot;owner {key}        - search for keyword in mac-list's comments&quot;
echo &quot;fill {net} {i} {k} - fill mac-list by null-records from net.i to net.k&quot;
}
#
CheckArg ()
{
        if [ -z &quot;$1&quot; ]; then
            Usage
            exit 1
        fi
}
#
# Start script
#
echo &quot;ArpGuard/fbsd v.2.0&quot;
#
case $1 in
start)
        printf &quot; * Clearing all arp records...&quot;
        arp -da &gt; /dev/null 2&gt;&amp;1
        printf &quot;                                        [ Ok ]\n&quot;
        printf &quot; * Loading mac-list...&quot;
        arp -f ${config} &gt; /dev/null 2&gt;&amp;1
        printf &quot;                                                [ Ok ]\n&quot;
        ;;
stop)
        printf &quot; * Clearing all arp records...&quot;
        arp -da &gt; /dev/null 2&gt;&amp;1
        printf &quot;                                        [ Ok ]\n&quot;
        ;;
restart)
        printf &quot; * Clearing all arp records...&quot;
        arp -da &gt; /dev/null 2&gt;&amp;1
        printf &quot;                                        [ Ok ]\n&quot;
        printf &quot; * Loading mac-list...&quot;
        arp -f ${config} &gt; /dev/null 2&gt;&amp;1
        printf &quot;                                                [ Ok ]\n&quot;
        ;;
status)
        arp -an
        ;;
deny)
        CheckArg &quot;$2&quot;
        printf &quot; * Deny access for ip-address $2...&quot;
        arp -d $2 &gt; /dev/null 2&gt;&amp;1
        arp -s $2 00:00:00:00:00:00 pub &gt; /dev/null 2&gt;&amp;1
        printf &quot;                        [ Ok ]\n&quot;
        ;;
clear)
        CheckArg &quot;$2&quot;
        printf &quot; * Clearing record for ip-address $2...&quot;
        arp -d $2 &gt; /dev/null 2&gt;&amp;1
        printf &quot;                [ Ok ]\n&quot;
        ;;
info)
        CheckArg &quot;$2&quot;
        arp $2
        comment=`cat ${config} | grep -E &quot;^$2[ ]&quot; | awk '{print $5}'`
        echo &quot;Owner: ${comment}&quot;
        ;;
owner)
        CheckArg &quot;$2&quot;
        grep -i $2 ${config}
        ;;
fill)
        CheckArg &quot;$4&quot;
        printf &quot; * Filling mac-list by null-records for $2.$3 - $4...&quot;
        echo &quot;## $2.`expr &quot;$3&quot; &quot;-&quot; &quot;1&quot;` - $2.`expr &quot;$4&quot; &quot;+&quot; &quot;1&quot;`   &lt;UNKNOWN&gt;&quot; &gt;&gt; ${config}
        echo &quot;#&quot; &gt;&gt; ${config}
        i=&quot;$3&quot;
        while [ &quot;${i}&quot; -le &quot;$4&quot; ]
        do
            number1=`/usr/bin/jot -r 1 10 99`
            number2=`/usr/bin/jot -r 1 10 99`
            echo &quot;$2.${i}       00:00:${number1}:00:${number2}:00  pub  # &lt;&lt;nobody&gt;&gt;&quot; &gt;&gt; ${config}
            i=`expr &quot;${i}&quot; &quot;+&quot; &quot;1&quot;`
        done
        echo &quot;#&quot; &gt;&gt; ${config}
        printf &quot;        [ Ok ]\n&quot;
        ;;
*)
        Usage
        ;;
esac
#
exit 0
</pre>
<p>Далее кладем ArpGuard.sh в /usr/local/etc/rc.d и делаем для него конфиг:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
#./ArpGuard.sh fill 192.168.0 1 255
</pre>
<p>Редактируем /usr/local/etc/arpguard.conf Пишем там соответствующие IP адресу MAC&#8217;и. После # для удобства пишем хозяина пихи.<br />
<em>Есть задумка включить в скрипт кусок кода, который будет парсить dhcpd.conf, и автоматом расставлять в arpguard.conf если кто-то напишет &#8212; присылайте, дополню.</em><br />
Теперь про параметры запуска:<br />
start     &#8212; очищает ARP-таблицу и загружает ее из конфига<br />
stop      &#8212; очищает ARP-таблицу<br />
restart   &#8212; тоже самое, что и start<br />
status    &#8212; выводит текущую ARP-таблицу<br />
deny {ip} &#8212;  запрещает доступ указанному IP<br />
clear {ip} &#8212; удаляет указанный IP из таблицы<br />
info {ip} &#8212; показывает информацию о указанном IP<br />
owner {comment} &#8212; ищет запись в комментариях конфига (владельца)<br />
fill {net} {start} {end} &#8212; создает конфу и заполняет ее пихами и рандомными маками<br />
После того как мы отредактировали конфиг, запускаем:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
#/usr/local/etc/rc.d/ArpGuard.sh start
</pre>
<p>Пробуем ставить руками IP, радуемся что не можем и идем пить чай.</p>
<p><strong>P.S.</strong> Еще раз хочу оговориться и заострить Ваше внимание на том, что статическая ARP таблица может быть полезна как <strong>дополнительное средство</strong> для обеспечения безопастности. Изложеный мной подход вполне способен оградить Вас от интересующихся &#171;школьников&#187; и продвинутого &#171;офисного планктона&#187;, но он никак не помешает целенаправленной атаке на Вашу сеть. Для полноценной защиты от несанкционированного доступа необходимо использовать целый комплекс средств и действий, но это тема уже совсем другой статьи :) </p>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2009/11/arpguard/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2009/11/arpguard/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2009%2F11%2Farpguard%2F&amp;title=ArpGuard" id="wpa2a_26">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2009/11/arpguard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Монтирование ISO в FreeBSD</title>
		<link>http://yaroslav.berezhinskiy.name/2009/08/mount-iso-freebsd/</link>
		<comments>http://yaroslav.berezhinskiy.name/2009/08/mount-iso-freebsd/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 13:19:58 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[iso]]></category>
		<category><![CDATA[iso freebsd]]></category>
		<category><![CDATA[монтирование iso]]></category>

		<guid isPermaLink="false">http://myjournal.org.ua/?p=344</guid>
		<description><![CDATA[Все довольно тривиально: Создаем виртуальный диск с нашей iso&#8217;шкой (md0), после чего монтируем его в нужную папку Соответственно размонтировать и уничтожить диск можно так: Для удобства использования на десктопе можно настругать простенький скрипт: Запуск и остановка:]]></description>
			<content:encoded><![CDATA[<p>Все довольно тривиально:<br />
Создаем виртуальный диск с нашей iso&#8217;шкой (md0), после чего монтируем его в нужную папку</p>
<pre class="brush: plain; gutter: false; light: false; title: ; notranslate">
# mdconfig -a -t vnode -f filename.iso -n 0
# mount_cd9660 /dev/md0 /path/to/folder
</pre>
<p>Соответственно размонтировать и уничтожить диск можно так:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# umount /path/to/folder
# mdconfig -d -u 0
</pre>
<p>Для удобства использования на десктопе можно настругать простенький скрипт:</p>
<pre class="brush: bash; title: ; toolbar: true; notranslate">
#!/bin/sh

file_name=&quot;$2&quot;
folder=&quot;$3&quot;
mdcnf=/sbin/mdconfig
mntcd=/sbin/mount_cd9660
umnt=/sbin/umount

# Скрипт монтирования ISO
case &quot;$1&quot; in
        start)
                ${mdcnf} -a -t vnode -f ${file_name} -n 0
                ${mntcd} /dev/md0 ${folder}
                echo &quot;ISO mounted&quot;
                ;;
        stop)
                ${umnt} ${folder}
                ${mdcnf} -d -u 0
                echo &quot;ISO umounted&quot;
                ;;
        *)
                exit 64
                ;;
esac
</pre>
<p>Запуск и остановка:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
# ./mnt_iso.sh start Leo4All.iso /mnt
ISO mounted
# ./mnt_iso.sh stop /mnt
ISO umounted
#
</pre>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2009/08/mount-iso-freebsd/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2009/08/mount-iso-freebsd/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2009%2F08%2Fmount-iso-freebsd%2F&amp;title=%D0%9C%D0%BE%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20ISO%20%D0%B2%20FreeBSD" id="wpa2a_28">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2009/08/mount-iso-freebsd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Маша Badda Boo</title>
		<link>http://yaroslav.berezhinskiy.name/2009/08/masha-badda-boo/</link>
		<comments>http://yaroslav.berezhinskiy.name/2009/08/masha-badda-boo/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 19:43:49 +0000</pubDate>
		<dc:creator>Berezhinskiy</dc:creator>
				<category><![CDATA[Музыка]]></category>
		<category><![CDATA[Badda Boo]]></category>
		<category><![CDATA[Маша]]></category>
		<category><![CDATA[Мимо моря]]></category>

		<guid isPermaLink="false">http://myjournal.org.ua/?p=203</guid>
		<description><![CDATA[Редкое сочетание красоты и таланта. Маша на livejournal.]]></description>
			<content:encoded><![CDATA[<p>Редкое сочетание красоты и таланта. <a href="http://badda-boo.livejournal.com/" target="_blank">Маша на livejournal</a>.</p>
<p style="text-align: center;"><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/iRJ2EDsLxvk&amp;rel=0"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/iRJ2EDsLxvk&amp;rel=0" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object></p>
<p><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://yaroslav.berezhinskiy.name/2009/08/masha-badda-boo/"></a><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://yaroslav.berezhinskiy.name/2009/08/masha-badda-boo/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fyaroslav.berezhinskiy.name%2F2009%2F08%2Fmasha-badda-boo%2F&amp;title=%D0%9C%D0%B0%D1%88%D0%B0%20Badda%20Boo" id="wpa2a_30">В закладки!</a></p>]]></content:encoded>
			<wfw:commentRss>http://yaroslav.berezhinskiy.name/2009/08/masha-badda-boo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

