Если нужно отбирать пакеты по оригинальным адресам (до трансляции), то можно использовать модуль сопоставления (match) conntrack.
Краткая справка опций данного сопоставления (можно посмотреть по iptables -m conntrack --help как и для всех других типов сопоставлений):
[!] --ctstate {INVALID|ESTABLISHED|NEW|RELATED|UNTRACKED|SNAT|DNAT}[,...]
State(s) to match
[!] --ctproto proto Protocol to match; by number or name, e.g. "tcp"
[!] --ctorigsrc address[/mask]
[!] --ctorigdst address[/mask]
[!] --ctreplsrc address[/mask]
[!] --ctrepldst address[/mask]
Original/Reply source/destination address
[!] --ctorigsrcport port
[!] --ctorigdstport port
[!] --ctreplsrcport port
[!] --ctrepldstport port
TCP/UDP/SCTP orig./reply source/destination port
[!] --ctstatus {NONE|EXPECTED|SEEN_REPLY|ASSURED|CONFIRMED}[,...]
Status(es) to match
[!] --ctexpire time[:time] Match remaining lifetime in seconds against
value or range of values (inclusive)
--ctdir {ORIGINAL|REPLY} Flow direction of packet
Но маркировать после SNAT не получится, так как nat выполняется в nat/POSTROUTING уже ПОСЛЕ mangle/POSTROUTING (
диаграмма прохождения пакетов через Netfilter). При этом решение о маршрутизации принимается до SNAT, уже пытаться маршрутизировать пакеты в другую таблицу после SNAT неправильно. Может расскажете подробнее схему?