GRE 与 Linux 和 RouterOS 保持连接

GRE 与 Linux 和 RouterOS 保持连接

我有一台 Linux 主机和几台路由器。我创建了 GRE 隧道,但 Linux 没有响应活着包。然后路由器将 gre 连接标记为无法到达,所以我无法从路由器子网发送到 Linux 主机。如果 Linux 向隧道发送某些内容(ping 等)- RouterOS 将连接标记为可达。第二接下来的包裹路由顺利进行,直到空闲一分钟(无流量)。

在Linux中隧道的建立方法如下:

remote=x.x.x.x
dev=gre21
network=10.21.0.0/16

ip tunnel add ${dev} mode gre remote ${remote} ttl 255
ip addr add 172.16.1.1/24 peer 172.16.1.21 dev ${dev}
ip link set ${dev} up
ip route add ${network} dev ${dev}

ip l

14: gre21: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN 
    link/gre 0.0.0.0 peer 109.60.170.15

如何设置状态跑步

如何保持隧道活动?在 cron 中进行 Ping?

答案1

答案已经太晚了,但你可能想要这个: https://github.com/Jamesits/linux-gre-keepalive

如果您有兴趣了解设置有何accept_local帮助,这里有一个答案: https://bv2ex.com/t/588215

GRE Keepalive 是封装在“路由器到主机”GRE 数据包内的“主机到路由器”GRE 数据包。其原理是主机(在本例中为 Linux)接收数据包,发现该数据包实际上是路由器的 GRE 数据包,然后将其发送回去。路由器接收此数据包并知道远端仍在响应。

Linux FIB 代码是这样的,如果它收到源是本地单播地址的流量,则该流量被视为无效。

观察以下代码:

net/ipv4/fib_frontend.c

if (res.type != RTN_UNICAST) {
if (res.type != RTN_LOCAL || !accept_local)
    goto e_inval_res;
}

答案2

这并非是对 GRE 隧道保持活动的直接回答,但是您可能会发现在 Linux 服务器上使用 MikroTik EoIP 选项更容易,因为它已被移植并且允许以类似的方式使用隧道 ID 和保持活动(还处理任何大小链接的碎片)。

https://code.google.com/p/linux-eoip/

答案3

只需执行crontab -e并输入以下行:

*/1 * * * * ping -c 69 <ip>

对于我来说,它的工作原理很简单,就是保持 ping 有效。

相关内容