リモートビルの複数のLANを接続したいです。
「中央」サイトには、OpenVPNを実行しているLinuxコンピュータがあります。各リモートサイトもOpenVPNを実行します。
- 中央サイトには192.168.0.0/24というLAN番号があります。
- 複数のリモートサイトの番号も192.168.0.0/24と指定されています。
- LAN番号を変更できません/しない/したくない/しかし、LAN番号は変更されます。
- ほとんどのリモートOpenVPNを制御できません。
その後、次のことを行う必要があります。
1.仮想LANを定義します
。 2. 各サイトに対して 1:1 NAT を設定します。
3. 中央ルータで 1:1 NAT を設定する必要があります。
。
したがって、各サイトには10.10.x.0/24 LANが表示されます。
たとえば、コンピュータがサイト12の192.168.0.44にアクセスしようとすると、単に10.10.12.44にパケットを送信します。
VPNを運営することは私にとって問題ではありません。現在60以上のサイトに接続しています。しかし、1:1 NATを実行する簡単な方法が見つかりませんでした。
以下は、中央サイトからリモートサイトに送信されるパケットとその応答パケットの例です。
iptables NETMAPでいくつかのテストを行いましたが、ルーティングの決定後にソース+ターゲットを変更する方法が見つからないため、動作しません。
新しいOpenVPN機能を使用しないことをお勧めします--client-nat
。
強制的にルーティングする必要がありますかip route
?それとも、ループを使用してネットワークスタックに2回入りますかveth
?
注:私は変装を使用したくありません。 1/1 NATのみ可能です。
編集:
一般的なopenVPN設定はできません。リモートサイトのパケットは他のサイトのパケットと区別できないため、両方とも同じソースアドレスと宛先アドレスを持ち、両方とも同じトン(またはタブ)インターフェイスから来ます。したがって、ソースNATingは不可能です。
解決策1:リモートサイトのNAT。私の場合は不可能です。中央サイトでのみこれを行う必要があります。
解決策2:各リモートサイトにVPNを設定します。だから私はみんなに多くを与えるでしょう。大丈夫だと思います。メモリ効率的ではありませんが、大丈夫です。
解決策3:VPN内の各サイトに(暗号化されていない)トンネルを設定します。これはそれぞれにインターフェイスを提供します。 Simple Tunnelは(私が知る限り)クロスプラットフォームではありません。たとえば、GRE、ipip、またはsitはLinuxでは問題ありませんが、一部のリモートサイトはWindowsシステムのみを実行するため、openVPNがインストールされます。したがって、単純なトンネルを構築することは不可能です。他のオプションは、より複雑なトンネルを使用することです(どのようなものですか?)。ただし、システムおよびシステム管理者にかかるオーバーヘッドは、複数のVPNを使用するよりも大きくなる可能性があります。
解決策4:1:1 NAT機能を含む最新のopenVPNをコンパイルします。今週テストしてみましょう。
答え1
非常に基本的な解決策は次のとおりです。
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"
VPNを介してリモートサイトからルータ間で直接通信するには、回線が必要route
ですpush route
。それ以外の場合は削除できます。 client-nat
ping 10.99.99.1
。
。
これで仮想ネットワークアドレスを選択する必要があります。お客様の例で使用したのと同じ 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アドレスを使用してサイトを接続できます。
答え2
私は実際のインターフェイスでも同様のことをしましたが、なぜVPNインターフェイスでは機能しないのかわかりません。
そのルータの異なるインターフェイスで同じサブネットを使用すると、ルーティングが複雑になるという考えです。デフォルトでは、10.10.13.123のパケットがルーターに入ると、192.168.0.123にルーティングされる前にDNATedが受信されるため、192.168.0.123へのパスを知ることができるはずです。VPN13インターフェース。
これは、ファイアウォールタグとこれらのタグを使用するルーティングルールを使用して実行できます。 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つのネットワークをこの方法でルーティングできます。