高度な NAT - PAT と NAT の併用

高度な NAT - PAT と NAT の併用

Ubuntu Server を NAT/PAT 対応ルーターとして構成し、次のことを実行しようとしています。

私は、ネットワークをルーターで接続された小さなネットワークに分割している学校で働いています。ある部屋の内部ネットワークで表示され、すべてのトラフィックを外部 IP アドレスに転送する IP アドレスを作成する必要があります。

説明すると、構成は次のようになります。

NAT 外部: eth1 - 192.168.1.254/24

NAT 内部: br0 - 192.168.2.10、マスカレード有効

br0 にも 192.168.2.1 のようなアドレスを作成する必要があります。このアドレスは、すべてのトラフィックを IP 192.168.1.1 に転送し、その IP がネットワークに直接接続されているかのように見せますが、マスカレードは有効にしません。

基本的な考え方は、ルーターの br0 のアドレスを 192.168.2.10 に設定し、また br0 にマスカレードしない別のアドレスを設定し、すべてのトラフィックをメイン ルーターのアドレスである 192.168.1.1 に転送することです。この理由は、br0 が物理ネットワークと、宛先 NAT IP アドレスと同じアドレス (192.168.1.1) を持つルーターの背後からアクセスされる VPN 間のブリッジであるためです。クライアントが常に「route add」コマンドを発行できるとは限らないため、これを回避する方法が必要です。

br0 のセカンダリ IP アドレスを構成する方法を見つけ、br0:1 を 192.168.2.1 として構成しましたが、そこへのすべてのトラフィックを 192.168.1.1 に転送できないようです。

ご協力をよろしくお願いいたします。

答え1

あなたがしようとしていることは、私が正しく理解していれば、実質的には NAT が関与するポリシー ルーティングの一種です。特定のルーティングされたサブネットの外部にある、そのサブネット上にあるホストのエイリアスを作成しようとしているだけのように思えます。

対応する SNAT (またはマスカレード) なしで DNAT ルールを作成できます。これが行われない理由は、ほとんどの NAT が接続の問題を回避するように設計されているため、NAT の「内部」のアドレスは「外部」からルーティングできないためです。実際にホスト 192.168.1.1 に 192.168.2.0/24 などに戻るルートがある場合は、私の記憶では、DNAT ルールを設定するだけで済みます。

iptables -t nat -A PREROUTING -s 192.168.2.0/24 -d 192.168.2.1 -j DNAT --to 192.168.1.1

さて、ちょっと立ち止まって、まだそんなことはしないでください。

これは、192.168.2.1 が宛先アドレスである場合に機能します (トラフィックに応答するアドレスが元の宛先と異なるという奇妙な癖が生じます)。説明からすると、それがあなたがやりたいことではないと思いますが、正直なところよくわかりません。192.168.2.1 ホストが宛先ではなくルーターとして機能することになっている場合、DNAT を実行してもまったく役に立ちません。ルーターとして機能することになっている場合、NAT (または PAT) はまったく役に立ちません。

私の理解が正しければ、VPNトラフィックが入ってきて、最終的にこのサブネット192.168.2.0/24にブリッジされ、このゲートウェイ192.168.1.1を経由して広い世界またはそのサブセットに送信される必要があるようです。その場合、やるべきことはルーターに192.168.2.1/24(VPNクライアントのデフォルトゲートウェイとして設定されていると思います)を割り当てるだけです。転送が有効になっていることを確認したら、準備完了です。VPN クライアントは、元のデフォルトの非 VPN ゲートウェイ (ホーム ゲートウェイなど) と同様に、次のホップが 192.168.1.1 であることを心配する必要はまったくありません。パケットが通過するときに、クライアントはそれをまったく認識しません。ISP は、偶然不足したルーティング可能なアドレスを無駄にしないように、常に RFC1918 アドレスでこの種のスキームを使用しています。パス上のすべてのルーターが一意のアドレスを持っている必要はありません (ただし、一意のアドレスを持っていると、トラブルシューティングがはるかに簡単になります)。ここでの秘訣は、TCP 接続のエンドポイントは、次のホップの IP アドレス以外は何も知る必要がないことです。

すでにこの操作を行っていて問題がある場合は、戻りパスを確認してください。192.168.1.1 のゲートウェイが、NAT の外部にトラフィックを送信するときにそれらのアドレスに対して NAT を実行していない (192.168.2.0/24 として認識されます)、それらのアドレスをファイアウォールで保護している、または 192.168.2.0/24 に戻る適切なルートを持っていない可能性があります。

もし私が両方の点であなたの意図を誤解していたら、あなたを助けるかもしれない3つ目のことがあります。iptablesでゲートウェイを指定できる唯一の方法は、TEEターゲットを使用することです。これはパケットを複製し、複製を変更せずに任意のホストにルーティングします。ただし、複製されていないパケットを何らかの方法で処理する必要があります。そのターゲットは、マングルPREROUTINGチェーンに追加できます。

iptables -t mangle -A PREROUTING -s 192.168.2.0/24 -j TEE --gateway 192.168.1.1

これは奇妙なことです。これはトラフィックをルーティングするためではなく、ログに記録するために設計されています。元のパケットを iptables の後の段階で破棄することもできますが、これは混乱を招くだけなので、お勧めしません。

ちなみに、ip addr addコマンドを使用して、インターフェイスに IP アドレスを追加できます。net-tools (ifconfig) は使用しないでください。古く、多くの機能が欠けており、長期的には頭痛の種になるだけです。

関連情報