Жаль, что MaxGear не описал решение проблемы. В файле linux/net/ipv4/ipip.c надо изменить вот что:
--- 0ipip.c 2012-05-03 13:49:32.000000000 +0400
+++ ipip.c 2012-05-03 13:49:32.000000000 +0400
@@ -618,14 +618,14 @@
iph = ip_hdr(skb);
iph->version = 4;
iph->ihl = sizeof(struct iphdr)>>2;
- iph->frag_off = df;
+ iph->frag_off = 0;
iph->protocol = IPPROTO_IPIP;
iph->tos = INET_ECN_encapsulate(tos, old_iph->tos);
iph->daddr = rt->rt_dst;
iph->saddr = rt->rt_src;
if ((iph->ttl = tiph->ttl) == 0)
- iph->ttl = old_iph->ttl;
+ iph->ttl = 30;
nf_reset(skb);
После изменения нужно пересобрать модуль ipip.
Изменение переменной iph->ttl нужно, только если TTL исходного пакета не хватает для прохождения внутри туннеля с учетом "внешних" хопов. В частности, в multicast-пакетах обычно TTL=1, поэтому они через туннель не пройдут, если "снаружи" больше 1 хопа. Число 30 взято из исходников FreeBSD'шного gif-интерфейса.