LINUX.ORG.RU
ФорумAdmin

[iptables] в связке с ipset - блокировка зарубежного трафика


1

1

Знаю, много страниц в Сети исписано, что да как нужно делать, но там не совсем то.

Нужно: блокировать трафик на сервере. Есть список разрешенных подсетей (как RU-IX, UA-IX, у нас - TAS-IX), записанных в файле в формате 83.221.96.0/24 на каждой строке. Сервер: Debian 6 x86, интернет - через PPPoE подключение.

Вначале прописал правило

iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
интернет получили все, как и должно быть. Потом наваял скрипт:

IPTABLES=/sbin/iptables


ipset -N tasix nethash
IPFILE="tasix_subnets"

grep "^" $IPFILE | while read ip;
do
  if [ $ip <> NULL ]
      then `ipset -A tasix $ip`
  fi
done


$IPTABLES -N TAS-IX
# переводим всех на цепочку TAS-IX
$IPTABLES -A FORWARD -t filter -i eth0 -s 192.168.0.0/20 -j TAS-IX
# в этой цепочке возвращаем в цепочку FORWARD, если IP назначения не в зоне Tas-ix, и к ним будет применена политика по умолчанию
$IPTABLES -A TAS-IX -m set --set ! tasix src,dst -j RETURN
# задаю политику по умолчанию для FORWARD'a и tasix
$IPTABLES -P FORWARD DROP
$IPTABLES -P TAS-IX  DROP
#и дропаю всех, кто не попал под правило
$IPTABLES -A TAS-IX -j DROP
$IPTABLES -A FORWARD -j DROP

В результате, с других компов вообще перестал интернет работать. Может из-за последних двух строк? Но они же последние по вставке в список правил, хотя кто знает. Даже правило добавлял.

iptables -A FORWARD -s 192.168.0.1 -j ACCEPT
всё равно не пускал с этого ip в интернет. Сейчас доступа нет к серверу, но думаю, надо было в последнем правиле указать номер правила, чтобы пакеты проверялись на ip-источника, а потом уже дальше шли. Но вот с тем скриптом, намучался. Спасибо заранее за пожелания вкуривать маны, уже. С удовольствием выслушаю поправки/замечания.

1) в список национальных подсетей добавь ещё и свои локальные.

2) у тебя не написано что должно происходить с пакетами которые подходят правилу. В то же время политика по-умолчанию DROP. Поэтому и не проходит.

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

Ну и нафига делать для одного правила отдельную цепочку?

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Вот так?

IPTABLES=/sbin/iptables


ipset -N tasix nethash
IPFILE="tasix_subnets"

grep "^" $IPFILE | while read ip;
do
  if [ $ip <> NULL ]
      then `ipset -A tasix $ip`
  fi
done


$IPTABLES -N TAS-IX
# переводим всех на цепочку TAS-IX
$IPTABLES -A FORWARD -t filter -i eth0 -s 192.168.0.0/20 -j TAS-IX
# в этой цепочке возвращаем в цепочку FORWARD, если IP назначения не в зоне Tas-ix, и к ним будет применена политика по умолчанию
$IPTABLES -A TAS-IX -m set --set ! tasix src,dst -j RETURN
# разрешаю обмен данными для tasix_subnets
$IPTABLES -A TAS-IX -m set --set tasix src,dst - j ACEEPT
# задаю политику по умолчанию для FORWARD
$IPTABLES -P FORWARD DROP

Завтра же попробую.

leader32 ()
Ответ на: комментарий от leader32

а нельзя одним правилом заматчить и --src и -m set? Тебе не нужна отдельная цепочка. Я бы сделал так:


$IPTABLES -A FORWARD -t filter -i eth0 -s 192.168.0.0/20 -m set --set tasix src,dst - j ACEEPT

$IPTABLES -P FORWARD DROP

Ну и ты уверен что в твоём дистре нет скриптов для вызова iptables? Которые бы делали iptables-save/iptables-restore?

Помимо этого я думаю что src,dst означает что и src и dst должно быть из --set tasix.

И вообще проще задачу решить через stateful фаервол, имхо.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Вобщем, потестил тот скрипт. Не заработало все равно, дело в этих ipset'ах. Опишу немного систему: сервер Debian 6, сетевые интерфейсы: Eth0 - смотрит в локальную сеть Eth2 - подключен к роутеру, у которого bridged подключение. Ppp0 - интерфейс становится активным при поднятии PPPoE подключения. Все. Как только подключился, пишу правило

Iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
И у всех, как должно быть, появляется интернет.

После запуска того скрипта, интернет отрубается на клиентах. Писал даже одно единственное правило

Iptables -A FORWARD -t filter -i eth0 -s 192.168.0.0/20 -m set --set tasix src,dst -j ACCEPT
Указывая политику по умолчанию -P FORWARD DROP Все равно не пускает. Если же политику поменять на ACCEPT, то все работает. Получается, что все пакеты эти не попадают под правило с модулем ipset.

