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