NAT GRE (IP protocol 47) over Linux router

You forgot the -t nat table switch in the PREROUTING/POSTROUTING instructions. Just add it at the front.


Late answer, but I came across the same need and the two following commands do the trick:

# iptables -t nat -A PREROUTING -i eth0 -p gre -j DNAT --to-destination 192.168.0.1
# modprobe nf_conntrack_proto_gre

No need for specifying real IP, simply PREROUTE the gre traffic to the private server and let the gre connection tracker do its job.