LINUX.ORG.RU

Не работает цепочка mangle в iptables


0

1

Здравствуйте!
Пытаюсь промаркировать входящий трафик для заворачивания его
на тот-же шлюз с которого он поступил.
Тема давно обсуждалась и не раз, но у меня почему-то правила в
iptables не отрабатывают.
Вот скрипт

TBL1=«prov1»
TBL2=«prov2»
IP1=«a1.a2.a3.a4»
IP2=«b1.b2.b3.b4»
P1_NET=«a1.a2.a3.0/24»
P2_NET=«b1.b2.b3.0/24»

IPTABLES=«/sbin/iptables»

/sbin/depmod -a

/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state

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

ip route flush table $TBL1 > /dev/null 2>&1
ip route flush table $TBL2 > /dev/null 2>&1
ip rule delete fwmark 1 > /dev/null 2>&1
ip rule delete fwmark 2 > /dev/null 2>&1
ip route flush cache

$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD

$IPTABLES -F
$IPTABLES -F -t nat
$IPTABLES -F PREROUTING -t mangle


$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

$IPTABLES -t mangle -A PREROUTING -i eth2 -j CONNMARK --set-mark 1
$IPTABLES -t mangle -A PREROUTING -i eth1 -j CONNMARK --set-mark 2
$IPTABLES -t mangle -A OUTPUT -m state --state new -j CONNMARK --set-mark 0
$IPTABLES -t mangle -A OUTPUT -j CONNMARK --restore-mark

ip rule add fwmark 1 table $TBL1
ip rule add fwmark 2 table $TBL2
ip route add $P1_NET dev eth2 table $TBL1 > /dev/null 2>&1
ip route add default via $IP2 $TBL1 > /dev/null 2>&1
ip route add $P2_NET dev eth1 table $TBL2 > /dev/null 2>&1
ip route add default via $IP1 table $TBL2 > /dev/null 2>&1

Вот ошибка которая выдается на экран

iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
Смотрю iptables -L -nvx -t mangle
таблица mangle пустая

правила rule и route отрабатывают
что посмотреть, где ошибка?


Ответ на: комментарий от Yur4eg

Интерфейсы физически существуют по ним бегает трафик, хочется метить трафик и отправлять его на тот интерфейс с которого он пришел.

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

Каждую команду по отдельности запусти.

Потом на сбойной команде поиграй с target (выстави какой-нибудь известный априори существующий target).

Подгрузи нужные модули в ядро

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

Выяснил что ошибка возникает на строчках содержащих параметр CONNMARK

$IPTABLES -t mangle -A PREROUTING -i eth2 -j CONNMARK --set-mark 1

выдается ошибка

iptables: No chain/target/match by that name

если вместо этой строки запускать

$IPTABLES -t mangle -A PREROUTING -i eth2 -j MARK --set-mark 1

то ошибок не выдается и в таблицу mangle это правило попадает
iptables -t mangle -L -nvx

Chain PREROUTING (policy ACCEPT 1543359 packets, 395169781 bytes)
pkts bytes target prot opt in out source destination
1 84 MARK all  — * * 0.0.0.0/0 a1.a2.a3.a4 MARK set 0x1

Модули в ядро подгружены

/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state

Каких еще не хватает модулей для работы с параметром CONNMARK?

kiotr ()
Ответ на: комментарий от kiotr
[viking@beta ~]$ find /lib/modules/`uname -r` | grep -i mark
...
/lib/modules/2.6.39/kernel/net/netfilter/xt_SECMARK.ko
/lib/modules/2.6.39/kernel/net/netfilter/xt_mark.ko
/lib/modules/2.6.39/kernel/net/netfilter/xt_connmark.ko
/lib/modules/2.6.39/kernel/net/netfilter/xt_CONNSECMARK.ko
...
no-dashi ★★★★★ ()
Ответ на: комментарий от no-dashi

К сожалению у меня нет этих модулей

xt_SECMARK.ko
xt_mark.ko
xt_connmark.ko
xt_CONNSECMARK.ko

можно ли отдельно эти модули закачать или надо обновить ядро?

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

К сожалению у меня нет этих модулей

Команду видишь? :-) Ну вот поищи что у тебя есть. Хотя если ядро древнее или самосбор, то бжжж тебя ждет

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

Спасибо no-dashi, вы очень помогли (действительно сменив ядро у меня заработали цепочки и правила попали в таблицу mangle).


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

Единственное мне до сих пор не понятно как проверить что цепочки маркируются и возвращаются на тот-же самый интерфейс
с которого пришли?
Допустим схема связи такая
|..........|....|.........|___a1.a2.a3.a4___prov1___|.........|......|..............|
|Сервер |___|ШЛЮЗ|...................................|роутер|......|..............|
|..........|....|.........|...................................|.........|____|ПК клиента|
|..........|....|.........|___b1.b2.b3.b4___prov2___|.........|......|..............|

Клиент работает с сервером через роутер к которому подведено
два разных провайдера. Роутер сам определяет доступность канала
к тому или иному провайдеру. Если prov1 канал не доступен, то роутер
начинает отправлять весь трафик от клиента по каналу prov2.
Вот меня и интересует на шлюзе как проверить что трафик маркируется
и отправляется на тот-же самый интерфейс с которого поступил.
Пока у меня работает схема что трафик не зависимо с какого интерфейса
поступил, он возвращается через шлюз a1.a2.a3.a4 т.к. он установлен в
route как default. Почему не работает маркировка?

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