on-linkしてるのにルートが作られない。、なぜだろう。
ip route での onlink について。
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
scope link
は、リンクローカルなスコープを示す属性である。
この属性は、特定インターフェースに直接接続されたサブネットを示す。192.168.1.0/24
が、eth0 直接接続であり、192.168.1.0/24
宛の通信はローカルリンク完結であると読み取る。
もっと短く言えば、"scope link" 属性は、リンク上の通信で使う。
static onlink
ルーティングテーブルが特定ネットワークへ直接的な経路を持つ、という意味です。
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 は「〇〇のとき」ではなく、「〇〇の上に」の意味なんだと気づいた。
自分で使うことはあまりない。
通常の経路設定で使うことは無いと思うので。気にしない方がいい。