iptables を使用した双方向 NAT

iptables を使用した双方向 NAT

つまり、手元にあるクラスタ システムでは、トラフィックをマスター経由でルーティングする必要があります。ノードから外部へのトラフィックのルーティングは機能しますが、部門のサブネットからノードへのトラフィックのルーティングは失敗します。残念ながら、ノードをサブネットに追加することは不可能です。

セットアップ

シンプルさのためにダムスイッチを使わないクラスタ設定

クラスターは、マスターと多数のノード、およびいくつかの周辺機器で構成されています。ノードは内部ネットワーク上にあり、イントラネットやインターネットからは隠されています。マスターにはすでに NAT が配置されているため、ノードは内部サーバーと外部サーバーにアクセスできます。この部分は機能します。

マスターの外部インターフェースは、制御外のゲートウェイを共有するワークステーション PC と同じサブネット上に存在します。

編集: クラスターは CentOS 7 を実行し、PC は Ubuntu xenial ベースのディストリビューションを実行します。

タスク

一部のソフトウェア パッケージは、ノードに直接アクセスする必要があります。このため、iptables を使用してマスターに 2 番目の NAT を設定し、PC に IP ルートを追加して、マスター経由で 10.10.1.0/24 にトラフィックを送信する必要がありました。

構成

マスター: IP ルート

default via 123.45.67.254 dev eth0 proto static metric 100
10.10.0.0/16 dev eth1 proto kernel scope link src 10.10.0.1
123.45.67.0/23 dev eth0 proto kernel scope link src 123.45.67.204 metric 100

マスター: iptables -vnL -t nat

Chain PREROUTING (policy ACCEPT 7356 packets, 880K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 4884 packets, 687K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 3445 packets, 225K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 3445 packets, 225K bytes)
 pkts bytes target     prot opt in     out     source               destination
  439 33324 MASQUERADE  all  --  *     eth0    10.10.1.0/24         0.0.0.0/0
61828 3710K MASQUERADE  all  --  *     eth1    123.45.67.0/23       10.10.1.0/24

MASQUERADE の代わりに SNAT を使用しても違いはありません。

ノード: IP ルート

default via 10.10.0.1 dev eth1
10.10.0.0/16 dev eth1 proto kernel scope link src 10.10.1.1

pc: IPルート

default via 123.45.67.254 dev eth0  proto static  metric 100
10.10.0.0/16 via 123.45.67.204 dev eth0
123.45.67.0/23 dev eth0  proto kernel  scope link  src 123.45.67.191  metric 100

これまでの診断

  • node01 からインターネット/イントラネット/PC への NAT は問題なく動作します。
  • TCP ハンドシェイク中に pc1 から node01 への NAT が失敗します。
    • SYNはマスターを介してnode01に渡され、tcpdumpではSYN_RECVとしてマークされます。
    • SYN+ACKはnode01からマスターに送信される
    • SYN+ACKがマスターのtcpdumpに表示され、フィルターに渡される
    • tcpdumpはSYN+ACKがフィルターを通過していることを示す
    • iptablesは、SYN+ACKパッケージがフィルターFORWARDを通過し、FORWARD + POSTROUTINGをmangleしていることを示しています。
    • SYN+ACK パッケージは nat POSTROUTING を通過することはありません (通過すべきでしょうか?)
    • SYN+ACKパッケージはpc1に到着しない
  • もちろん、握手は失敗します
    • pc1はSYN_SENTでスタックしています
    • node01はSYN_RECVでスタックしています
    • 最終的に接続がタイムアウトする
  • ゲートウェイでパッケージを監視する方法がありません

私の推測では、途中のステートフル ルータが、マスター上で送信元アドレスが書き換えられるため SYN+ACK パッケージをドロップし、元の SYN パッケージとの関係が失われると考えられます。

どうすればこれを機能させることができるでしょうか?

追加の設定/ログが必要な場合はお知らせください。

関連情報