Здравствуйте, уважаемые. Внизу представлен на Ваше внимание скрипт запуска маршрутизации через 2х провайдеров. Не получается настроить ответ по тому же каналу, откуда приходит пакет. Пакет всегда попадает в таблицу main и отправляется по default. Исходящие пакеты из локал сетей идут правильно, их маркировка работает. А вот пакеты приходящие на сам роутер, транзитные идут неправильно. Где у меня может быть ошибка? Особенно хотелось бы разобраться в последовательности применения и правильности команд для CONNMARK как для входящих на роутер, так и проходящих сквозь него пакетов ( Как я понимаю суть команд помечено в комментариях скрипта). Поправьте, где я ошибаюсь. СПАСИБО.
P.S. eth0 - 1 пров, eth1 - 2 пров. Маркировка 10 для 1 прова, 20 для 2-го.
#!/bin/bash
echo "1">/proc/sys/net/ipv4/ip_forward
echo "0">/proc/sys/net/ipv4/conf/all/rp_filter
iptables -t mangle -F
iptables -t nat -F
iptables -t filter -F
###---PREROUTING------
# Маркирую соединения из локальных сетей:
iptables -t mangle -A PREROUTING -s $NET_LOCAL1 -j CONNMARK --set-mark 10 # --set-mark 10 for PROV1
iptables -t mangle -A PREROUTING -s $NET_LOCAL2 -j CONNMARK --set-mark 20 # --set-mark 20 for PROV2
iptables -t mangle -A PREROUTING -s $NET_LOCAL3 -j CONNMARK --set-mark 10 # --set-mark 10 for PROV1
# Маркирую соединения с внешних интерфейсов:
iptables -t mangle -A PREROUTING -i eth0 -j CONNMARK --set-mark 10
iptables -t mangle -A PREROUTING -i eth1 -j CONNMARK --set-mark 20
# Маркирую все пакеты внутри соединений по меткам самих соединений:
iptables -t mangle -A PREROUTING -m connmark --mark 10 -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m connmark --mark 20 -j CONNMARK --restore-mark
###---FORWARD---
# Для транзитных пакетов я пока не начать разбираться, так как не заработала маршрутизация на самом роутере.
###---INPUT---
# Устанавливаю маркировку пакетов по маркировке соединений (такое уже делается в PREROUTING, написал для контроля за счетчиками)
iptables -t mangle -A INPUT -m connmark --mark 10 -j CONNMARK --restore-mark
iptables -t mangle -A INPUT -m connmark --mark 20 -j CONNMARK --restore-mark
####--------OUTPUT----------
# В локальные сети не трогаем
iptables -t mangle -A OUTPUT -d $NET_LOCAL1 -j RETURN
iptables -t mangle -A OUTPUT -d $NET_LOCAL2 -j RETURN
iptables -t mangle -A OUTPUT -d $NET_LOCAL3 -j RETURN
# Выходящие пакеты маркируем по номерам соединений
iptables -t mangle -A OUTPUT -m connmark --mark 10 -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -m connmark --mark 20 -j CONNMARK --restore-mark
###--------POSTROUTING----
# Здесь NAT
iptables -t nat -A POSTROUTING -s $NET_LOCAL3 -m mark --mark 10 -j ACCEPT
iptables -t nat -A POSTROUTING -s $NET_LOCAL2 -m mark --mark 20 -j ACCEPT
iptables -t nat -A POSTROUTING -m mark --mark 10 -j SNAT --to-source $IP_PROV1
iptables -t nat -A POSTROUTING -m mark --mark 20 -j SNAT --to-source $IP_NAT_PROV2
ip route flush table T_LOCAL
ip route flush table T_PROV1
ip route flush table T_PROV2
ip route add $NET_LOCAL1 dev $IF_LOCAL1 table T_LOCAL
ip route add $NET_LOCAL2 dev $IF_LOCAL2 table T_LOCAL
ip route add $NET_LOCAL3 dev $IF_LOCAL3 table T_LOCAL
ip route add $NET_PROV1 dev $IF_PROV1 src $IP_PROV1 table T_PROV1
ip route add 127.0.0.0/8 dev lo table T_PROV1
ip route add default via $GW_PROV1 dev eth0 table T_PROV1
ip route add $NET_PROV2 dev $IF_PROV2 src $IP_PROV2 table T_PROV2
ip route add 127.0.0.0/8 dev lo table T_PROV2
ip route add default via $GW_PROV2 dev eth1 table T_PROV2
#заполнение таблицы main
ip route del default
ip route add default via $GW_PROV1
ip rule show | grep -Ev '^(0|32766|32767):|iif lo' \
| while read PRIO NATRULE; do
ip rule del prio ${PRIO%%:*} $( echo $NATRULE | sed 's|all|0/0|' )
done
ip rule add from all lookup T_LOCAL pref 5
ip rule add fwmark 10 table T_PROV1 pref 10
ip rule add fwmark 20 table T_PROV2 pref 20
ip route flush cache
exit 0