ホストビットが原因でルートが拒否された?意図したプレフィックスを見つけよう
拒否されたルート行は通常ホストビットが原因で、転送の問題ではありません。マスクを広げるのではなく、意図したプレフィックスを特定しましょう。
ルート行が拒否されて返ってきて、見つけた助言は IP 転送を有効にしろと言います。この二つは問題の別の段階にあります。転送はホストがインターフェース間でパケットを動かせるかどうかを決めるもので、入力した宛先が有効なネットワークかどうかには意見を持ちません。まずプレフィックスを直してください。転送は、アドレスとマスクが食い違っている状態を救いません。
パーサーが実際に文句を言っていること
アドレスとマスクで書かれた宛先はネットワークを表す必要があり、ネットワークはホストビットがゼロで始まります。指定したアドレスがまだホスト部分に値を持つ場合、その組み合わせは内部で矛盾しています。172.20.130.0 はゼロで終わるので整って見えますが、四番目のオクテットのゼロだけが重要なわけではありません。ここで余分なビットを持っているのは三番目のオクテットです。
ツールはその矛盾をそれぞれ違う形で扱います。厳格なパーサーは行を拒否し、ホストビットを名指しします。寛容なパーサーはアドレスをマスクし、頼んでいないものをインストールしますが、設定が意図していない範囲をルーティングするようになるので、より悪い結果です。Python の ipaddress モジュールは選択肢を直接示し、厳格なネットワーク解析はエラーを出し、strict=False はホストビットをマスクします。クライアントはバージョン間で厳格だったり寛容だったり一貫しなかったりするので、習慣を信じずメッセージを読んでください。
例を手で追ってみる
トンネルが /20 マスクで 172.20.130.0 に届く必要があるとします。/20 は三番目のオクテットから四つのビットを借りるので、そのオクテットは 16 刻みでしか数えられず、0、16、32、そして 240 まで続きます。値 130 は 128 と 143 の間にあり、それを囲むネットワークは 172.20.128.0 から始まり、最後のオクテットをゼロにした 172.20.130.0 からではありません。
書き出すと、ブロックは 172.20.128.0 から 172.20.143.255 までで、4,096 個のアドレスを持ちます。同じ値を非厳格なパーサーに渡すと、あなたの代わりに行う置き換えが示されます。
$ python3 -c "import ipaddress; n=ipaddress.ip_network('172.20.130.0/20', strict=False); print(n, n.num_addresses)"
172.20.128.0/20 4096実際にどの宛先を意図したのか決める
拒否された行は通常、三つの意図のうち一つを隠しており、選べるのはあなただけです。トンネルがブロック全体を必要とするなら、正規のネットワークアドレスである 172.20.128.0/20 を書きます。トンネルが 130 セグメントだけを必要とするなら、マスクが間違っており、172.20.130.0/24 が正直な形です。単一のマシンが対象なら、 IPv4 のホストルートは /32 であり、 マスク演算は関与しません。
どれも許可する通信量が異なり、苦情が止むまでマスクを広げない本当の理由がこれです。/16 はほぼどこでも行を受け入れ、トンネル経由でルーティングするつもりのなかった宛先へ通信を送ります。意図に合う最も狭いプレフィックスを書き、それを待っている次のホップに対して確認してください。パーサーの沈黙に対してではありません。
転送が解決策でなかった理由
拒否されたルートは転送経路に決して到達しないので、net.ipv4.ip_forward を切り替えても結果は変わりません。 その設定は後で、ホストがインターフェース間でパケットを渡す必要があるときに重要になります。テーブルが正しくなる前に有効にしても、次にどの段階が失敗するかが変わるだけです。
同じ地点で、ほかに二つのものがよく責められます。ルートが受け入れられても、より具体的なルートに負けることがあり、ファイアウォール規則が正しい検索の後に通信を落とすことがあります。段階を分けてください。構文、インストール、選択、フィルタリングです。間違った段階で作業すると生産的に感じます。どの変更も何かを再起動するからです。
インストールされたルートと、それが勝つ経路を確認する
クライアントが行を受け入れたら、何をインストールしたか、ブロック内の代表的なアドレスに対してカーネルがどのルートを選ぶかを見ます。インストールされたプレフィックスが書いたものと違うなら、ノーマライザーがあなたの代わりに動いています。
ブロック内のメンバーアドレスと外側のアドレスの両方を、安心できる一行だけではなく比較が意味を持つように問い合わせてください。
ip -4 route show 172.20.128.0/20
ip -4 route get 172.20.140.10
ip -4 route get 172.20.200.10三番目の問い合わせは、プレフィックスが正しければトンネルの外に落ちるはずで、落ちないなら作ったルートは思っているより広いということです。次の設定に触れる前に、プレフィックスが何をカバーするはずだったかを記録してください。解析できるルートと機能する経路は、別々の観察のままです。