デフォルトルートではなく、特定のインターフェイス上のすべてのトラフィックを特定のゲートウェイにルーティングするにはどうすればよいですか?

デフォルトルートではなく、特定のインターフェイス上のすべてのトラフィックを特定のゲートウェイにルーティングするにはどうすればよいですか?

wlan0マイコンピュータには(デフォルトパス)と2つのインターフェースがありますtun0tun0インターフェイスはローカルネットワークであり、対応するIP範囲はであり172.16.150.0/24、マイコンピュータ(コンピュータA)のIPアドレスはであり172.16.150.1、他のコンピュータ(コンピュータB)のIPアドレスはです。のIPアドレスはです172.16.150.128。私はWi-Fiホットスポットを設定し、それは私のために別のインターフェースを作成しましたap0ap0インターフェイス上のすべてのトラフィックをマシンBを介してルーティングしたいと思います(したがって、ゲートウェイは必要です172.16.150.128)。

$ ip route
default via 192.168.0.1 dev wlan0 proto dhcp src 192.168.0.179 metric 1024
172.16.150.0/24 dev tun0 proto kernel scope link src 172.16.150.1 metric 1024
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.179 metric 1024 
192.168.0.1 dev wlan0 proto dhcp scope link src 192.168.0.179 metric 1024 
192.168.12.0/24 dev ap0 proto kernel scope link src 192.168.12.1

この時点でデフォルトルートはあるため、すべてのトラフィックを自分のホームルーターのインターフェイスに192.168.0.1ルーティングします。wlan0

ap0私は経験豊富なLinuxユーザーではないので、Linuxカーネルがゲートウェイを介してすべてのトラフィックをルーティングする方法を知りません172.16.150.128。しかし、私が試した方法は次のとおりです。

$ ip route add default 192.168.12.0/24 via 172.16.150.128
Error: either "to" is duplicate, or "192.168.12.0/24" is a garbage.

192.168.12.0/24ここでは、カーネルがサブネット上のすべてのトラフィックをゲートウェイを介してルーティングできるようにします172.16.150.128

$ ip route add 192.168.12.0/24 via 172.16.150.128
RTNETLINK answers: File exists

前のコマンドと同じですが、default単語はありません。役に立つ可能性があることを読んip addr flush dev ap0でいますが、インターフェイスとそのIPアドレスがリセットされるため、手動でIPアドレスを復元するip addr addか、Wi-Fiホットスポットを再起動する必要があります。

インターフェイスを更新したくないが、パスをdefault特定のゲートウェイに変更したいので、これが正しいアプローチだとは思わない。

どうすればいいですか?

ベストアンサー1

ここでは、単純なルーティングだけでは十分ではありません。単純なルーティングは目的地を考慮します。しかし、ここでの目標は、ソースに応じてパスを変更することです。そうすることをいわゆるポリシールーティング。 Linuxでは、送信元IPアドレスや送信元パケットの着信インターフェイスなどの他のセレクタ(ターゲットだけでなく)を使用して代替ルートテーブルを選択することによってこれを行います。これらのバックアップルーティングテーブルには、他のデフォルトルートを含む他のルートがあり、最終的に一般的なルートとは異なるパケットルートを選択します。基本ルーティングテーブル。

これは通常、一部と組み合わせて使用​​されます。ip rule add ... lookup TABLE+一部ip route add ... table TABLE、解決したい問題に合わせて選択内容を調整してください。ip rule ...さまざまな処理のためのソースベースセレクタがあることが多く、ip route ...その場合は代替ターゲットがあるかもしれません。

したがって、この場合は以下のようにすることができます。

  • バックアップルーティングテーブルの準備(テーブル1000を使用)

    このテーブルには必要なものがすべて含まれている必要があるため、デフォルトのルーティングテーブルの一部が手動でコピーされます。

    ip route add 192.168.12.0/24 dev ap0 table 1000
    ip route add 172.16.150.0/24 dev tun0 table 1000
    

    もちろん、目標を達成するための代替基本パスもあります。

    ip route add default via 172.16.150.128 dev tun0 table 1000
    
  • 2 つの関連インターフェイスの代替ルーティングテーブルを選択します。

    ip rule add iif ap0 lookup 1000
    ip rule add iif tun0 lookup 1000
    

    ルーティングルールは次のとおりです。

    # ip rule
    0:    from all lookup local
    32764:    from all iif tun0 lookup 1000
    32765:    from all iif ap0 lookup 1000
    32766:    from all lookup main
    32767:    from all lookup default
    

これにより、マシンのルーティングの問題が解決されます(ただし、リモートシステムへのルーティングまたはNATの使用に関する次のセクションを参照)。

  • のすべてのパケットは、ap0代替ルーティングテーブルを使用して次に送信されます。tun0

    これには、172.16.150.128 を通過するインターネットに送信されるトラフィックが含まれます。詳細:このシステムに特別に送信されたトラフィックは実際には地元の最初のものはルーティングテーブルなので、いつものように動作します。

  • すべての着信パケットはtun0代替ルーティングテーブルを使用します。

    • (このシステムに送信されると、実際に地元のルーティングテーブルはまずそのシステムにルーティングされます)

    • 192.168.12.0/24 に送信する場合は、以下を使用します。ap0

    • 詳細:他の場合、ルートルックアップはトラフィックを172.16.150.128に戻します。

      しかし、実際にはこのようなことが絶対に起こってはいけません。

ダウンしてap0再びtun0上がると、テーブル1000の関連パスが失われるため、追加する必要があります。


一つの問題が残っています。 172.16.150.0/24 LAN上のシステムが192.168.12.0/24について何も知らない場合、応答トラフィックはそのシステム(172.16.150.1)に返送されません。彼らはおそらく172.16.150.128である独自のデフォルトゲートウェイを使用します。同様に、172.16.150.128 は、192.168.12.0/24 へのすべてのトラフィックを独自のアップストリームゲートウェイに送信できます。去るこの機械を通してではなくこの機械から。

この問題を解決するには:

  • このLANを172.16.150.0/24の他のシステムに通知してください(優先)。

    172.16.150.128にパスを追加するだけで十分です。 172.16.150.0/24 の他のシステムは、172.16.150.128 を介してパケットを送信しようとし、172.16.150.1 を介してパケットをルーティングすることに加えて、ICMP リダイレクトも送信します。直接そこに送るシステム。 172.16.150.128システムでもLinuxを実行している場合、これは簡単です。

    ip route add 192.168.12.0/24 via 172.16.150.1
    

    すべてのシステムはまったく同じパスを直接追加できます。 DHCPを介して設定する場合は、DHCPオプション121(以前のWindowsクライアントの場合はオプション249の場合があります)を使用してDHCP設定にこの設定を追加する必要がありますが、これはこの回答の範囲外です。

  • それ以外の場合、以前の変更を完了できない場合は、NATを使用してください(例:172.16.150.128を制御できません)。

    172.16.150.0/24(特に172.16.150.128)のシステムで正しいルーティングを設定できない場合でも、NATを使用してすべての192.168.12.0/24を接続可能な172.16.150.1に縮小できます。機械に加えなさい:

    iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -o tun0 -j MASQUERADE
    

    この方法では、192.168.12.0/24から172.16.150.0/24まで、および172.16.150.128を介して応答パケットに沿ってインターネットに到達するトラフィックが許可されますが、他のすべてのサービスシステムで192.168.12.0/24へのアクセスは許可されません。例外を生成するには、特定のポート/サービスの追加のNAT設定が必要です。

おすすめ記事