Как же все-таки быть?

leader32 ()
Ответ на: комментарий от true_admin

Неа, так тоже не проходит ни на один комп. Если хоть как-то прояснит ситуацию:

$iptables-save

# Generated by iptables-save v1.4.8 on Thu Mar  1 15:59:48 2012
*nat
:PREROUTING ACCEPT [62839:4190430]
:POSTROUTING ACCEPT [13501:755023]
:OUTPUT ACCEPT [20676:1956346]
-A POSTROUTING -o ppp0 -j MASQUERADE 
-A POSTROUTING -o eth2 -j MASQUERADE 
COMMIT
# Completed on Thu Mar  1 15:59:48 2012
# Generated by iptables-save v1.4.8 on Thu Mar  1 15:59:48 2012
*filter
:INPUT ACCEPT [1065909:225264851]
:FORWARD DROP [24775:1499895]
:OUTPUT ACCEPT [858758:1419315970]
:fail2ban-ssh - [0:0]
-A FORWARD -s 192.168.1.102/32 -d 192.168.1.102/32 -j ACCEPT 
-A FORWARD -s 192.168.0.0/20 -i eth0 -m set --match-set tasix dst -j ACCEPT 
COMMIT
# Completed on Thu Mar  1 15:59:48 2012
# Generated by iptables-save v1.4.8 on Thu Mar  1 15:59:48 2012
*mangle
:PREROUTING ACCEPT [3240912:360625978]
:INPUT ACCEPT [3157441:355642695]
:FORWARD ACCEPT [79854:4640690]
:OUTPUT ACCEPT [1486139:7190154534]
:POSTROUTING ACCEPT [1523005:7192054122]
COMMIT
# Completed on Thu Mar  1 15:59:48 2012

Причем, упомянутый хост 192.168.1.102 не получает доступ в интернет. Хотя должен

leader32 ()
Ответ на: комментарий от true_admin

Спасибо, дружище! Так и писали) самое интересное было то, что с только одним правилом

iptables -A FORWARD -s 192.168.0.0/20 -m set --set tasix dst -j ACCEPT
Интернет работал только для местных сетей. Хотя, по идее, пакет должен был выйти, но не зайти ответ на этот пакет. Вобщем, пока тестирую, /etc/rc.local привожу в людской вид, как все настрою, выложу готовые правила. Не мне одному пригодится, многие задают этот вопрос в нашем регионе, насчет блокировки трафика. Лишним не будет)

leader32 ()
Ответ на: комментарий от leader32

тогда iptables -v и смотри какие каунтеры счётчик увеличивают при прохождении пакетов.

Кстати, а ты пинг перезапускаешь после смены правил? А то iptables «кэширует» внутрях много чего (на самом деле модуль conntrack работает) и после смены правил для старых соединений (в том числе udp и icmp) всё остаётся по-старому. Сам на это нарывался.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Success

Дописал-таки я этот конфиг. Все правила кладу в /etc/rc.local

Нагрузка с модулем ipset действительно меньшая по сравнению с сотнями правил iptables. Если кому интересно - приведу полный конфиг со всеми цепочками. Понадобилось еще блокировать доступ в интернет для определенного диапазона адресов. Для этого создал сет типа ipmap, указав начальный и конечный диапазон, а затем построчно включаю каждый ip в сет. К чему слова? Пора к делу:

ipset -N denynet ipmap --from 192.168.2.1 --to 192.168.5.254
Ipset -A denynet 192.168.2.5
Ipset -A denynet 192.168.2.20
#и так далее ...

И теперь включаю сет в правило, так как сам по себе сет ничего интересного не представляет:

Iptables -A FORWARD -m set --set denynet src -o ppp0 -j DROP
Если же в правиле предусматривается использование двух сетов,то, оказывается, надо каждый раз указывать iptables, что используется модуль ipset:
Iptables -A FORAWRD -m set --set denynet src -m set ! --set tasix dst -j DROP

Теперь стоит задача блокировки трафика «в мир» после расхода 40 МБ трафика. Нашел модуль quota, только не понятен его синтаксис. Первое, что пришло в голову - «распустить» трафик в две цепочки - трафик в мир и в местную сеть. При достижении счетчика больше чем 40МБ - выполнять действие DROP. Но столкнулся с проблемой: значение счетчика показывает 300КБ. Хотя на самом деле, был скачан файл размером в 5 МБ на клиенте. Трафик больше никуда не ходит. Главное, в других счетчиках значение увеличивается более-менее правильно. Читал в гуглах, iptables не считает ethernet-заголовок, равный 14 байтам(?).

Чем бы все-таки посчитать трафик? Именно в заданной цепочке iptables.

leader32 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.