我有一台 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 和保持活动(还处理任何大小链接的碎片)。
答案3
只需执行crontab -e
并输入以下行:
*/1 * * * * ping -c 69 <ip>
对于我来说,它的工作原理很简单,就是保持 ping 有效。