次のインストールがあるとします。
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が正しいゲートウェイを見つける責任を負います。
私はインターネット、特にserverfault.com( 特にこれ )で多くの入力を見つけましたが、それらすべてがこの問題の一部のみをカバーしています。 Macアドレスベースのフィルタールールの組み合わせが必要だと思います-m mac --mac-source <mac>
、NAT、状態、およびrt_tables --set-mark
/ip rule add fwmark
(--gwはDebianでサポートされていないようです)。
シナリオに応じて、2つの効果的なソリューションがあります。
まず、/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
このソリューションは、前のソリューションと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
上記と同じですが、以下を追加します。
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サーバーからのトラフィックしか表示できないためです)。
ローカルテストのみの場合は、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