Linux
GRE keepalive 與 Linux 和 RouterOS
我有一個 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/588215GRE 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; }