LINUX.ORG.RU
ФорумAdmin

Нетривиальное в iptables. iptables VS ipfw

 , dynamic rules,


1

4

Добрый день. Прошу помочь в решении нетривиальной задаче.

До сего дня мои тазики\шлюзы были (и есть слава богу) на FreeBSD. Пользователи запускаются в интернет через ipfw+dummynet+nat... Курил маны по iptables но не обрёл понимания о порядке прохождения пакета по правилам и есть ли возможность динамически обновлять правила. в IPFW всё было просто и лаконично. Порядок прохождения пакета - понятен... Помогите прмером строго на описанных ниже правилах...

Правила для пользователей добавляются динамически... Пример набора правил:

100 divert natd ip from any to any via re0

10100 allow ip from 192.168.1.30 to any keep-state

10200 allow ip from 192.168.1.62 to any keep-state

60000 fwd 192.168.1.1,80 ip from 192.168.1.0/24 to any

65535 deny from all

правила с 10000 до 20000 - «зарезервированы» для пользователей. Если айпишника, с которого ломится пользователь, нет в списке правил - он весь форвардится на страничку с табличкой «Закрыто!»... Как только правило появилось - пошёл в интернет. При чём на лету можно сделать ipfw delete 10100, и айпи 192.168.1.30 снова маринуется сам в себе...

КАК это реализовать в iptables? Не могли бы вы показать аналог того, что описано выше, на iptables? с нумерацией правил и возможностью добавления\удаления на лету?

Если нет, что ещё можно использовать в Debian Linux для работы с траффиком так, как я описал?

прошу отнестись с пониманием. Спасибо.


Курил маны по iptables но не обрёл понимания о порядке прохождения пакета по правилам и есть ли возможность динамически обновлять правила.

Динамически добавлять правила разумеется можно. ИМХО, возможностей в сетевой подсистеме линукс больше, но управлять ими сложнее чем в freebsd. Производительность не сравнивал, подозреваю что у freebsd в этом плане лучше.

Пример набора правил:

У меня не было такой задачи, поэтому всё нижесказанное не проверял

правила с 10000 до 20000 - «зарезервированы» для пользователей.

В iptables автоматическая нумерация. Если ты хочешь именно резервирования - его не будет. Но никто не мешает создать отдельную цепочку и форвардить запросы в неё

iptables -N users
<тут аналоги правил 0 .. 9999>
iptables -j users
<тут аналоги правил 20001 и далее>

Если внутри одной цепочки такая же автоматическая нумерация, см.

iptables --line-numbers -nvx -L <цепочка> 
или
iptables --line-numbers -L <цепочка>

номера ты можешь использовать в командах -D ( delele ), -I ( insert before ), -A ( append after )

Если айпишника, с которого ломится пользователь, нет в списке правил - он весь форвардится на страничку с табличкой «Закрыто!»...

60000 fwd 192.168.1.1,80 ip from 192.168.1.0/24 to any

Здесь хуже. NAT и фильтрация происходят в разных таблицах iptables. Задача маршрутизации - вообще отдельная.

Если тебе не нужна тонкая фильтрация, достаточно «этих пропустить, остальных послать лесом», то одной цепочки PREROUTING таблицы NAT будет достаточно, прямо в неё и добавляй правила.

iptables -t nat -A PREROUTING -s 192.168.1.30 -j ACCEPT
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -j DNAT --to-destination 192.168.1.1:80

Если потребуется что-то хитрее, то в цепочке цепочке PREROUTING таблицы NAT тебе придётся метить соединения (-j CONNMARK --set-mark 1 . Метка - целое число. точную размерность не знаю, думаю на 2 байта можно рассчитывать :) ) , а в других цепочках и в iptroute2 ( если понадобится хитрая маршрутизация ) эти метки использовать.

Как только правило появилось - пошёл в интернет.

Всё на лету :)

При чём на лету можно сделать ipfw delete 10100, и айпи 192.168.1.30 снова маринуется сам в себе...

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

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Для производительности. «Если соединение уже установлено, не будем тратить ресурсы на его фильтрацию. Его уже проверяли». И оно позволит уже установленным соединениям спокойно дожить до завершения.

Тебе видимо придётся писать это правило для каждого разрешённого хоста отдельно

iptables -A FORWARD -s 192.168.1.30 -m state --state ESTABLISHED,RELATED -j ACCEPT

И при удалении хоста - удалять.

Итого:

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t NAT -A POSTROUTING -o re0 -j MASQUERADE

iptables -t NAT -A PREROUTING -s 192.168.1.30 -j ACCEPT
iptables -t NAT -A PREROUTING -s 192.168.1.62 -j ACCEPT

iptables -t NAT -A PREROUTING -s 192.168.1.0/24 -j DNAT --to-destination 192.168.1.1:80

Повторюсь - не проверял. Средством отладки служит

