<?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>mysyslog.ru</title>
	<atom:link href="http://mysyslog.ru/feed" rel="self" type="application/rss+xml" />
	<link>http://mysyslog.ru</link>
	<description>Всякая IT всячина</description>
	<lastBuildDate>Mon, 01 Mar 2010 10:17:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>jot и seq или как упростить себе работы с циклами</title>
		<link>http://mysyslog.ru/posts/280</link>
		<comments>http://mysyslog.ru/posts/280#comments</comments>
		<pubDate>Mon, 01 Mar 2010 10:17:57 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=280</guid>
		<description><![CDATA[

jot (FreeBSD)
seq (Linux)
две простые утилиты для работы с последовательностями, прекрасная альтернатива замены for в shell скриптах.

Работать с ними очень просто:
SEQ=`jot 10 1 10`
for i in $SEQ
 echo $i
done
Получим
1
2
3
4
5
6
7
8
9
10
А если вот так, то
SEQ=`jot 10 10 1`
10
9
8
7
6
5
4
3
2
1
Первая[10] цифра, это число цифр, которые нужно напечатать, вторая[1] &#8211; первый элемент, третья[10] &#8211; последний элемент. Т.е. jot сам построит последовательность [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>jot (FreeBSD)<br />
seq (Linux)<br />
две простые утилиты для работы с последовательностями, прекрасная альтернатива замены for в shell скриптах.<br />
<span id="more-280"></span><br />
Работать с ними очень просто:<br />
SEQ=`jot 10 1 10`<br />
for i in $SEQ<br />
 echo $i<br />
done</p>
<p>Получим<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10</p>
<p>А если вот так, то<br />
SEQ=`jot 10 10 1`<br />
10<br />
9<br />
8<br />
7<br />
6<br />
5<br />
4<br />
3<br />
2<br />
1</p>
<p>Первая[10] цифра, это число цифр, которые нужно напечатать, вторая[1] &#8211; первый элемент, третья[10] &#8211; последний элемент. Т.е. jot сам построит последовательность из 10 цифр с равным шагом, чтобы пройтись от 1 до 10.</p>
<p>seq в Linux несколько проще, seq FIRST INCREMENT LAST</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/280/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как посмотреть окружение запущенного процесса?</title>
		<link>http://mysyslog.ru/posts/277</link>
		<comments>http://mysyslog.ru/posts/277#comments</comments>
		<pubDate>Mon, 23 Nov 2009 12:52:28 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[env]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[process]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=277</guid>
		<description><![CDATA[

Иногда нужно подсмотреть окружение запущенного процесса, для этого есть несколько способов и утилит.
Linux:
cat /proc/PID/environ
Solaris:
pargs -e PID
FreeBSD:
mount -t procfs none /proc
ps ewwwp PID
Общий подход для всех UNIX систем:
gcore PID
получим core файл
string core.PID
]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>Иногда нужно подсмотреть окружение запущенного процесса, для этого есть несколько способов и утилит.<br />
<strong>Linux:</strong><br />
cat /proc/PID/environ</p>
<p><strong>Solaris:</strong><br />
pargs -e PID</p>
<p><strong>FreeBSD:</strong><br />
mount -t procfs none /proc<br />
ps ewwwp PID</p>
<p><strong>Общий подход для всех UNIX систем:</strong><br />
gcore PID<br />
получим core файл<br />
string core.PID</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/277/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Добавляем в CentOS5 rpmforge</title>
		<link>http://mysyslog.ru/posts/274</link>
		<comments>http://mysyslog.ru/posts/274#comments</comments>
		<pubDate>Thu, 19 Nov 2009 10:35:32 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[yum]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=274</guid>
		<description><![CDATA[

По умолчанию yum в CentOS имеет достаточно куцый список репозиториев, с которыми он может работать. В них нет многих нужных пакетов, например мне потребовался nrpe, и yum его не нашел. Ставить из исходников при наличии yum &#8211; лишняя головная боль через какое-то время. Так что добавляем RPMForge!
Все очень просто. Идем на сайт  https://rpmrepo.org/RPMforge и [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>По умолчанию yum в CentOS имеет достаточно куцый список репозиториев, с которыми он может работать. В них нет многих нужных пакетов, например мне потребовался nrpe, и yum его не нашел. Ставить из исходников при наличии yum &#8211; лишняя головная боль через какое-то время. Так что добавляем RPMForge!<br />
Все очень просто. Идем на сайт  https://rpmrepo.org/RPMforge и видим в документации</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.$dist.rf.$arch.rpm
</div>
</li>
<li class="li1">
<div class="de1">rpm -Uhv rpmforge-release-0.3.6-1.$dist.rf.$arch.rpm</div>
</li>
</ol>
</div>
<p>Для CentOS5 нужна вот эта версия http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm (для x64 http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm)<br />
Выполняем команды и получаем установленный репозиторий. Можно пользоваться! </p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/274/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bruteforce на SSH по странам</title>
		<link>http://mysyslog.ru/posts/269</link>
		<comments>http://mysyslog.ru/posts/269#comments</comments>
		<pubDate>Mon, 02 Nov 2009 10:14:33 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=269</guid>
		<description><![CDATA[

Что сеть полна ботов, пытающихся сделать что-то нехорошее, уже давно не новость. И увидеть в логах попытки отправить письмо через ваш SMTP, попытки пройти аутентификацию у вас на сайте или попытки подобрать пароль от FTP/SSH &#8211; обычное дело. Ради интереса решил натравить geoip на логи неудачных попыток входа по ssh.
Смотрите что получилось:

Вот такой конструкции пропарсил [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>Что сеть полна ботов, пытающихся сделать что-то нехорошее, уже давно не новость. И увидеть в логах попытки отправить письмо через ваш SMTP, попытки пройти аутентификацию у вас на сайте или попытки подобрать пароль от FTP/SSH &#8211; обычное дело. Ради интереса решил натравить geoip на логи неудачных попыток входа по ssh.<br />
Смотрите что получилось:<br />
<span id="more-269"></span><br />
Вот такой конструкции пропарсил лог и получил список числа попыток войти/страны откуда эта попытка была произведена</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">for i in &nbsp;`gzcat /var/log/messages.*| fgrep ssh | fgrep &#8216;authentication error for illegal&#8217;|awk &#8216;{print $15}&#8217;`;do
</div>
</li>
<li class="li1">
<div class="de1">geoiplookup $i;
</div>
</li>
<li class="li1">
<div class="de1">done| cut -d&#8217;,&#8217; -f2|sort|uniq -c|sort -n|tail -n10</div>
</li>
</ol>
</div>
<p>Получился любопытный график<br />
<img src="http://mysyslog.ru/i/bruteforce.png" alt="ssh bruteforce by countries" /><br />
Т.е. США виноваты не только в мировом кризисе =)</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/269/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP + Asterisk AMI</title>
		<link>http://mysyslog.ru/posts/258</link>
		<comments>http://mysyslog.ru/posts/258#comments</comments>
		<pubDate>Thu, 22 Oct 2009 11:52:20 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[voip]]></category>
		<category><![CDATA[asterisk]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=258</guid>
		<description><![CDATA[

Asterisk Manager Interface (AMI) &#8211; интерфейс, позволяющей клиентам подключаться к работающему asterisk, и через набор заданных функций получать данные о его работе или менять его настройки. Звучит хорошо?

На практике все несколько тяжелее. Для включения AMI нужно настроить asterisk/manager.conf



 [general]



&#160;displaysystemname = no



&#160;enabled = yes



&#160;port = 5038



&#160;bindaddr = 127.0.0.1



&#160;[admin]



&#160;secret = secret5



&#160;deny = 0.0.0.0/0.0.0.0



&#160;permit = 127.0.0.1/255.255.255.255



&#160;read = all,system,call,log,verbose,command,agent,user,config



&#160;write [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>Asterisk Manager Interface (AMI) &#8211; интерфейс, позволяющей клиентам подключаться к работающему asterisk, и через набор заданных функций получать данные о его работе или менять его настройки. Звучит хорошо?<br />
<span id="more-258"></span><br />
На практике все несколько тяжелее. Для включения AMI нужно настроить asterisk/manager.conf</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> [general]
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;displaysystemname = no
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;enabled = yes
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;port = 5038
</div>
</li>
<li class="li2">
<div class="de2">&nbsp;bindaddr = 127.0.0.1
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;[admin]
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;secret = secret5
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;deny = 0.0.0.0/0.0.0.0
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;permit = 127.0.0.1/255.255.255.255
</div>
</li>
<li class="li2">
<div class="de2">&nbsp;read = all,system,call,log,verbose,command,agent,user,config
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;write = all,system,call,log,verbose,command,agent,user,config</div>
</li>
</ol>
</div>
<p>После чего можно сделать вот так</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">$ telnet 127.0.0.1 5038
</div>
</li>
<li class="li1">
<div class="de1">Trying 127.0.0.1&#8230;
</div>
</li>
<li class="li1">
<div class="de1">Connected to localhost.
</div>
</li>
<li class="li1">
<div class="de1">Escape character is &#8216;^]&#8217;.
</div>
</li>
<li class="li2">
<div class="de2">Asterisk Call Manager/1.0</div>
</li>
</ol>
</div>
<p>вводим команды и после несколько раз нажимаем enter</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">Action: Login
</div>
</li>
<li class="li1">
<div class="de1">ActionID: 1
</div>
</li>
<li class="li1">
<div class="de1">Username: admin
</div>
</li>
<li class="li1">
<div class="de1">Secret: secret5</div>
</li>
</ol>
</div>
<p>получаем ответ</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">Response: Success
</div>
</li>
<li class="li1">
<div class="de1">ActionID: 1
</div>
</li>
<li class="li1">
<div class="de1">Message: Authentication accepted</div>
</li>
</ol>
</div>
<p>дальше можно сделать вот так</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">Action: Queues
</div>
</li>
<li class="li1">
<div class="de1">ActionID: 2</div>
</li>
</ol>
</div>
<p>и получить ответ</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">supports has 0 calls (max unlimited) in &#8216;ringall&#8217; strategy (0s holdtime), W:0, C:0, A:0, SL:0.0% within 0s
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;Members:
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; SIP/100 (Unavailable) has taken no calls yet
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; SIP/101 (Unavailable) has taken no calls yet
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; SIP/102 (Not in use) has taken no calls yet
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; SIP/103 (Unavailable) has taken no calls yet
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; SIP/104 (Not in use) has taken no calls yet
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;No Callers</div>
</li>
</ol>
</div>
<p>Если <a href="http://www.voip-info.org/wiki/view/Asterisk+manager+API">посмотреть</a> список доступных функций, то открывается массу возможностей по управлению asterisk в реальном времени без редактирования конфигов. Дело за малым &#8211; найти библиотеку для работы с AMI, чтобы самому не писать обвязку для работы с TCP сокетами и т.п. Библиотек много, кажется есть почти для каждого популярного языка программирования. Я выбрал для PHP asterisk-php-api, можно скачать с <a href="http://code.google.com/p/asterisk-php-api/"> google code</a>. Напишем пример для статистики по очередям </p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require</span> <span class="st0">&quot;AsteriskManager.php&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$params</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8217;server&#8217;</span> =&gt; <span class="st0">&#8216;127.0.0.1&#8242;</span>, <span class="st0">&#8216;port&#8217;</span> =&gt; <span class="st0">&#8216;5038&#8242;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ast</span> = <span class="kw2">new</span> Net_AsteriskManager<span class="br0">&#40;</span><span class="re0">$params</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">try <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$ast</span>-&gt;<span class="me1">connect</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> catch <span class="br0">&#40;</span>PEAR_Exception <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$e</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">try <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$ast</span>-&gt;<span class="me1">login</span><span class="br0">&#40;</span><span class="st0">&#8216;admin&#8217;</span>, <span class="st0">&#8217;secret5&#8242;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> catch<span class="br0">&#40;</span>PEAR_Exception <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$e</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">try <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$queuestatus</span> = <span class="re0">$ast</span>-&gt;<span class="me1">getQueues</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> catch<span class="br0">&#40;</span>PEAR_Exception <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$e</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$queuestatus</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Вид конечно не очень, но все понятно, можно сделать страницу с авторефрешем и присматривать за работой очередей asterisk.</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/258/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SIP / AGENT, is still &#8216;Not in Use&#8217; when it probably should not be!</title>
		<link>http://mysyslog.ru/posts/251</link>
		<comments>http://mysyslog.ru/posts/251#comments</comments>
		<pubDate>Thu, 22 Oct 2009 07:46:03 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[gentoo]]></category>
		<category><![CDATA[voip]]></category>
		<category><![CDATA[asterisk]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=251</guid>
		<description><![CDATA[

WARNING[18373]: app_queue.c:2705 try_calling: The device state of this queue member, SIP/612, is still &#8216;Not in Use&#8217; when it probably should not be!
Please check UPGRADE.txt for correct configuration settings.
Какое-то время наблюдал вот такое сообщение в логах и не мог понять почему не меняется статус для очередей когда смотришь queue show queuename.

Решить проблему все время как-то руки [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>WARNING[18373]: app_queue.c:2705 try_calling: The device state of this queue member, SIP/612, is still &#8216;Not in Use&#8217; when it probably should not be!<br />
Please check UPGRADE.txt for correct configuration settings.<br />
Какое-то время наблюдал вот такое сообщение в логах и не мог понять почему не меняется статус для очередей когда смотришь queue show queuename.<br />
<span id="more-251"></span><br />
Решить проблему все время как-то руки не доходили, да и <strong>locate UPGRADE.txt</strong> на gentoo сервере ничего не показывал. Вчера решил побороть проблему, оказалось все просто, если прочитать UPGRADE.txt (взял из исходников с сайта asterisk)</p>
<p>* Queues depend on the channel driver reporting the proper state<br />
  for each member of the queue. To get proper signalling on<br />
  queue members that use the SIP channel driver, you need to<br />
  enable a call limit (could be set to a high value so it<br />
  is not put into action) and also make sure that both inbound<br />
  and outbound calls are accounted for.</p>
<p>  Example:<br />
       [general]<br />
       limitonpeer = yes<br />
       [peername]<br />
       type=friend<br />
       call-limit=10</p>
<p>Т.е. это как раз то, что и нужно было сделать, после этого статусы выставляются корректно.</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/251/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD mbuf и nmbclusters (или сколько нужно памяти вашему серверу)</title>
		<link>http://mysyslog.ru/posts/248</link>
		<comments>http://mysyslog.ru/posts/248#comments</comments>
		<pubDate>Thu, 15 Oct 2009 07:15:26 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=248</guid>
		<description><![CDATA[

Каждое сетевое соединение потребляет определенный объем памяти ядра, чем больше соединений, тем больше памяти нужно и тем ближе момент, когда в списке процессов можно будет увидеть статус zoneli (zonelimit). Но обо всем по порядку.

Для каждого TCP соединения ядро выделяет два буфера, буфер на прием и буфер на отправку данных. Эти значения задаются параметрами net.inet.tcp.sendspace и [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>Каждое сетевое соединение потребляет определенный объем памяти ядра, чем больше соединений, тем больше памяти нужно и тем ближе момент, когда в списке процессов можно будет увидеть статус zoneli (zonelimit). Но обо всем по порядку.<br />
<span id="more-248"></span><br />
Для каждого TCP соединения ядро выделяет два буфера, буфер на прием и буфер на отправку данных. Эти значения задаются параметрами <span style="text-decoration: underline;">net.inet.tcp.sendspace</span> и <span style="text-decoration: underline;">net.inet.tcp.recvspace</span>. По умолчанию они равны 32 и 64 килобайтам. Т.е. чтобы поддерживать одно соединение нужно 96К памяти ядра. Это конечно не совсем так, так как кроме этих буферов используются и другие ресурсы, с другой стороны не факт, что соединению потребуется буфер целиком. В <strong>man tuning</strong> для определения потребляемой памяти для TCP соединений придерживаются правила &#8220;x2&#8243;, т.е. увеличивают вдвое расчетные параметры. Я бы сказал что при значениях буферов 32К и 64К двойной запас прочности излишен, лучше домножить на 1,5.<br />
В результате получаем, что для обслуживания 1000 одновременных соединений требуется<br />
1000 * (64 + 32) * 1,5 = 144000К памяти.<br />
А сколько памяти разрешено ядру выделять под TCP соединения в данный момент? Это определяет параметр ядра <span style="text-decoration: underline;">kern.ipc.nmbclusters</span>. Для буферов приема и отправки ядро используется mbuf, число которых как раз определяется nmbclusters, каждый кластер занимает 2К, т.е. чтобы определить сколько nmbclusters нужно для обслуживания 1000 TCP соединений, нужно поделить полученный объем необходимой памяти на размер кластера<br />
144000 / 2 = 72000<br />
Т.е. нужно установить kern.ipc.nmbclusters = 72000<br />
Если мы ошиблись и кластеров не хватит, то процесс который их не получит перейдет в состояние zonelimit (в top будет видно zomeli). Чтобы проверить текущее потребление mbuf можно воспользоваться netstat<br />
# netstat -m<br />
&#8230;<br />
512/418/930/25600 mbuf clusters in use (current/cache/total/max)<br />
&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/248/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ipset значительно облегчает жизнь iptables</title>
		<link>http://mysyslog.ru/posts/244</link>
		<comments>http://mysyslog.ru/posts/244#comments</comments>
		<pubDate>Thu, 08 Oct 2009 08:57:18 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[ipset]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=244</guid>
		<description><![CDATA[

В iptables мне очень не хватало таблиц PF!
block in quick on $if inet proto tcp from  to $me port 80
Как красиво выглядит такое правило в PF по сравнению с ужасным аналогом в iptables:
$IPTABLES -A INPUT -i eth1 -p tcp -m tcp -s 192.168.0.1 -d $me &#8211;dport 80 -j DROP
$IPTABLES -A INPUT -i eth1 -p [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>В iptables мне очень не хватало таблиц PF!</p>
<p>block in quick on $if inet proto tcp from <badip> to $me port 80</p>
<p>Как красиво выглядит такое правило в PF по сравнению с ужасным аналогом в iptables:</p>
<p>$IPTABLES -A INPUT -i eth1 -p tcp -m tcp -s 192.168.0.1 -d $me &#8211;dport 80 -j DROP<br />
$IPTABLES -A INPUT -i eth1 -p tcp -m tcp -s 192.168.4.1 -d $me &#8211;dport 80 -j DROP<br />
$IPTABLES -A INPUT -i eth1 -p tcp -m tcp -s 10.10.0.1 -d $me &#8211;dport 80 -j DROP<br />
$IPTABLES -A INPUT -i eth1 -p tcp -m tcp -s 10.0.1.1 -d $me &#8211;dport 80 -j DROP<br />
&#8230;</p>
<p>И так далее. Более того, проверка каждого нового правила &#8211; это лишняя нагрузка на процессор, так что если у вас несколько тысяч правил, то не удивляйтесь idle процессора, равного 0 процентов&#8230; В общем такое положение дел в iptables меня долго отпугивало от него. Но не так давно я нашел проект http://ipset.netfilter.org/ , который дает весь функционал таблиц PF и даже больше!<br />
<span id="more-244"></span><br />
Настройка вся ведется на gentoo, так что мне не пришлось патчить ядро и пересобирать его:</p>
<p>emerge ipset<br />
modprob ipt_set</p>
<p>Теперь у нас есть и работает ipset. В ipset нет таблиц, а есть set различных типов. Типы  позволяют задавать ip адреса из определенной подсети (ipmap тип), связки ip адресов с MAC адресами (macipmap), порты из заданного диапазона (portmap), набор ip адресов или сетей (iphash, nethash), разные комбинации этих set-ов, или даже хранить ip адреса в set только определенное время (iptree). Более подробно советую посмотреть man ipset(8).</p>
<p>Для нашей задачи подходит тип iphash. Создаем set с именем badip, и смотрим его содержимое:</p>
<p># ipset -N badip iphash<br />
# ipset -L badip<br />
Name: test<br />
Type: iphash<br />
References: 0<br />
Default binding:<br />
Header: hashsize: 1024 probes: 8 resize: 50<br />
Members:<br />
Bindings:</p>
<p>Добавляем несколько ip в badip и смотрим содержимое set</p>
<p># ipset -A badip 192.168.0.1<br />
# ipset -A badip 10.10.0.1<br />
# ipset -L test<br />
Name: test<br />
Type: iphash<br />
References: 0<br />
Default binding:<br />
Header: hashsize: 1024 probes: 8 resize: 50<br />
Members:<br />
192.168.0.1<br />
10.10.0.1<br />
Bindings:</p>
<p>Удаляем ip из set</p>
<p># ipset -D badip 192.168.0.1<br />
# ipset -L test<br />
Name: test<br />
Type: iphash<br />
References: 0<br />
Default binding:<br />
Header: hashsize: 1024 probes: 8 resize: 50<br />
Members:<br />
10.10.0.1<br />
Bindings:</p>
<p>Проверяем, есть ли ip в set</p>
<p># ipset -T badip 10.10.0.1<br />
10.10.0.1 is in set test.</p>
<p>Удаляем все ip из set</p>
<p># ipset -F badip</p>
<p>Удаляем сам set</p>
<p># ipset -X badip</p>
<p>Теперь, когда мы разобрались с основными командами ipset нужно научиться использовать его в iptables, перепишем правило iptables:</p>
<p>$IPTABLES -A INPUT -i eth1 -p tcp -m tcp -d $me -m set &#8211;set badip src &#8211;dport 80 -j DROP</p>
<p>Т.е. мы подключили модуль set (-m set), потом указали какой set использовать (&#8211;set badip src). src &#8211; это флаг, который показывает какие ip сравнивать с set, src или dst . Если нужно проверить и src и dst, то флаг задается так src,dst. В результате использования ipset можно упросить и само написание  правил и быстродействие фаервола в целом.</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/244/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenVPN &#8211; простейшая реализация.</title>
		<link>http://mysyslog.ru/posts/241</link>
		<comments>http://mysyslog.ru/posts/241#comments</comments>
		<pubDate>Wed, 30 Sep 2009 12:58:55 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[vpn]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=241</guid>
		<description><![CDATA[

OpenVPN &#8211; замечательный продукт сообщества OpenSource, позволяющий легки и просто организовать VPN.
Забудьте про PPTP, L2TP и IpSec, для работы OpenVPN нужен только UDP или TCP порт, что значительно упрощает развертывания VPN для клиентов за NAT.

В короткой статье я опишу, как организовать соединение точка-точка при помощи OpenVPN.
Пакет OpenVPN доступен на всех популярных платформах ОС, процесс установки [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>OpenVPN &#8211; замечательный продукт сообщества OpenSource, позволяющий легки и просто организовать VPN.<br />
Забудьте про PPTP, L2TP и IpSec, для работы OpenVPN нужен только UDP или TCP порт, что значительно упрощает развертывания VPN для клиентов за NAT.<br />
<span id="more-241"></span><br />
В короткой статье я опишу, как организовать соединение точка-точка при помощи OpenVPN.<br />
Пакет OpenVPN доступен на всех популярных платформах ОС, процесс установки просто и не требует отдельного описания. Единственное, что нужно упомянуть, для Linux нужна поддержка tun устройств в ядре.<br />
Перейдем сразу к настройке. У нас есть два компьютера, который необходимо соединить туннелем. Пусть первый зовется mars (192.168.0.100) и moon (192.168.100.10). Считаем, что маршрутизация между этими компьютерами есть.<br />
Для mars мы создадим vpn подключение с адресом 10.0.0.1, для moon 10.0.0.2.</p>
<p>root@mars:~# openvpn &#8211;remote 192.168.100.10 &#8211;dev tun0 \<br />
&#8211;ifconfig 10.0.0.1 10.0.0.2<br />
root@moon:~# openvpn &#8211;remote 192.168.0.100 &#8211;dev tun0 \<br />
&#8211;ifconfig 10.0.0.2 10.0.0.1</p>
<p>После какого-то времени должно появится сообщение</p>
<p>Wed Sep 29 15:33:05 2009 Initialization Sequence Completed</p>
<p>Что означает, что туннель был создан. Опция remote задает адрес, к которому будет подключаться openvpn и с которого он готов принимать трафик, dev указывает какой интерфейс использовать для туннеля, последняя опция ifconfig определяет IP адреса для создаваемого туннеля, первый для своей стороны, второй для удаленной.<br />
Теперь можно открыть два новых терминала на mars и moon и проверить, работает ли туннель</p>
<p>user@mars:~$ ping 10.0.0.2<br />
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.<br />
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.421 ms<br />
&#8230;<br />
user@moon:~$ ping 10.0.0.1<br />
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.<br />
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.360 ms<br />
&#8230;</p>
<p>Следует сразу сказать, что так VPN поднимать не нужно по двум причинам. Во-первых мы не задали опций для шифрования, т.е. весь трафик у нас идет в открытом виде. Во-вторых при закрытии консолей, в которых был запущен openvpn, на любом из компьютеров приведет к закрытию туннеля. Так что такой способ подходит только для тестовых целей. </p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/241/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как приостановить процесс и потом вернуться к его исполнению в Linux</title>
		<link>http://mysyslog.ru/posts/236</link>
		<comments>http://mysyslog.ru/posts/236#comments</comments>
		<pubDate>Mon, 21 Sep 2009 12:58:29 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[env]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=236</guid>
		<description><![CDATA[

Если у вас есть какой-то работающий процесс, например gzip, архивирующий большой объем данных, и вам вдруг стало необходимо проверить, а хватит ли места на диске, то вас совершенно необязательно прерывать архивирование.

Просто нажмите  Сtrl+z для приостановки текущего процесса. Процесс будет ожидать вашего возврат. Тем временем вы вернетесь в терминал из которого запустили gzip и сможете [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>Если у вас есть какой-то работающий процесс, например gzip, архивирующий большой объем данных, и вам вдруг стало необходимо проверить, а хватит ли места на диске, то вас совершенно необязательно прерывать архивирование.<br />
<span id="more-236"></span><br />
Просто нажмите  Сtrl+z для приостановки текущего процесса. Процесс будет ожидать вашего возврат. Тем временем вы вернетесь в терминал из которого запустили gzip и сможете запустить любую команду.</p>
<p>Если вы хотите вернуться к процессу архивирования (или любому другому приостановленному процессу), то нужно только набрать команду<br />
fg %1<br />
которая активирует первый приостановленный процесс. Если процесс всего один параметр %1 необязателен. </p>
<p>Чтобы получить список всех приостановленных процессов нужно запустить команду<br />
jobs.</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/236/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
