
私のホームネットワークでは、次のようなトポロジになっています
Internet
|
wifi |
C ----------- A ---------- B
どこ
- A (静的 IP 192.168.0.254) は、ISP から提供されたルーター/AP です。
- B (静的 IP 192.168.0.1) は、ローカル DNS および DHCP サーバーとして動作する Linux マシンです (dnsmasq を実行)
- C は、AP に接続し、DHCP によって設定される任意のクライアントです。
現時点では、B (DHCP サーバーとして) によって提供されるデフォルト ゲートウェイは A のみです。
次に、クライアント C からのすべてのトラフィックを B でキャプチャするとします。B で実行した操作は次のとおりです。
IP転送を有効にする
# sysctl net.ipv4.ip_forward=1"
Bをゲートウェイとして供給する。もちろん、B自身もAを自身のゲートウェイとして使用する。
- 何が起こっているか確認するためにBでtcpdumpを実行します
クライアントCでは、例えばリクエストを開始します。
$ traceroute www.google.com
ここで、C から発信されたトラフィックは B にルーティングされ、次に A にルーティングされ、最終的にインターネットにルーティングされるものと予想されます。
何が機能するか。Cはインターネットにアクセスできる
何が機能しないのか。最初のリクエストを除いて、B は完全にバイパスされているようです。tcpdump には何も表示されず、traceroute の出力には B のアドレスが表示されません。それでも、B で IP 転送を無効にすると C がインターネットから切り離されるため、再ルーティングが行われることは間違いありません。
何らかの短絡が発生した場合、どうすればそれを回避できますか?
免責事項: ネットワーク トポロジを変更すると (ポート ミラーリングなどによって)「すべてのトラフィックをキャプチャする」問題が解決できることはわかっていますが、自分の設定で何が起こっているのか、トポロジを変更せずにそれを修正する方法を本当に理解したいと思っています。
答え1
ホスト B で NAT 変換を実行して、A が同じパケットを再度受信しないようにする必要があります。代わりに、B はパケットを B から送信されたかのように A 経由で送信する必要があります。これを実現するには、iptables
次のルールを追加します。
# iptables -t nat -A POSTROUTING -s ip-of-C -j MASQUERADE
このルールにより、B から送信されるすべてのパケットは、B から送信されたかのように書き換えられますが、逆変換テーブルが保持されるため、関連する応答を逆変換して C に送信できます。
-s ...
ルールを C から送信されたパケット (またはローカル LAN として設定することもできます) にのみ適用し、応答パケットには適用しないように制限する部分に注意してください。
編集 (@theuncle のコメントを考慮): NAT なしでは動作しない理由の説明は、ホスト B はパケットが同じインターフェイスで変更されずに出入りすることを認識しているため、関連するトラフィックについて C に A と直接通信するように指示することでネットワークを改善できるということです。