同一のLANが複数ある1:1 NAT


13

離れた建物にある複数のLANを接続したい。
「中央」サイトには、OpenVPNを実行しているLinuxコンピューターがあります。各リモートサイトでもOpenVPNを実行しています。

  1. 中央サイトには、192.168.0.0 / 24という番号のLANがあります。
  2. いくつかのリモートサイトにも192.168.0.0/24と番号が付けられています
  3. LAN番号を変更できない/しない/変更したくない
  4. ほとんどのリモートOpenVPNを制御できません

次に、次のことを行う必要があり
ます。1.仮想LANを定義する
2.各サイトに1:1 NATを構成する
3. 1:1 NATを中央ルーターに構成する必要がある

LANマップ
そのため、各サイトには10​​.10.x.0 / 24 LANがあるように見えます。
たとえば、サイト12で192.168.0.44に到達したい場合は、パケを10.10.12.44に送信するだけです。

VPNの操作は、私にとって問題ではありません。現在60以上のサイトを接続しています。しかし、これを1対1のNATで行う簡単な方法はありません。

セントラルサイトからリモートサイトに送信されるパケットとその応答パケットの例を次に示します。

ここに画像の説明を入力してください

iptables NETMAPでいくつかのテストを行いましたが、ルーティングの決定後にsource + destinationを変更する方法が見つからないため、うまく機能させることができません。
新しい--client-natOpenVPNの機能は避けたい。
たぶん私はルーティングを強制する必要がありip routeますか?または、ネットワークスタックに2回ループしvethますか?

注:マスカレードは使いたくありません。1/1 NATのみ。

編集:
通常のopenVPNセットアップでは不可能です。リモートサイトからのパケットは別のサイトからのパケットと区別がつかないためです。どちらも送信元アドレスと宛先アドレスが類似しており、どちらも同じtun(またはタップ)インターフェイスから送信されます。したがって、それをソースNATすることはできません。

解決策1:リモートサイトでNATを実行します。私の場合は不可能です。中央サイトでのみ行う必要があります。

解決策2:リモートサイトごとに1つのVPNをセットアップします。そのため、それぞれに1つのtunを用意します。これは大丈夫だと思います。メモリ効率はそれほど高くありませんが、問題ありません。

解決策3:各サイトのVPN内に(暗号化されていない)トンネルをセットアップします。これにより、それぞれに1つのインターフェースが提供されます。単純なトンネルはクロスプラットフォームではありません(私の知る限り)。たとえば、GREやipip、sitはLinuxでは問題ありませんが、一部の遠くのサイトでは1台のWindowsコンピューターしか実行していないため、openVPNがインストールされています。単純なトンネルを設定することは不可能です。その他のオプションは、より複雑なトンネル(wich?)を使用することですが、システムおよびシステム管理者のオーバーヘッドは、複数のVPNを持つよりも大きくなる可能性があります

解決策4:最新のopenVPNをコンパイルします。1:1のNAT機能が含まれているためです。今週テストします。


1
ソリューション4の場合、コンパイルする必要はありません。ほとんどの主要なLinuxディストリビューションは、公式のopenVPN Webサイトでパッケージをコンパイルしています。ただし、-client-nat機能はプッシュ可能なオプションであるため、これは機能しません。したがって、クライアントも最新のRCバージョンを使用する必要があります(リモートサイトを制御できないと言います)。
Gregory MOUSSAT

1
まあ、私は間違っています:--client-nat機能はOpenVPN内で100%です(私はipfilterを使用していると思いました)。私はテストしたところ、Windowsでも動作します。以下の私の解決策を参照してください。
Gregory MOUSSAT

これが機能するかどうか、そして何をしたか知りたい
マイケル・グラント

回答:


2

非常に基本的な解決策は次のとおり
です。1.サーバー+クライアントにOpenVPN 2.3以上(現在、最新は2.3-alpha)を
使用します2.以下のOpenVPN構成オプションを使用します
3.他には何も使用しません(ipfilterなし、トリックなし)

サーバー側では、VPNアドレスを手動で配布する必要があります(serverオプションがないため、ifconfigまたはを使用する必要がありますifconfig-push)。

# /etc/openvpn/server.conf
ifconfig 10.99.99.1 10.99.99.2
route 10.99.99.0 255.255.255.0
push "route 10.99.99.0 255.255.255.0"
push "client-nat dnat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat dnat 10.99.99.12 255.255.255.255 10.10.112.12"
push "client-nat dnat 10.99.99.13 255.255.255.255 10.10.113.13"

routeそしてpush routeそしてclient-natあなたは(ルータ間で直接通信したい場合はラインが必要とされているping 10.99.99.1VPN throught離れた部位から)。そうでなければ、それらを破棄できます。

次に、仮想ネットワークアドレスを選択する必要があります。私はあなたの例で使用したものと同じものを保持しました:10.10.0.0/16
これのルーティングを許可します:

# /etc/openvpn/server.conf
route 10.10.0.0 255.255.0.0
push "route 10.10.0.0   255.255.0.0"

