É muito comum a utilização de Network Address Translation (veja o NAT HOWTO) em conjunto com a filtragem de pacotes. A boa notícia é que eles se misturam muito bem.
Primeiramente, você projeta e constrói seu filtro de pacotes ignorando totalmente qualquer NAT a ser feito. As origens e destinos que o filtro de pacotes verá serão as origens e destinos reais. Por exemplo, se você fará DNAT para mandar conexões do endereço 1.2.3.4 porta 80 para 10.1.1.1 porta 8080, o filtro de pacotes verá pacotes indo para 10.1.1.1 porta 8080 (o destino real), e não 1.2.3.4 porta 80. Similarmente, você pode ignorar o masquerading: os pacotes vão parecer que têm como origem o real enderço IP interno (por exemplo 10.1.1.1), e as respostas vão parecer que têm como destino esse mesmo endereço.
Pode-se utilizar a extensão de checagem do estado dos pacotes (state match) sem fazer com que o filtro de pacotes tenha qualquer trabalho extra, uma vez que NAT já requer acompanhamento de conexão. Para melhorar o simples exemplo de masquerading descrito no NAT HOWTO a fim de rejeitar quaisquer novas conexões vindo na interface ppp0, isso seria feito:
# Fazer masquerade pela interface ppp0
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# Rejeitar conexões novas (NEW) e inválidas (INVALID) de pacotes com destino à
maquina local ou que devem ser repassados vindos de ppp0.
iptables -A INPUT -i ppp0 -m state --state NEW,INVALID -j DROP
iptables -A FORWARD -i ppp0 -m state --state NEW,INVALID -j DROP
# Habilitar IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward