Не работает маршрутизация по дополнительным таблицам маршрутизации.Дело в следующем:
Есть шлюз:
операционка Linux Fedora Core v.14 (v.13)
(NetworkManager из системы удален; avahi daemon остановлен (на всякий случай));
пять сетевых плат:
eth0: (смотрит в сторону первого (GW: 80.254.7.193) провайдера)
IP: 80.254.7.206
eth1: (смотрит в сторону второго (GW: 192.168.64.128) провайдера)
IP: 192.168.64.1/24
eth2: (смотрит в сторону третьего (GW: 192.168.128.129) и четвертого (GW: 192.168.128.130) провайдеров)
IP: 192.168.128.1/24
eth3: (смотрит на малую локальную сеть 'net_a')
IP: 192.168.192.128/24
eth4: (смотрит на локальную сеть 'net_b')
IP: 172.16.31.128/16Задача:
для малой локальной сети 'net_a':
четные сетевые адреса (192.168.192.0/255.255.255.1) вывести через третьего провайдера (т.е. через 192.168.128.129);
нечетные сетевые адреса (192.168.192.1/255.255.255.1) вывести в нет через четвертого провайдера (т.е. через 192.168.128.130);
для локальной сети 'net_b':
выборочные адреса (допустим 172.16.31.129 и 172.16.31.130) вывести через первого провайдера (т.е. через 80.254.7.193);
остальных через второго провайдера (т.е. через 192.168.64.128).Проблема:
...при пробросе I'netа для малой локальной сети.==>
> cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
5 tbl_a
10 tbl_b
15 tbl_c
20 tbl_d> ip rule list
0: from all lookup local
32762: from all fwmark 0xc lookup tbl_d
32763: from all fwmark 0xd lookup tbl_c
32764: from all fwmark 0xe lookup tbl_b
32765: from all fwmark 0xf lookup tbl_a
32766: from all lookup main
32767: from all lookup default> ip route list
80.254.7.192/26 dev eth0 proto kernel scope link src 80.254.7.206
192.168.192.0/24 dev eth3 proto kernel scope link src 192.168.192.128
192.168.128.0/24 dev eth2 proto kernel scope link src 192.168.128.1
192.168.64.0/24 dev eth1 proto kernel scope link src 192.168.64.1
172.16.0.0/16 dev eth4 proto kernel scope link src 172.16.31.128> ip route list table tbl_c
192.168.192.0/24 dev eth3 scope link src 192.168.192.128
192.168.128.0/24 dev eth2 scope link src 192.168.128.1
127.0.0.0/8 dev lo scope link
default via 192.168.128.129 dev eth2> ip route list table tbl_d
192.168.192.0/24 dev eth3 scope link src 192.168.192.128
192.168.128.0/24 dev eth2 scope link src 192.168.128.1
127.0.0.0/8 dev lo scope link
default via 192.168.128.130 dev eth2<==
На интерфейсе eth2 поднят NAT.
В таком варианте правил маршрутизации компьютера малой локальной сети не получают ответ из I'netа.
Если добавить команду:
> ip route add default via 192.168.129.130 dev eth2все работает.
Вопрос:
в чем баг? Почему без правила добавленного в таблицу main не приходит ответ по правлам таблиц tbl_c и tbl_d?
>[оверквотинг удален]
> <==
> На интерфейсе eth2 поднят NAT.
> В таком варианте правил маршрутизации компьютера малой локальной сети не
> получают ответ из I'netа.
> Если добавить команду:
>> ip route add default via 192.168.129.130 dev eth2
> все работает.
> Вопрос:
> в чем баг? Почему без правила добавленного в таблицу main
> не приходит ответ по правлам таблиц tbl_c и tbl_d?а где пакеты метятся?
> а где пакеты метятся?iptables -t mangle -A PREROUTING -i eth3 -s 192.168.192.0/255.255.255.1 -j MARK --set-mark 12
>> а где пакеты метятся?
> iptables -t mangle -A PREROUTING -i eth3 -s 192.168.192.0/255.255.255.1 -j MARK --set-mark
> 12а NAT как выглядит?
> а NAT как выглядит?Сокращенно:
#!/bin/sh
FW="/sbin/iptables"
IF_LO="lo"
IF_0="eth0"
IF_1="eth1"
IF_2="eth2"
IF_3="eth3"
IF_4="eth4"
IP_0="80.254.7.206"
IP_1="192.168.64.1"
IP_2="192.168.128.1"
IP_3="192.168.192.1"
IP_4="172.16.31.128"
NETA="10.0.0.0/8"
NETB="172.16.0.0/12"
NETC="192.168.0.0/16"
NETL="172.16.0.0/16"# Установка политики поведения по умолчанию
$FW -P INPUT DROP
$FW -P FORWARD DROP
$FW -P OUTPUT DROP
$FW -t nat -P PREROUTING ACCEPT
$FW -t nat -P OUTPUT ACCEPT
$FW -t nat -P POSTROUTING ACCEPT
$FW -t mangle -P PREROUTING ACCEPT
$FW -t mangle -P INPUT ACCEPT
$FW -t mangle -P FORWARD ACCEPT
$FW -t mangle -P OUTPUT ACCEPT
$FW -t mangle -P POSTROUTING ACCEPT
# Удаление всех правил
$FW -F
$FW -t nat -F
$FW -t mangle -F
# ...в том числе нестандартных
$FW -X
$FW -t nat -X
$FW -t mangle -X# Прохождение пакетов по интерфейсу "петля"
$FW -A INPUT -p ALL -i $IF_LO -j ACCEPT
$FW -A OUTPUT -p ALL -o $IF_LO -j ACCEPT# Для меня любимого открываю все!
$FW -A INPUT -p ALL -i $IF_2 -j ACCEPT
$FW -A OUTPUT -p ALL -o $IF_2 -j ACCEPT# Разметка пакетов для маршрутизации
$FW -t mangle -A PREROUTING -i $IF_4 -s 192.168.192.0/255.255.0.1 ! -d 172.16.0.0/16 -j MARK --set-mark 12
$FW -t mangle -A PREROUTING -i $IF_4 -s 192.168.192.1/255.255.0.1 ! -d 172.16.0.0/16 -j MARK --set-mark 13# NAT на интерфейсе eth2
$FW -t nat -A POSTROUTING -p ALL -o $IF_2 -j SNAT --to-source $IP_2# Проход для малой подсети
$FW -A FORWARD -p ALL -i $IF_3 -j ACCEPT
$FW -A FORWARD -p ALL -o $IF_3 -j ACCEPT
В свете последних изысканий...Если ввести:
> ip rule add from 192.168.192.0/24 table tbl_cили
> ip rule add from 192.168.192.0/24 table tbl_dмалая подсеть начинает получать нормальный I'net.
Все остальные правила и скрипты оствил без изменений.Из чего напрашивается малоутешительный вывод: не срабатывает либо маркировка пакетов в iptables, либо iproute2 плюет на правила:
32762: from all fwmark 0xc lookup tbl_d
32763: from all fwmark 0xd lookup tbl_c
32764: from all fwmark 0xe lookup tbl_b
32765: from all fwmark 0xf lookup tbl_aВопрос: как это можно выровнять?
В очередной раз сам спрашивал - сам отвечаю.Решение проблемы оказалось как всегда простым:
> sysctl -w net.ipv4.conf.eth2.rp_filter=0Более того, я лишний раз убедился, что в мануалах нужно внимательно читать не только основной текст, но и между строк. :-)
Всем спасибо.