Что то типа такого
в файле
/opt/etc/iproute2/rt_tables
200 russia
в /opt/etc/ipset/ipset.conf
create russia hash:net family inet hashsize 1024 maxelem 1048576
в /opt/etc/iptables.raw
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:SET-MARK - [0:0]
:VPN-MARK - [0:0]
-A PREROUTING -i br0 -m state --state NEW -j VPN-MARK
-A PREROUTING -i br0 -m connmark --mark 0x777 -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A SET-MARK -j CONNMARK --set-xmark 0x777/0xffffffff
-A VPN-MARK -d 192.168.0.0/16 -j RETURN
-A VPN-MARK -d 10.0.0.0/8 -j RETURN
-A VPN-MARK -m set --match-set russia dst -g SET-MARK
COMMIT
делаете скрипт, и делаете его исполняемым
/opt/etc/init.d/S01system
PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin
[ "$1" != "start" ] && exit 0
# iproute2
ip rule | grep -q russia
if [ $? -ne 0 ]; then
ip rule add pref 200 from 192.168.0.0/16 fwmark 0x777 lookup russia
fi
# ipset
if [ -f /opt/etc/ipset/ipset.conf ]; then
/opt/sbin/ipset -X
/opt/sbin/ipset restore < /opt/etc/ipset/ipset.conf
fi
insmod /lib/modules/$(uname -r)/iptable_raw.ko
/opt/sbin/iptables -L -n -t raw | grep -q "VPN-MARK"
if [ $? -ne 0 ]; then
/opt/sbin/iptables-restore -T raw < /opt/etc/iptables.raw
fi
ip route default via 192.168.21.1 table russia
exit 0
Ну и пакеты поставить все необходимые.
Итого для каждой новой сессии для первого пакета мы смотрим в ipset, и на весь connection вешаем метку (и не гоним через ipset каждый пакет!)
Согласно метки ищем маршрут в таблице russia
А в этой таблице дефолт указан на ваш 192.168.21.1
А как уж наполнять ipset - динамически или один раз статически - сами решайте. В примере он пустой