Zend certified PHP/Magento developer

GRE tunnel, public IPs, inbound works, outbound timed out

I have really weird problem. I have public IP subnet routed to server (let’s call it tun1) by BGP (announced by bird) which I am sending further into nodes. I am using GRE tunnel for that purpose.
I can ping public IP on VM on second node, but I am not able to get any connections past tun1.
Both servers are in different localities, has own public IPs – different from subnet I am routing.

simple network map –
this way I am able to ping last host in this line:

internet->(1.2.3.1)tun1(GRE-noip)->(GRE-noip)(7.8.9.1)vmserver(4.5.6.1)->VM(4.5.6.2)

this way is timing out

VM(4.5.6.2)->(4.5.6.1)vmserver(7.8.9.1)(GRE-noip)->(GRE-noip)tun1 - here it ends

VM parameters:

ip addr add 4.5.6.2/24 eth0
ip route add 4.5.6.1

vmserver parameters:

ip tunnel add gre1 mode gre local 7.8.9.1 remote 1.2.3.1 ttl 255
ip link set gre1 up
ip rule add from 4.5.6.0/24 table 666
ip route add default dev gre1 table 666
ip route add 4.5.6.0/24 dev vmbr0 table 666
echo 0 > /proc/sys/net/ipv4/conf/gre1/rp_filter

tun1 parameters:

ip tunnel add gre1 mode gre remote 7.8.9.1 local 1.2.3.1 ttl 255
ip route add 4.5.6.2 dev gre1
ip route add 4.5.6.1 dev gre1
  • ip_forwarding is set to 1 on both sides.
  • tcpdump says this:
    1.2.3.1 (public IP of tun1) > 8.8.8.8: ICMP time exceeded in-transit, length 72
  • because of bird routing, I have this in routing table on tun1:
    4.5.6.0 0.0.0.0 255.255.255.0 U 0 0 0 *

Any help would be appreciated. I can’t think about any issue here – maybe some additional eyes will spot something.

Many thanks.