iptables -t <таблица> -I <номер правила> <цепочка> -m state --state NEW -m limit --limit 10/s -j LOG

логировать новые соединения, которые дошли до <номер правила> в syslog, с ограничением: в лог не больше 10 пакетов в секунду.

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от router

Спасибо.

Спасибо. Из выше написанного я понял, что нужно использовать несколько разных инструментов для решения задачи.

Т.е. нельзя форвардинг пакетов поставить ПОСЛЕ таблицы с разрешёнными юзверями?

Картинка со схемой прохождения пакета - наглядная... Т.е. правила PREROUTING будут выполняться раньше, чем MANGLE и FILTER... т.е. мне нужно пакет forward"ить где-то в районе POSTROUTING

Вопрос, в сравнении с IPFW, какое поведение у пакета при попадании в IPFILTERS? В IPFW Пакет проходит в файрволлл 4 раза... При попадании пакета на первый подходящий allow, deny, forward, pipe (иногда) - пакет выходит из файрволла ... А в IPTABLES? Пакету обязательно пройти через все правила, или по первого аксепта\реджекта?

Спс, пойду потихоньку курить перевод мануала на опеннет.

Kesano
() автор топика
Ответ на: комментарий от anton_jugatsu

Спс.

А вы можете рассказать, в какой последовательности отрабатывают iptables, iproute2 и ipset??? Я читал про связки этих софтин, но ipset как-то хитро встраивается в iptables...

Kesano
() автор топика
Ответ на: Спасибо. от Kesano

До первого режекта если память не изменяет. Если его пропускают, он идёт дальше, сперва из PREROUTING - и так далее до: POSTROUTING. Ты можешь его метить, после того как пометишь и он выйдет у тебя на уровень сетевого стека сетевой карты в промежутке между выходом из фаервола и сетевого драйвера сетевой карты может работать tc - и на основании политик шейпинга и меток что ты понаставил делать с пакетом что-либо. Насчёт iproute2 не скажу, но думаю аналогично.

Если на пути где-то пакет попадёт под REJECT или DROP - то пакет отбросится и про него все забудут. - Ну конечно для таких пакетов, как и для любых других можно настроить логирование.

DALDON ★★★★★
()
Ответ на: Спасибо. от Kesano

Т.е. нельзя форвардинг пакетов поставить ПОСЛЕ таблицы с разрешёнными юзверями?

Смена source или destination - это nat. Выполняется он в таблице nat ( цепочки PREROUTING, OUTPUT, POSTROUTING ). Причём изменение адреса назначения - только в PREROUTING или OUTPUT, т.к. в POSTROUTING уже принято решение о маршрутизации.

Картинка со схемой прохождения пакета - наглядная... Т.е. правила PREROUTING будут выполняться раньше, чем MANGLE и FILTER... т.е. мне нужно пакет forward"ить где-то в районе POSTROUTING

Не получится, именно потому что решение о маршрутизации уже принято. iptables не позволит добавить такое правило

Пакету обязательно пройти через все правила, или по первого аксепта\реджекта?

До первого REJECT'а. С ACCEPT не уверен. в таблице filter ACCEPT прерывает дальнейшую проверку в filter, но ЕМНИП на других таблицах ( nat, mangle ) это не отражается.

router ★★★★★
()
Ответ на: Спс. от Kesano

Что там хитрого?

man ipset

iptables -m set -h

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

Наступает прозрение...

Т.е, как я понял, конструкция вроде:

iptables -t NAT -A OUTPUT -s 192.168.1.0/24 -j DNAT --to-destination 192.168.1.1:80

Всё равно заформардит пакет, даже если в начале будет

iptables -t nat -A PREROUTING -s 192.168.1.30 -j ACCEPT

Пакет пройдёт через правило прероутинга как разрешённый, а потом всё равно сольётся на OUTPUT и зафорвардится на 192.168.1.1 ???

Тогда нужно каким-то образом держать правило форварда

iptables -t NAT -A OUTPUT -s 192.168.1.0/24 -j DNAT --to-destination 192.168.1.1:80

всегда последним... Как в той конструкции, что вы написали в первом ответе... вопрос только в том, как это правило можно задвигать в самый конец???... Насколько криво будет при добавлении разрешающего правила для конкретного IP удалять правило форварда и снова добавлять его в конец prerouting ???

И по поводу пропуска обратных соединений...

iptables -A FORWARD -s 192.168.1.30 -m state --state ESTABLISHED,RELATED -j ACCEPT

По идее ведь можно сделать вот так:

iptables -A FORWARD -s 192.168.1.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT

Разрешить прохождение обратно всех пакетов для уже открытых соединений... И их не нужно будет создавать и удалять...

Спасибо, что помогаете осваивать новое для меня...

Kesano
() автор топика

в случае если необходимо добавлять пользователей динамически:

