У меня такая конфигурация uplink'ов и пирингов:
eth0.10--\
eth0.20------>BGP+NAT -eth0.100<------>FastEth 0/0.100 - BRAS<--->Много-серых-IP
eth0.30--/
eth0.10 uplink, адрес на интерфейсе 1.1.1.1/29
eth0.20 uplink, адрес на интерфейсе 2.2.2.2/29
eth0.30 пиринг, адрес на интерфейсе 3.3.3.3/24
eth0.100 VLAN между Border и BRAS, адрес на интерфейсе x.x.x.1/24
FastEth 0/0.100 VLAN между Border и BRAS, адрес на интерфейсе x.x.x.254/24
x.x.x.x/24, y.y.y.y/24, z.z.z.z/24 сети белых IP из моей AS.
Каждому uplink'у и в пиринг анонсирую свой набор подсетей белых IP, поэтому NAT зависит от выходного интерфейса.
В iptables это разруливается так, как писали выше:
$IPT -t nat -A POSTROUTING -o eth0.10 -s 10.0.0.0/24 -j SNAT --to-source x.x.x.1
$IPT -t nat -A POSTROUTING -o eth0.20 -s 10.0.0.0/24 -j SNAT --to-source y.y.y.1
$IPT -t nat -A POSTROUTING -o eth0.30 -s 10.0.0.0/24 -j SNAT --to-source z.z.z.1
Чтобы NAT на linux нормально работал нужно, чтобы в качестве адресов для SNAT, использовались адреса из непосредственно подключенных сетей ( C - connected - в терминологии cisco ).
Я выполнил это условие, написав все мои белые подсети как alias'ы на eth0.100.
Сейчас суммарный трафик ~200 Мбит в максимуме, работает хорошо.