離れた建物にある複数のLANを接続したい。
「中央」サイトには、OpenVPNを実行しているLinuxコンピューターがあります。各リモートサイトでも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でいくつかのテストを行いましたが、ルーティングの決定後にsource + destinationを変更する方法が見つからないため、うまく機能させることができません。
新しい--client-nat
OpenVPNの機能は避けたい。
多分私はip route
でルーティングを強制する必要がありますか?または、veth
を使用してネットワークスタックに2回ループする
注:マスカレードを使用したくない。 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:1:1 NAT機能が含まれているため、最新のopenVPNをコンパイルします。今週テストします。
非常に基本的な解決策は次のとおりです。
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
行が必要です(VPNを介して離れたサイトから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アドレスでサイトを接続できます。
実際のインターフェースで同様のことを行いましたが、VPNインターフェースで動作しない理由がわかりません。
そのルーターの異なるインターフェイスで同じサブネットを使用できるため、ルーティングが複雑になるという考え方です。基本的に、10.10.13.123のパケットがルーターに入ると、パケットは192.168.0.123にルーティングする前にDNATされるため、ルーティングが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つのネットワークをそのようにルーティングできるようにしています。