- создаешь ipset список с именем allow_inet для разрешенных пользователей
# ipset -N allow_inet iphash
- делаешь iptables правило разрешающего действия, если ip источника запроса входит в список allow_inet
# iptables -A FORWARD -i eth_локальная_сеть -o eth_интернет -m conntrack --ctstate NEW -m set --match-set allow_inet src -j ACCEPT
- выкидываешь нафик остальных (альтернативно посылаешь на свой сервер)
# iptables -A FORWARD -i eth_локальная_сеть -o eth_интернет -m conntrack --ctstate NEW -о DROP
- загоняешь в NAT (если динамический IP, то вместо SNAT ставишь MASQUERADE без to-source)
#iptables -t nat -A POSTROUTING -s локальная_сеть/маска -o eth_локальная_сеть -m conntrack --ctstate NEW  -j SNAT --to-source внешний_ip

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

добавление пользователей в список:

# ipset -a allow_inet 10.0.0.1
удаление пользователей из списка:
# ipset -d allow_inet 10.0.0.1

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

забыл добавить. Это все вставить впереди:

- исправление пакетов (для всяких ppp,modem и т.д.)
# iptables -t filter -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
- удаление некорректных пакетов
#iptables -t mangle -A FORWARD -m conntrack --ctstate INVALID -j DROP
#iptables -t mangle -A INPUT -m conntrack --ctstate INVALID -j DROP
#iptables -t mangle -A OUTPUT -m conntrack --ctstate INVALID -j DROP
- пропуск всех ранее установленных соединений
#iptables -t mangle -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j RESTOREMARK
#iptables -t mangle -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j RESTOREMARK
#iptables -t mangle -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j RESTOREMARK

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

неверно последнее. Надо ACCEPT вместо RESTOREMARK

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

I CAN SEE!!!

Thx to Atlant за очень подробное описание процесса и списка правил. Благодаря вам я понял, как примерно работает IPTables...

Делаем правило для ipset в iptables, а потом просто орудуем списком внутри ipset... И там можно создать несколько таблиц разных и орудовать целыми подсетями...

Заглянув в ман ipset я увидел возможность добавлять МАКи:

ipset -a allow_inet 192.168.1.30,12:34:56:78:9A:BC

Вопроса здесь два: 1. Умеет ли iptables работать в связке с МАКом из ipset (родными методами умеет через mac-source)??? 2. удалить эту запись можно

ipset -d allow_inet 192.168.1.30

или необходимо указывать полный набор параметров, заданных при добавлении:

ipset -d allow_inet 192.168.1.30,12:34:56:78:9A:BC

???

Юзер подключаясь к беспроводной сети динамически получает IP, я этого юзера в глаза не вижу и не знаю, что он может попытаться сделать, а потому мне нужно ему дать доступ по МАКу, вне зависимости от IP... Как я понял, ONLY MAC - это только через mac-source в iptables... ipset понимает подсети??? Если да, тогда предполагаю

ipset create allow_inet bitmap:ip,mac range 192.168.1.0/24
ipset add allow_inet 192.168.1.30,12:34:56:78:9A:BC

или

ipset create allow_inet bitmap:ip,mac range 192.168.1.0/24
ipset add allow_inet 192.168.1.0/24,12:34:56:78:9A:BC

привёл два домысла, т.к. не знаю, на что показывает range в создании таблицы...

Kesano
() автор топика
Ответ на: I CAN SEE!!! от Kesano

1. Умеет ли iptables работать в связке с МАКом из ipset (родными методами умеет через mac-source)???

Не использовал с MAC, но судя по ссылке - может.
http://serverfault.com/questions/386925/using-ipset-and-iptables-for-mac-addr...

2. удалить эту запись можно

аналогично, не использовал с МАС - нужно читать, тестировать.
Судя по примеру для «bitmap:ip,mac» из man ipset

ipset create foo bitmap:ip,mac range 192.168.0.0/16
ipset add foo 192.168.1.1,12:34:56:78:9A:BC
ipset test foo 192.168.1.1
скорее первый вариант.
Но можно попробовать и второго варианта, если использовать «bitmap:ip,net,mac»

привёл два домысла, т.к. не знаю, на что показывает range в создании таблицы...

Общий диапазон сети(к примеру от 10.0.6.0 и до 10.0.50.0)

Atlant ★★★★★
()
Последнее исправление: Atlant (всего исправлений: 2)
Ответ на: комментарий от Atlant

впрочем, кажется вру. Нет такого «bitmap:ip,net,mac». Сужу по своей конфигурации ядра. Может в других есть.

bitmap:ip 
bitmap:ip,mac 
bitmap:port  
hash:ip 
hash:ip,port 
hash:ip,port,ip 
hash:ip,port,net
hash:net 
hash:net,port  
hash:net,iface 
list:set 

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