iptables を使用した 1:1 NAT の作成

iptables を使用した 1:1 NAT の作成

私は Linux での NAT 変換について少し学ぼうとしていますが、できるだけ基本的なものにまで要約された概念実証を見たことがありません。

とにかく、これが私のセットアップの図です:

2つのサブネットを持つシンプルなネットワーク

私はインターネットに接続する非常に基本的なルーターを持っています。基本的にできることは 2 つだけです。

  • インターネットに接続します。
  • 1 つのサブネットのみに IP アドレスを配布します。

それできない静的ルーティングはまったく行いません。

...しかも、IPv6 アドレスがどのようなものかさえ知りません! (冗談じゃない!)

私が望んでいるのは、 からインターネットに接続できることだけでなく、 から または他のサブネット上の他のデバイスにRaspberry 3接続できることです。My ComputerRaspberry 3

Raspberry 4そこから、192.168.10.x/24 の範囲のすべての IP アドレスが 192.168.1.x/24 の範囲に変換される1:1 NAT を に実装するというアイデアが生まれました。

こうすることで、192.168.0.0/23 のアドレス プールが 192.168.0.0 から 192.168.1.255 までになるので、少なくともルーターの観点からは、ネットワーク上のすべてのホストが同じサブネットに属しているように見えます。

しかし、どうすればいいのでしょうか?

次のような 2 つのルールを Raspberry 4 の iptables に追加するだけで十分でしょうか。

iptables -t nat -A PREROUTING -d 192.168.10.0/24 -j NETMAP --to 192.168.1.0/24
iptables -t nat -A POSTROUTING -d 192.168.1.0/24 -j NETMAP --to 192.168.10.0/24

それとも、IP パッケージの方向についてもう少し明確にする必要がありますか?

アップデート:

トラブルシューティングに役立てるために、Raspberry 4 が両方のサブネットの DHCP サーバーとして機能していることをお知らせします。

どちらのネット上でも、任意のマシンからインターネットへの traceroute を実行するときに、自身を最初のホップとしてアドバタイズします。

My computerたとえば、から への traceroute は、Google に次のような表示をします。

  • 1: ラズベリー4
  • 2: プリミティブルーター
  • 3: ISPゲートウェイ
  • 4: ...
  • ...
  • n: Google.com

しかし、私の から実行すると traceroute がうまくいきませんRaspberry 3

最初のジャンプは なのでRaspberry 4、そこに驚きはありませんが、ルートは 192.168.10.0/24 サブネットに到達する方法がわからないため、ping で応答しません。

ご参考までに、私はRaspberry 4すでにサイト間 VPN クライアントとして機能しているので、他のすべてが失敗した場合は、ソース ベースのルーティングを実行し、すべてのトラフィックを VPN 接続経由で送信できますが、速度が大幅に低下します (約 70% の速度低下)。

アップデート2:

Raspberry 4からの出力:

# ip rule show

0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

# ip route show table main

default via 192.168.0.1 dev eth0 src 192.168.0.136 metric 202
192.168.0.0/23 dev eth0 proto dhcp scope link src 192.168.0.136 metric 202
192.168.100.0/24 dev tun-ipv6 proto kernel scope link src 192.168.100.10
  • ルータは 192.168.0.1 にあります。
  • サブネット 192.168.100.0/24 は VPN 内にあります。

すべてのトラフィックを VPN 経由で送信するつもりはないので、その部分は正常に機能します。

ローカル LAN で IPv6 を使用するために、以前にこの特定のトリックを一度実行したことがあるため、VPN 経由で 192.168.10.0/24 からリダイレクトするための新しいルーティング テーブルを作成するのは簡単です。:-)

しかし、Tom Yan のソリューションは、特に「AnyIP」に関するヒントが、私が目指していたものとかなり近いようです。 :-)

少しテストする必要がありますが、彼の答えを受け入れます。 :-)

答え1

