<?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 &#187; iptables</title>
	<atom:link href="http://mysyslog.ru/posts/tag/iptables/feed" rel="self" type="application/rss+xml" />
	<link>http://mysyslog.ru</link>
	<description>Всякая IT всячина</description>
	<lastBuildDate>Thu, 08 Sep 2011 09:29:10 +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>ipset в CentOS</title>
		<link>http://mysyslog.ru/posts/423</link>
		<comments>http://mysyslog.ru/posts/423#comments</comments>
		<pubDate>Tue, 20 Apr 2010 08:27:48 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[ipset]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=423</guid>
		<description><![CDATA[CentOS отличается некоторой консервативностью в версиях установленного ПО, что иногда приводит к проблемам с установкой нужной программы, не исключением стал и ipset. 
Первым делом я проверил, есть ли ipset в базовой системе, конечно же его не было. Пробежавшись по сайтам из найденных google по запросу &#8220;ipset centos&#8221;, так же не нашел готового решения. Проблема есть, [...]]]></description>
			<content:encoded><![CDATA[<p>CentOS отличается некоторой консервативностью в версиях установленного ПО, что иногда приводит к проблемам с установкой нужной программы, не исключением стал и ipset. <span id="more-423"></span><br />
Первым делом я проверил, есть ли ipset в базовой системе, конечно же его не было. Пробежавшись по сайтам из найденных google по запросу &#8220;ipset centos&#8221;, так же не нашел готового решения. Проблема есть, а вот методы решения ее самые разные. Большинство отказывались от ядра CentOS в пользу &#8220;чистого&#8221; ядра с kernel.org, патчили и ставили его. Мне такой подход не понравился, так как обновлять ядро хочется все тем же yum, а не каждый раз путем пересборки.<br />
Погуглив еще немного, я нашел способ поставить утилиту ipset и модуль ядра через yum. Для этого нужно подключить дополнительные репозитории: CentALT и epel.<br />
Сразу скажу, что CentALT заточен во многом под ALT Linux, так что софтом из него стоит пользоваться осторожно в CentOS. Устанавливаем:</p>
<pre class="brush: plain; light: true;">
# wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
# wget http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm
# rpm -iv epel-release-5-3.noarch.rpm
# rpm -iv centalt-release-5-3.noarch.rpm
# yum check-update
</pre>
<p>Если у вас x86_64 архитектура, то просто смените i386 на x86_64 в ссылках.<br />
Теперь можно поставить модуль ядра и утилиту ipset, после проверяем все ли работает:</p>
<pre class="brush: plain; light: true;">
# yum install kmod-ipset.i688 ipset.i386
# modprobe ip_set
# lsmod | fgrep ip_set
ip_set                 23708  0
# ipset -V
ipset v2.5.0 Protocol version 2.
# iptables -m set -h
iptables v1.3.5: Couldn't load match `set':/lib/iptables/libipt_set.so: cannot open shared object file: No such file or directory

Try `iptables -h' or 'iptables --help' for more information.
</pre>
<p>Не все так гладко, как хотелось бы! Модуль и утилита ipset есть, а iptables не может с ней работать. Дело в версии iptables, нужна версия старше 1.4, но в CentOS ее нет. Так что придется все же пойти на определенные жертвы. Будем ставить iptables из сорцов. Сносим &#8220;родной&#8221; iptables и ставим более новую версию. Перед этим добавляем в систему gcc, если еще нет:</p>
<pre class="brush: plain; light: true;">
# cp /etc/init.d/iptables /root/
# yum erase iptables
# yum install gcc
# cd /usr/src/
# wget http://www.netfilter.org/projects/iptables/files/iptables-1.4.7.tar.bz2
# tar xjf iptables-1.4.7.tar.bz2
# cd iptables-1.4.7
# ./configure
# make
# make install
# hash -r
</pre>
<p>Создаем тестовую таблицу и проверяем, что все работает:</p>
<pre class="brush: plain; light: true;">
# ipset -N badip iphash
# ipset -A badip 10.10.1.10
# iptables -A INPUT -p icmp -m set --set badip src -j DROP
# iptables -vL
Chain INPUT (policy ACCEPT 24372 packets, 2261K bytes)
 pkts bytes target     prot opt in     out     source               destination
    4   240 DROP       icmp --  any    any     anywhere             anywhere            match-set badip src

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 489 packets, 45302 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain RH-Firewall-1-INPUT (0 references)
 pkts bytes target     prot opt in     out     source               destination
</pre>
<p>Теперь про ложку дегтя, как же без нее. После удаления родного iptables и установки нового произошло несколько неприятных событий:<br />
1) По умолчанию iptables из сорцов ставится в /usr/local/sbin/iptables, в родной был в /sbin/iptables. В принципе не проблема пересобрать нужными опциями (внимательно смотрим ./configure &#8211;help)<br />
2) При удалении родного iptables, удаляется и /etc/init.d/iptables, так что я его я специально сохранил<br />
3) Удаляется несколько полезный утилит типа iptstate<br />
4) Все эти суммарные изменения могут где-нибудь неожиданно вылезти, так что перед вводом сервера в продакшен нужно очень хорошо все проверить.</p>
<p><strong>UPDATE!!!</strong><br />
В репозитории CentAlt есть обновление для iptables с поддержкой ipset, так что достаточно</p>
<pre class="brush: plain; light: true;">
# yum update iptables
</pre>
<p>чтобы все заработало!</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/423/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[Советы]]></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[<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>Поиск P2P трафика средствами iptables на Gentoo Linux</title>
		<link>http://mysyslog.ru/posts/202</link>
		<comments>http://mysyslog.ru/posts/202#comments</comments>
		<pubDate>Tue, 02 Jun 2009 18:48:56 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[iptables]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=202</guid>
		<description><![CDATA[Почти любому админу офиса приходилось сталкиваться с ситуации, когда &#8220;умный&#8221; пользователь решил покачать любимые фильмы, музыку и программы через P2P сети. Как правильно такой &#8220;умный&#8221; пользователь не думает о таких вещах, как пропускная способность канала, цена трафика и т.п. А администратору сети приходится потом отвечать на неприятные вопросы начальника.

Если у вас в сети используются маршрутизаторы/NAT [...]]]></description>
			<content:encoded><![CDATA[<p>Почти любому админу офиса приходилось сталкиваться с ситуации, когда &#8220;умный&#8221; пользователь решил покачать любимые фильмы, музыку и программы через P2P сети. Как правильно такой &#8220;умный&#8221; пользователь не думает о таких вещах, как пропускная способность канала, цена трафика и т.п. А администратору сети приходится потом отвечать на неприятные вопросы начальника.<br />
<span id="more-202"></span><br />
Если у вас в сети используются маршрутизаторы/NAT сервера linux. то отловить умников будет очень просто. Для борьбы с P2P трафиком есть специальный модуль iptables &#8211; ipp2p.</p>
<p>В gentoo установить модуль очень просто. Сперва посмотрим его описание:</p>
<pre lang="">emerge -s ipp2p</pre>
<p>Теперь поставим модуль:</p>
<pre lang="">emerge ipp2p</pre>
<p>Проверяем, что модуль подгрузился:</p>
<pre lang="">lsmod | fgrep ipt_ipp2p</pre>
<p>И если его нет, подгрузим</p>
<pre lang="">modprobe ipt_ipp2p</pre>
<p>Теперь можно посмотреть помощь к модулю.</p>
<pre lang="">iptables -m ipp2p --help</pre>
<p>Теперь собственно работа. Я предпочитаю не запрещать сразу, а быть в курсе происходящего. Потому поместим в цепочку FORWARD такое правило:</p>
<pre lang="">iptables -A FORWARD -i eth0 -m ipp2p --ipp2p -j LOG --log-level info --log-prefix "p2p "</pre>
<p>Значение &#8211;ipp2p эквивалентно срабатыванию правила для всех известных типов P2P трафика. При срабатывании правила в syslog-ng будет писать в /var/log/messages сообщение (у меня так настроен syslog-ng, чтобы все попадало в messages). Осталась последняя часть &#8211; отчеты.</p>
<pre lang="sh">#!/bin/bash
export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/i486-pc-linux-gnu/gcc-bin/4.1.2:/usr/i686-pc-linux-gnu/gcc-bin/4.1.2'
export LOG=/var/log/.p2p.report
export TO=some@mail.zone
export FROM=root@server.zone

echo "From: ${FROM}" &gt; ${LOG}
echo "To: ${TO}" &gt;&gt; ${LOG}
echo "Subject: `hostname -a` P2P report `date +%Y-%m-%d`" &gt;&gt; ${LOG}
echo "Content-type: text/plain" &gt;&gt; ${LOG}
echo "" &gt;&gt; ${LOG}
echo "" &gt;&gt; ${LOG}
echo "Report mask:" &gt;&gt; ${LOG}
echo "COUNT DATE SRC" &gt;&gt; ${LOG}
echo "" &gt;&gt; ${LOG}

fgrep p2p /var/log/messages | awk '{print $1" "$2" "$9}' | sort | uniq -c &gt;&gt; ${LOG}

cat ${LOG} | sendmail -i -f ${FROM} ${TO}
rm -f ${LOG}</pre>
<p>Можно поставит этот скрипт в крон, чтобы получать отчеты каждый день или час. </p>
<p>Последний штрих, добавить модуль в автозагрузку </p>
<pre lang="">echo ipt_ipp2p >> /etc/modules.autoload.d/kernel-2.6</pre>
<p>И сохранить правило в стартап скрипте iptables</p>
<pre lang="">/etc/init.d/iptables save</pre>
<p>Дополнительно информация на <a href="http://www.ipp2p.org/">сайте</a> модуля </p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/202/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

