How to configure gre-over-udp on Linux

How to setup a gre-over-udp tunnel on Linux is something I have learned and
forgotten a few times now. So here is how you do it.

modprobe fou
ip fou add port 4754 ipproto 47
ip link add name fou0 type gre remote <remote-ip> encap fou encap-sport auto encap-dport <remote-dport> dev eth0
ip addr add 100.100.1.1/16 dev fou0
ip link set up dev fou0
$ sudo tcpdump -vi <interface>
dropped privs to tcpdump
tcpdump: listening on <interface>, link-type EN10MB (Ethernet), snapshot length 262144 bytes
18:25:40.018795 IP (tos 0x0, ttl 64, id 10744, offset 0, flags [DF], proto UDP (17), length 116)
    10.11.1.2.40734 > 10.11.2.2.gre-in-udp: UDP, length 88
18:25:40.018850 IP (tos 0x0, ttl 62, id 16735, offset 0, flags [DF], proto UDP (17), length 116)
    10.11.2.2.40734 > 10.11.1.2.gre-in-udp: UDP, length 88

networking