まず、ソース NAT は次のようになります。

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j NETMAP --to 192.168.1.0/24

(マッチPOSTROUTING付き-s

宛先 NAT は次のようになります。

iptables -t nat -A PREROUTING -d 192.168.1.0/24 -j NETMAP --to 192.168.10.0/24

(マッチPREROUTING付き-d

注: 私の知る限り、宛先 NAT ルールは、「新しい」トラフィック (LAN 内から) にのみ必要です。戻りトラフィックには、送信元 NAT ルールで十分です。宛先 NAT は、送信元 NAT ルールによって「暗黙的に」指定されるためです。

しかし、ここで問題があります。 と は、(実際には)のトラフィックがさらにルーティングされるために に送信されることをどのようにしMy Computerて知るのでしょうか?Primitive Router192.168.1.0/24192.168.10.0/24Raspberry Pi 4

答えは、Raspberry Pi 4の ARP 要求に応答する必要があるということです192.168.1.0/24

これを実現する方法の 1 つは、「AnyIP」と呼ばれるもの (少なくとも私が聞いた用語) を設定することです。基本的には、次のタイプのサブネット ルートを追加することを意味しlocalます192.168.1.0/24

ip r add local 192.168.1.0/24 dev eth0

arp_ignore注: sysctl を eg に設定した場合にこれが機能するかどうかは正確には覚えていません1

Raspberry Pi 4sysctl を使用して IP(v4) 転送が有効になっていること、およびファイアウォールが (ルールまたはチェーン ポリシーに従って) 必要なトラフィックの転送をブロックしていないことを確認します。

答え2

私は Linux での NAT 変換について少し学ぼうとしていますが、できるだけ基本的なものにまで要約された概念実証を見たことがありません。

これは、LAN 経由で別のデバイスを接続するときにデスクトップ PC で「インターネットを共有」するために使用する、可能な限り基本的なスクリプトです。

#!/bin/bash

# masquerade $1 (e.g. eth0, ppp0) as $2 (default wlan0)

INTIF="$1"
EXTIF=${2:-wlan0}

echo $INTIF $EXTIF

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT 
iptables -P FORWARD DROP
iptables -F FORWARD 
iptables -t nat -F
iptables -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

「内部」インターフェース (NAT を必要とするクライアントのネットワーク) と「外部」インターフェース (インターネットに向かう) を使用して呼び出す必要があります。内部インターフェースや DHCP などのセットアップは含まれていません (NAT についてのみ質問していました)。

それで、Raspberry 4 に 1:1 NAT を実装するというアイデアが浮かびました。これにより、192.168.10.x/24 の範囲のすべての IP アドレスが 192.168.1.x/24 の範囲に変換されます。

それは「基本的な NAT」よりもはるかに困難です。

しかし、そうする必要はありません。実際、原始的なルーターと Raspberry Pi 4 の組み合わせではうまく機能しません。代わりに、Raspberry Pi 4 で基本的な NAT を実行してください。これにより、192.168.10.*/24 上のすべてが 192.168.0.0 に NAT され、ルーターはそれを問題なく理解します。

(そして実際には、2 つのスイッチを接続し、ルーターから 1 つのサブネットが提供されるだけです。ちなみに、原始的なルーターを OpenWRT などで再フラッシュできる場合は、ルーティングも実行できます)。

答え3

いいえ、NAT ルールを追加するだけでは不十分です。ローカル ネットワーク (ブロードキャスト セグメント) 上の IPv4 ホストの検出は ARP を使用して行われるためです。ARP のブロードキャスト トラフィックは内部 NAT ボックスを通過せず、NAT ボックスも応答しません。応答させるには、次の操作が必要ですproxy_arp

ただし、このような設定で何が達成されるかは不明です。すべてを 1 つのネットワークに配置するか、ルーターではなく PC にルートを追加し、外側のルーターに対してのみ MASQUERADE を実行します。

関連情報