пятница, 11 августа 2006 г.

ipset - "плагин" для iptables

Предо мной была поставлена задача "прикрыть" юзерам воздух, тобишь отслеживание прохождения пакета от юзера до конечной точки в интернете. Собственно команду traceroute и ее аналоги. Это делается просто:
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64

Где eth0 - сетевая карта, которая смотрит в локалку.
Но тут же возникла вторая задача. Двум машинам надо было traceroute разрешить. Тут я подумал как было бы хорошо, если бы iptables поддерживал правила в которых можно было бы задать два исходящих ипа, привязку ипов по маку. Что-то типа этого:
iptables -t mangle -A PREROUTING -i eth0 -s $localip1 -s $localip2 -j TTL --ttl-set 64

Оказывается такое очень даже можно осуществить. Идем на http://ipset.netfilter.org/ и качаем оттуда патч для ядра.
Устанавливаем так:
1. Распаковываем содержимое архива с патчем, например в /root/instprog/patches/patch-o-matic-ng
2. Нам потребуются исходники iptables, но перед этим делаем такое:
echo "net-firewall/iptables extensions" >> /etc/portage/package.use

Включаем use-флаг - поддержка iptables'ом расширейний.
3. Распаковываем исходники iptables:
cd /usr/portage/net-firewall/iptables/
ebuild iptables-1.3.5-r1.ebuild unpack

Они распаются в $PORTAGE_TMPDIR/portage/iptables-${version},
$PORTAGE_TMPDIR по дефолту /var/tmp, если вы не меняли эту переменную у себя в /etc/make.conf, а ${version} версия iptables.
4. Идем в директорию с патчем и запускаем скрипт наложения патча на ядро.
cd /root/instprog/patches/patch-o-matic-ng
./runme set

Програма спросит где исходники ядра и iptables. Оно полагается, что ядро находится в /usr/src/linux, а это по федолту так, а вот исходники iptables у нас не там, где думает скрипт. Надо указать следующий путь:
$PORTAGE_TMPDIR/portage/iptables-${version}/work/iptables-${version}

Естественно сменить $PORTAGE_TMPDIR и ${version} на соответствующие им значения.
После того как скрипт пропатчит ядро, оное надо будет пересобрать.
В ядре следует включить следующее:
CONFIG_IP_NF_SET=y
CONFIG_IP_NF_SET_MAX=256
CONFIG_IP_NF_SET_HASHSIZE=1024
CONFIG_IP_NF_SET_IPMAP=y
CONFIG_IP_NF_SET_MACIPMAP=y
CONFIG_IP_NF_SET_PORTMAP=y
CONFIG_IP_NF_SET_IPHASH=y
CONFIG_IP_NF_SET_NETHASH=y
CONFIG_IP_NF_SET_IPPORTHASH=y
CONFIG_IP_NF_SET_IPTREE=y
CONFIG_IP_NF_MATCH_SET=y
CONFIG_IP_NF_TARGET_SET=y

После пересоборки ядра нужно собрать iptables и ipset.
5. iptables мы собирать уже начали, теперь надо его добить :)
cd /usr/portage/net-firewall/iptables/
ebuild iptables-1.3.5-r1.ebuild compile
ebuild iptables-1.3.5-r1.ebuild install
ebuild iptables-1.3.5-r1.ebuild qmerge
emerge ipset

Последней командой собрали ipset :)
6. Ну и само решение проблемы:
ipset -N hosts ipmap --network 192.168.0.0/24
ipset -A hosts $localip1
ipset -A hosts $localip2
iptables -t mangle -A PREROUTING -i eth0 -m set --set ! hosts src -d 0/0 -j TTL --ttl-set 64