Linux

GRE keepalive 與 Linux 和 RouterOS

  • January 22, 2022

我有一個 Linux 主機和幾個路由器板。我創建了一個 GRE 隧道,但 Linux 不回答keepalive包。然後路由器將 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?

答案為時已晚,但您可能想要這個: 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;
}

引用自:https://serverfault.com/questions/547275