Depois de algumas experiências, acho que respondi a minha pergunta, por isso devo publicá-la aqui, caso alguém considere útil. Sim, é possível, e é bastante simples, apenas uma questão de obter a combinação certa de endereços e portas.
Comentários do meu script:
# summary:
# allow forwarding *to* destination ip:port
# allow forwarding *from* destination ip:port
# nat packets identified by arrival at external IP / port to have
# *destination* internal ip:port
# nat packets identified by arrival at internal IP / port to have
# *source* internal network IP of gateway machine
Para o exemplo na pergunta:
# allow inbound and outbound forwarding
iptables -A FORWARD -p tcp -d 192.168.2.10 --dport 54321 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.2.10 --sport 54321 -j ACCEPT
# route packets arriving at external IP/port to LAN machine
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 12345 -j DNAT --to-destination 192.168.2.10:54321
# rewrite packets going to LAN machine (identified by address/port)
# to originate from gateway's internal address
iptables -A POSTROUTING -t nat -p tcp -d 192.168.2.10 --dport 54321 -j SNAT --to-source 192.168.2.5
O roteiro real, já que isso deve ser mais fácil de aplicar diretamente:
# EXTIP = external IP of gateway (1.2.3.4)
# EPORT = external port (12345)
# DIP = destination IP in local network (192.168.2.10)
# DPORT = destination port (54321)
# INTIP = internal IP of gateway (192.168.2.5)
iptables -A FORWARD -p tcp -d $DIP --dport $DPORT -j ACCEPT
iptables -A FORWARD -p tcp -s $DIP --sport $DPORT -j ACCEPT
iptables -A PREROUTING -t nat -p tcp -d $EXTIP --dport $EPORT -j DNAT --to-destination $DIP:$DPORT
iptables -A POSTROUTING -t nat -p tcp -d $DIP --dport $DPORT -j SNAT --to-source $INTIP
Espero que a resposta seja útil para outra pessoa e que eu não esteja abarrotando o site com algo que já foi tratado muitas vezes.