これで、クライアントに1:1 NATを使用するように指示する必要があります。

# /etc/openvpn/ccd/client_11
ifconfig-push 10.99.99.11 10.99.99.1
push "client-nat snat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat snat 192.168.0.0 255.255.255.0 10.10.11.0"
push "client-nat dnat 10.10.10.0 255.255.255.0 192.168.0.0"
iroute 10.10.11.0 255.255.255.0
iroute 10.10.111.0 255.255.255.0

最初の行は、リモートルーターのアドレスを設定します。特別なアドレスを必要とするWindowsドライバーに注意してください。
2行目と最後の行では、離れたルーターが10.99.99.xインターフェースから通信できます。
3行目と4行目は、送信元と宛先の1:1 NAT
を実行します。5行目は、対応するパケットをどうするかをOpenVPNに指示します。

この方法では、シャドウされたホストなしで、同一の(または異なる)LANアドレスでサイトを接続できます。


1
シンプルで素晴らしい。
Bertrand SCHITS

私はこれを試しましたが、動作させることができませんでした。Linuxを両側で使用しています。何かがおかしいか、完全に理解できません。client_11ファイル(最初の行)のifconfig-pushは、10.99.99.1の代わりに2番目の引数のネットマスクにすべきではありませんか?次に、なぜこの3番目のネットワーク10.10.111.0/24を使用しているのですか?サイト間の通信に111ネットワークを使用しようとしているようですが、10.10ネットワークを直接使用することはできませんか?最後に、何を試しても、クライアントのパケットに影響するsnatとdnatは(tcpdumpで)わかりません。
Michael Grant

それほど単純ではありませんが、それでも素晴らしいです。
神経伝達物質

4

私は実際のインターフェースで同様のことを行いましたが、なぜそれがVPNインターフェースで機能しないのかわかりません。

そのルーターの異なるインターフェースで同じサブネットを使用できるため、ルーティングが複雑になるという考え方です。基本的に、10.10.13.123のパケットがルーターに入ると、パケットは192.168.0.123にルーティングする前にDNATされるので、ルーティングVPN13上の 192.168.0.123 対象としたものであることをルーティングに伝える必要があります

そのためには、ファイアウォールマークと、それらのマークを使用するルーティングルールを使用します。SNATおよびDNATは、NETMAPファイアウォールターゲットを使用して実行されます。SNATの場合も同じ問題です。POSTROUTINGでは、このインターフェイスまたはそのインターフェイスからパケットが送信され、送信元アドレスが192.168.0.xであるという情報が失われています。したがって、mangle-PREROUTINGからnat-POSTROUTINGにその情報を伝達するためのマークも必要です。同じマークを使用できますが、その場合、それらのパケットはその代替ルーティングテーブルを使用することになるため、すべてにグローバルルーティングテーブルを複製する必要があります。

ネットワークごとに、次のようにします。

lnet=192.168.0.0/24
if10=eth0 if11=tun0 if12=tun1 if13=tun2

n=0
for site in 10 11 12 13; do
  table=$site
  net=10.10.$site.0/24
  n=$(($n + 1))
  eval "interface=\$if$site"
  inmark=$(($n * 2)) outmark=$(($n * 2 + 1))

  iptables -t nat -A PREROUTING -d "$net" -j NETMAP --to "$lnet"
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -m mark --mark "$inmark"/0xf -j NETMAP --to "$net"
  iptables -t mangle -A PREROUTING -i "$interface" -j MARK --set-mark "$inmark"/0xf
  iptables -t mangle -A PREROUTING -d "$net" -j MARK --set-mark "$outmark"/0xf
  ip rule add fwmark "$outmark"/0xf table "$table"
  ip route add "$lnet" dev "$interface" table "$table"
done

上記では、マークの最初の4ビットを使用して、最大7つのネットワークをそのようにルーティングできるようにしています。


1
ご回答有難うございます。テストしましたが動作しません。1つのLANだけでテストしたが、結果は得られなかった。tcpdumpを使用してパケットを監視し、リモートから中央サイトにパケットを送信すると、何も表示されません(?!どのようにして可能ですか?)。あなたの指示に従って、私は一歩一歩私の答えを構築しようとします。私が成功するかどうかわからない。
Bertrand SCHITS

2
私の答えは、中央サイトで何をするかについてのみカバーしています。他のサイトでルーティングを正しく設定していると思います。たとえば、リモートサイトのVPNトンネル経由で10.10.0.0/16へのルートを追加する必要がある場合があります。また、openvpnにこれらのパケットを通過させるように指示する必要がある場合もあります。いずれの場合も、tcpdumpを使用して、どのパケットがどこでどのように取得されるかを確認するのが正しい方法です。iptables LOGターゲットもあなたの友達です。
ステファンChazelas

2
パケットが表示されない場合は、openvpnログを調べる必要があります。おそらく、ドロップされたパケットを見つけるでしょう。この場合は、各クライアントの "iroute 192.168.0.0 255.255.255.0"をclient-config-dirに使用してください
Gregory MOUSSAT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.