Обычно люди хотят использовать совместно NAT (смотри NAT HOWTO) и фильтр пакетов. Хорошие новости в том что они работают совместно очень хорошо.
Вы разрабатываете свои правила для фильтра пакетов, полностью игнорируя NAT. Исходные адреса и адреса назначения пакетов, которые будет обрабатывать фильтр, будут "настоящими" исходными адресами и адресами назначения. Пример, если вы делаете DNAT, чтобы любые соединения на 1.2.3.4 порт 80 перенаправлялись на 10.1.1.1 порт 8080, фильтр пакетов будет видеть только пакеты идущие к 10.1.1.1 порт 8080 (настоящий пункт назначения), а не 1.2.3.4 порт 80. Подобно этому, вы можете игнорировать маскарад: для фильтра все пакеты будут казаться приходящими с их настоящих внутренних IP адресов (скажем 10.1.1.1), и ответы на эти пакеты будут как для настоящих IP адресов (ответы будут идти на 10.1.1.1 прим. перевод.).
Вы можете использовать "state" расширение без какой-либо дополнительной нагрузки на фильтр, так как NAT требует отслеживание пакетов в любом случае. Чтобы улучшить простой пример по маскараду данный в NAT HOWTO и запретить любые новые соединения приходящие с ppp0 интерфейса, вы должны сделать следующее:
# Маскарадим ppp0.
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# Запрещаем NEW и INVALID входящие или требуемые маршрутизации пакеты с ppp0.
iptables -A INPUT -i ppp0 -m state --state NEW,INVALID -j DROP
iptables -A FORWARD -i ppp0 0 -m state --state NEW,INVALID -j DROP
# Включаем маршрутизацию пакетов.
echo 1 > /proc/sys/net/ipv4/ip_forward