それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ip route のOn-Linkがよくわからないので、ちょっと調べた。

on-linkしてるのにルートが作られない。、なぜだろう。

onlink は on-link (強制的にルートを入れる)と意味です。

似たようなものに、scope link があって勘違いしてました。

いくつかの記事から見てみます。

https://forum.openwrt.org/t/routes-onlink-missing-doc/114941

On-Link route means one that the addresses that belong to it can be resolved locally and gateway is not needed. For example a route to 127.0.0.0/8 is on-link via interface lo0. In your example the use of on-link is wrong. on-link ルートは指定したアドレス範囲に属するアドレスが、ローカルのルーティングテーブルで解決されゲートウェイを必要としない、ということを意味する。 たとえば、127.0.0.0/8 なら via interface lo0 でon-linkになるのである。これを踏まえると君の例のon-linkは設定ミスになる。

The onlink option is used in very rare cases. When you create a static route, the next hop address must be directly reachable by the specified device, meaning it must be from the same IP subnet. Otherwise you'll get an error response.

onlinkオプションは稀有事例で使われるようです。静的ルートを作ったとして、ネクスト・ホップのアドレスはデバイス到達圏内(同じサブネットなど)

Using this option, we tell the kernel that the next hop is located in the same Layer 2 segment.

onlink means that the routing should "pretend that the nexthop is directly attached to this link, even if it does not match any interface prefix". So we can make a fake one of those in the table too: https://unix.stackexchange.com/questions/579087/whats-the-meaning-of-linkdown-and-onlink-in-linux-route

onlink はルーティング で次の意味である「Next Hop が直接疎通可能として振る舞う。サブネットマスクが不一致であろうがなかろうが無関係にそう扱う。」つまり、ルーティング・テーブルに追加して擬似的に振る舞う。

When enabled, gateway is on-link even if the gateway does not match any interface prefix 有効時はGWはonlink になる。GWに指定したIPプレフィックス(ネットワークアドレス)が不合致でもGWに登録される。

次のようなネットワークがあるときに、

onlink は次のような例になるようです、

192.168.9.2/32 宛は、192.168.9.2 に eth0 から投げる / onlink

192.168.9.2/32 dev eth0 proto static onlink

192.168.7.0/24 宛は、192.168.9.1 に eth0 から投げる / onlink

192.168.7.0/24 via 192.168.9.1 dev eth0 proto static onlink

192.168.1.0 宛は、eth0から流す。 / scope link

192.168.1.0/24 dev eth0 proto static scope link

デフォルト / gw / static

default via 192.168.1.1/24 dev eth0 proto static 

scope link は、リンクローカルなスコープを示す属性である。

この属性は、特定インターフェースに直接接続されたサブネットを示す。192.168.1.0/24 が、eth0 直接接続であり、192.168.1.0/24宛の通信はローカルリンク完結であると読み取る。

もっと短く言えば、"scope link" 属性は、リンク上の通信で使う。

ルーティングテーブルが特定ネットワークへ直接的な経路を持つ、という意味です。

192.168.7.0/24 のネットワークへは、192.168.9.1 を経由するようにeth0送出される。

onlink は静的ルート属性であり、直接接続されたeth-に対してルートが有効を示す。

実際の例

実際の例を見てみると、少し想像がつくかもしれない。

デフォルトルートが構成されている例。

default via 192.168.1.1 dev eth0 proto static src 192.168.1.2 metric 240 onlink

特定のネットワークアドレス宛の例

192.168.7.0/24 via 192.168.9.1 dev eth0 proto static src 192.168.1.2 metric 240 onlink

このような感じになると思うが、特定ネットワークアドレス向けでは onlink はなくても動くので用途がないと感じる。

ややこしい

on-link だから 「リンクしたときに使う」と考えて、「 ip link set dev eth0 up 」した時にデバイスが有効化されるのとおなじように、ip addr が割り当てたら使うのかと思ったら、全然そんなことはなかった。私が混乱した理由は、on の意味の誤解だった。onlink のon は「〇〇のとき」ではなく、「〇〇の上に」の意味なんだと気づいた。

自分で使うことはあまりない。

通常の経路設定で使うことは無いと思うので。気にしない方がいい。