web-dev-qa-db-ja.com

起点に応じて2つのゲートウェイのいずれかへのiptablesパケット転送

次のインストールがあるとします。

old router  192.168.1.1     with NAT forward of tcp port 80 to 192.168.1.10:80
new router  192.168.1.2     with NAT forward of tcp port 80 to 192.168.1.10:80
web server  192.168.1.10    with default gateway 192.168.1.1

現在、私のサービスのDNSエントリは古いルーターの外部アドレスをポイントしています。ルーターは、古いゲートウェイに応答を返すWebサーバーへのトラフィックのポート転送を行います。

(別の外部IPを持つ)新しいルーターにシームレスに移行するには、まず新しいルーターをセットアップし、両方の接続をアクティブにして全体をテストしてから、DNS IPを新しい外部アドレスに変更します。

さて、上記の設定で、古いルーターはまだ機能します。ただし、新しいルーターにアドレス指定されているTCP接続は、それらを処理できない古いルーターにも応答します。

マスカレードでnatを使用することを考えましたが、新しいルーターに宛てられたすべてのトラフィックはローカルトラフィックのように見えます。これにより、サーバーのIPベースのフィルターとロギングがだまされます。

現在、私の計画は一時的な解決策としてDebianとiptablesでヘルパーPCを使用することです:

old router  192.168.1.1     with NAT forward of tcp port 80 to 192.168.1.10:80
new router  192.168.1.2     with NAT forward of tcp port 80 to 192.168.1.20:80
web server  192.168.1.10    with default gateway 192.168.1.20
helper pc   192.168.1.20

ヘルパーPCが正しいゲートウェイを見つける責任を負います。

  • 192.168.1.2によって転送された接続の状態を保持し、192.168.1.10に変更せずに転送します(Origin MACアドレスとSYNでそれらを識別することを考えます)
  • 追跡された接続のパケットを192.168.1.2に転送する
  • 追跡されていない接続のパケットを192.168.1.1に転送する

私はインターネット、特にserverfault.com( 特にこれ )で多くの入力を見つけましたが、それらすべてがこの問題の一部のみをカバーしています。 Macアドレスベースのフィルタールールの組み合わせが必要だと思います-m mac --mac-source <mac>、NAT、状態、およびrt_tables --set-mark/ip rule add fwmark(--gwはDebianでサポートされていないようです)。

4
Daniel Alder

シナリオに応じて、2つの効果的なソリューションがあります。

解決策1:ウェブサーバーはLinuxで完全に管理されています。

まず、/etc/iproute2/rt_tablesには次の行が含まれます。

201     gw1
202     gw2

次に、テーブルにデータを入力します

ip route add table gw1 default via $GW1_IP dev $ETH metric 100
ip route add table gw2 default via $GW2_IP dev $ETH metric 100

3番目に、2つのiproute2ルールを作成して、これらのカスタムテーブルに処理を「分断」します。

ip rule add prio 100 from all fwmark 1 lookup gw1
ip rule add prio 110 from all fwmark 2 lookup gw2

最後に、対応するパケットを適切にマークする一連のiptablesコマンドを作成します。

# Make sure mark exists before routing happens
#   The first handles incoming packets
-t mangle -A PREROUTING -j CONNMARK --restore-mark
#   The second handles outgoing packets
-t mangle -A OUTPUT     -j CONNMARK --restore-mark

# Mark packets and save the mark    
-t mangle -A INPUT -m mac --mac-source $GW1_MAC -j MARK --set-mark 1
-t mangle -A INPUT -m mac --mac-source $GW2_MAC -j MARK --set-mark 2
-t mangle -A INPUT -j CONNMARK --save-mark

解決策2:ウェブサーバーがLinuxであるnotであるか、またはnotである完全にあなたの管理下

このソリューションは、前のソリューションとveryに似ています。違いは、iptablesルールのセットにあります。

# Make sure mark exists before routing happens
-t mangle -A PREROUTING -j CONNMARK --restore-mark

# Mark packets and save the mark    
-t mangle -A FORWARD -m mac --mac-source $GW1_MAC -j MARK --set-mark 1
-t mangle -A FORWARD -m mac --mac-source $GW2_MAC -j MARK --set-mark 2

-t mangle -A POSTROUTING -j CONNMARK --save-mark

編集:修正されたソリューション2

上記と同じですが、以下を追加します。

ip rule add prio 10 to 192.168.1.0/24 lookup main

これにより、ローカルネットワーク宛てのパケットが保証されます(192.168.1.0/24)はゲートウェイによって処理されません。

また、別のiptablesルールを追加します。

-t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10

最後に、bothゲートウェイにポート80を「ヘルパーPC」に転送させます。これにより、「ハーフオープン」接続のトラブルシューティングを試みる頭痛が大幅に軽減されます(現在の計画では、「ヘルパーPC」は双方向のトラフィックではなく、Webサーバーからのトラフィックしか表示できないためです)。

3
pepoluan

ローカルテストのみの場合は、iptablesの-sオプションを使用して、トラフィックがそのソースIPから発信されている場合は新しいルーターに転送するように古いルーターに指示できます。次に、新しいルーターがリクエストをWebサーバーに転送します(指定した構成に基づく)。

セットアップの外部からテストしている場合でも、送信元アドレスipを-sでフィルタリングできます。

例:

iptables -I PREROUTING -i eth0 -s x.x.x.x -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.2:80
0
typositoire