LinuxForum.Fans
Тема

Iptables mark for tcpdump

Автор: Free0N 3 сообщений 1368 просмотров
#242695

Всем привет.
Есть задача - отстроить фаервол на работающем сервере, на котором крутится сервис ip-телефонии. Звонки постоянные, так что "рубить" направо и налево - не вариант.
В итоге было реализовано следующее: установлен ipset (для удобства добавления удаления хостов) и такие вот правила:

Показать
text

# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           /* Local traffic */ 
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:1382
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW set h323 src /* H323 Providers */ 
5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW set sip src /* SIP Providers */ 
6    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT) num target prot opt source destination

Chain OUTPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 /* Local traffic */ 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW OWNER UID match 0 /* traffic for user: root */ 4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW OWNER UID match 500 /* traffic for user: *** */ 5 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW set h323 dst /* H323 Providers */ 6 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW set sip dst /* SIP Providers */ 7 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

Обратите внимание на последние строки в INPUT и OUTPUT. По идее, весь "белый" трафик должен попадать под правила, расположенные выше. Но таки находится трафик, который не попадает в эти правила. Перед установкой политики DROP на INPUT и OUTPUT хочется выяснить - что же за трафик будет дропаться.
Пробовал ставить TOS в mangle таблице (в цепочках INPUT и PREROUTING) - входящие пакеты не изменяются, только исходящие (если изменять TOS в PREROUTING).
Вот собственно и вопрос - как "поймать" трафик, попадающий под определенное правило iptables с помощью tcpdump'а?
Есть возможность использовать -j ULOG, но т.к. подходящего софта для поимки такого трафика нет в репах дистра, то его использование оставляю как самый последний вариант.

#242781
Free0N написал:
Всем привет.
Есть задача - отстроить фаервол на работающем сервере, на котором крутится сервис ip-телефонии..

Я настроил таким образом:

text
for i in $VOIP_SRVS
do
 $IPT -A INPUT -p udp -m udp -s $i -m multiport --dports $IAX_PORTS -j ACCEPT
 $IPT -A INPUT -p udp -m udp -s $i -m multiport --dports $VOIP_PORTS -j ACCEPT
 $IPT -A INPUT -p udp -m udp -s $i --dport 10000:20000 -j ACCEPT
done

Можно так же и на OUTPUT подобное нарисовать.

То есть пускаю на свой сервер только с явно поименованных в переменной VOIP_SRVS серверов провайдеров и по определенным портам. Ну и на udp-диапазон 10000-20000 для SIP-транка.

В принципе можно побороться с SIP-атакой, с попыткой организации DoS, флудом, на сервер примерно таким макаром. У меня в примере, правда чекаются попытки флуда с поименованых серверов, а всё остальное дропается. Но идея, в принципе, понятна, допустимо иметь 4 звонка в 15 секунд, если больше - в сад:

text
# Создаем цепочки SIP attack 
$IPT -N SIPCHECK
$IPT -N SIPATTACKED
for i in $VOIP_SRVS
do
# Захватываем SIP-соединение
 $IPT -A INPUT -p udp -m udp -s $i -m multiport --dports $VOIP_PORTS -j SIPCHECK
# Определяем цепочку SIPCHECK
 $IPT -A SIPCHECK -m recent --name SIPCOUNT --update --seconds 15 --hitcount 4  -j SIPATTACKED
 $IPT -A SIPCHECK -m recent --name SIPCOUNT --set 
 $IPT -A SIPCHECK -j ACCEPT
# Определяем цепочку SIPATTACKED
 $IPT -A SIPATTACKED -j LOG --log-prefix "SIP flood detected: "
 $IPT -A SIPATTACKED -j REJECT --reject-with icmp-host-unreachable
 $IPT -A INPUT -p udp -m udp -s $i --dport 10000:20000 -j ACCEPT
done

Ну и весь остальной INPUT безжалостно дропать. Можно еще и fail2ban напустить на это дело.

Ну и для управления "качеством", для установки TOS в исходящих пакетах использую (для SIP) такие правила:

text
$IPT  -A OUTPUT -t mangle -p udp -m udp -m multiport --dports $VOIP_PORTS -j DSCP --set-dscp 0x28
$IPT  -A OUTPUT -t mangle -p udp -m udp --sport 10000:20000 -j DSCP --set-dscp 0x28
#242839

С отстройкой самих правил вопросов не возникает. Выглядит ситуация так: весь трафик, который должен быть пропущен - пропускается. Но некоторый трафик не попадает под разрешающие правила и светится в последнем (которое разрешает всё). И вопрос стоит в том, чтобы "поймать" этот трафик tcpdump'ом для анализа - возможно админы дали не полную информацию о используемых VoIP-шлюзах или еще что-нибудь в таком духе.

"Cruiser78" написал:
То есть пускаю на свой сервер только с явно поименованных в переменной VOIP_SRVS серверов провайдеров и по определенным портам. Ну и на udp-диапазон 10000-20000 для SIP-транка.

Похожее решение использую, только вместо добавления в цепочки iptables серверов в явном виде (${VOIUP_SRVRS[@]}) используется ipset и -m set src (цепочка INPUT) и -m set dst (цепочка OUTPUT).

"Cruiser78" написал:
Ну и для управления "качеством",  для установки TOS в исходящих пакетах использую (для SIP) такие правила:
text
$IPT  -A OUTPUT -t mangle -p udp -m udp -m multiport --dports $VOIP_PORTS -j DSCP --set-dscp 0x28
$IPT  -A OUTPUT -t mangle -p udp -m udp --sport 10000:20000 -j DSCP --set-dscp 0x28

Использование TOS-а было опробовано только потому, что по полю TOS можно сделать фильтрацию в tcpdump-е (т.к. всякие -j MARK работают в пределах ядра и снаружи их не поймаешь). Задачи каким-либо образом обрабатывать приоритеты трафика нет.

Войдите или зарегистрируйтесь, чтобы ответить.