CGNATを使用したサイト間VPN
間違った場所に投稿してすみません。これを別のSEサイトに移動する必要があるかどうかを教えてください。話を続けて...
私の自宅のISPは時々(一貫してではありませんが)CGNATを強制しますが、信頼できる方法でローカルデバイスにリモートアクセスする必要があります(そもそもインターネット接続がある限り、この要件を回避する方法はありません:)) 。ISPを切り替える前に(古いISPは常に同じパブリックIPv4アドレスを教えてくれました)、OpenVPNを使用してそれで済ませることができました。
CGNATが現実的な可能性である今、OpenVPNはもはや私のLANリソースにリモートで接続するための信頼できる方法ではありません。だから私は別の信頼できる十分な解決策を探しています(それは私にちょっと必要ないくつかのことを可能にします-リモートでセキュリティカメラにアクセスします-そして便利です-私の職場へのリバースSSHサーバー)。
セットアップについて:
- 家にはラズベリーパイがあります。それが重要な場合はモデル3B +(私は驚きますが、完全を期すために提供します)。それはISP(PPPoE)に接続する私自身のルーターの後ろにあります。LANリソースへのフルアクセスがあります。私はプライベートの固定IPv4(CGNATの問題があるので、「固定」要件を削除することを検討しています。とにかく修正するのは以前ほど役に立たないでしょう)と自動(SLAAC、プライバシー拡張なし)のパブリックルーティングIPv6アドレスを持っています。再接続から再接続まで同じ/ 64を取得するという保証はありません(したがって、IPアドレスは時間とともに変化します)。
- オフサイトには、AWS EC2ホストがあります(最小のホストは「無料」ですが、本当に無料ではないと思います)。ホストにエラスティックIPv4とIPv6を構成し、適切なゲートウェイ構成を使用しています(多くの時間を浪費しましたが、最終的にはそれを実行できました)。したがって、技術的には、ここからIPv6経由でPiに接続するか(PiがIPv6に使用できる適切なダイナミックDNSサービスがあると仮定)、PiからIPv4とIPv6の両方でAWSホストに接続できます。
- 職場では、高度に保護されたネットワークがあり、リバースSSHのみを実行したいと考えています。おそらく、AWSインスタンスをジャンプホストとして使用して、非常に迅速に解決できます。つまり、とにかくポート443のAWSインスタンスでSSHサーバーを実行できます。したがって、実際の問題ではありません(ポート22は作業ファイアウォールによってブロックされています:()
私が助けを必要としているのは2つあります。
- まず、AWSホストがすべてのLANリソースに直接アクセスできるようにRaspberry PiからAWSホストへの直接接続を設定する方法(最終的にはRaspberry Piのファイアウォールルールによってカスタマイズ可能)
- 次に、Piが再起動されるたびにこのサポートが自動的に開始されるようにする方法(私は十分な頻度で再起動する傾向があり、停電によって意図しない再起動も発生します)。
私には回避策がありますが、それは本当にひどいことに注意してください。これには、パブリックアドレスを取得するまでCGNAT IPアドレスを取得するたびに、TP-Linkクラウドサービスを介してルーターを数回再起動することが含まれます。次に、私のISPは、適切なダイナミックDNSサービスを提供するのに十分役立つので、パブリックアドレス(または、CGNATを取得した場合はプライベートアドレス。ただし、それほど役に立ちません)に解決できます。本当にそのような回避策を忘れられるようにしたいと思います。
回答
私は実際にそれを最終的に自分で理解しました。私は通常のチュートリアルに従いました:
- まず、サーバー(EC2インスタンス)とクライアント(CGNATの背後にあるRaspberry Pi)の両方にOpenVPNをインストールし、サーバーのみにEasy-RSAをインストールします。
- 次に、Easy-RSA(OpenVPNコミュニティページのチュートリアルから直接取得した情報)を使用していくつかのものを生成します。
- まず、ファイル「vars」で変数を構成します。デフォルトは適切に機能しますが、とにかく変更することをお勧めします。
- openssl-1.0.0.cnfをopenssl.cnfにコピーします(他のバージョンも機能する可能性があります)。
- ./clean-allを実行します(これにより、既存のキーと追加の構成が消去され、白紙の状態から開始されます)。
- ./build-caを実行します(これによりkeys /ca.crtとkeys / ca.keyが生成されます。後者は保護する必要があります。構成を更新してさらに追加する必要がないことを確認したら、細断処理できます。クライアント。前者は残しておく必要のある証明書です)
- ./build-key-serverを実行して、サーバーキーペアを生成します。サーバーだけがこれを必要とします。
- ./build-keyを実行して、クライアントのキーを生成します。クライアントごとに1回実行します。クライアント「raspberrypi」のために、合計で1回だけ実行しました。生成されたファイルは、クライアント側でコピーする必要があります。
- ファイルをそれらが属する場所にコピーします。
- keys / ca.crtは、サーバーとクライアントの両方で必要です。
- キー/ca.keyは、クライアントを追加する場合に必要であり、保護する主なものです。追加の柔軟性が必要ない場合は、「shred」コマンドを実行するか、既知の安全なシステムに移動することをお勧めします(その価値のためにエアギャップが設定されている可能性があります)
- keys / raspberrypi。{crt、key}はクライアントに属し(私の場合、クライアントはraspberrypiであり、クライアントに固有の名前を入力します)、それに応じてクライアントにコピーする必要があります。
- keys / server。{crt、key}はサーバーに残ります。.crtファイルは、接続を試行すると自動的に送信されるため、クライアントに手動でコピーする必要はありません。
- Easy-RSA部分が完了しました。
- サーバー側でOpenVPNをセットアップする
- デフォルトのサーバー構成で問題ありません。いくつかの変更を除いてください。
- ca、cert、およびkeyオプションは、それぞれca.crt、server.crt、およびserver.keyファイルを指すように更新する必要があります。server.keyファイルは保護する必要があります(0400アクセス許可)。ただし、これが実際にチェックされているかどうかはわかりません。
- 「トポロジサブネット」を設定しました。これは厳密には必要ではありませんが、良いことです。
- 別のOpenVPNサーバー(ルーターからのサーバー)と競合しないように、「server」ディレクティブを別のプライベートIPv4範囲に変更しました。結局のところ、範囲が重複しないように、後で静的ルーティングを実行します。
- client-config-dir client( "client"サブフォルダーを特別なものに設定し、クライアント固有の構成を含めます。これはルーティングにとって重要です)
- ルーティングが正しく機能するように、クライアントからクライアントへと続けます。
- どちらの場合も、「tls-authta.key0」オプションをコメントアウトしました。これは警告を生成しますが、追加のセキュリティは必要ありません。それがどのように機能するかを理解したら、将来コメントを外すかもしれません。ただし、セキュリティのために、このオプションを使用することを強くお勧めします。
push "route 172.31.0.0 255.255.240.0"
AWSのプライベートネットワークへのルートをRaspberryPiに向けてプッシュするステートメントを追加しました。
- さらに、クライアントには、(
iroute 192.168.1.0 255.255.255.0
AWSインスタンスからPiおよびホームネットワークに向けてルーティングが機能するように)を含むファイルclient / raspberrypi(これもクライアント名に基づく)が必要です。
- デフォルトのサーバー構成で問題ありません。いくつかの変更を除いてください。
- クライアントも設定する必要があります
- リモートアドレスを設定します。AWSインスタンスに持っているエラスティックIPアドレスを配置するだけです。これは、それをいじるまで変更されないためです。
- ca、cert、key(caからca.crt、certからraspberrypi.crt、keyからraspberrypi.key)ディレクティブを設定します。
- サーバーの場合と同様に、tls-authディレクティブをコメントアウトします。これはサーバーと一致する必要があります。
- SystemDサービスを有効にします(これにより、起動時にトンネルが有効になります)。サーバーでは
systemctl enable openvpn@server; systemctl start openvpn@server
、構成ファイルが/etc/openvpn/server.confであると想定しています。これをサブフォルダーに使用することはできません。クライアントでは、入力したファイル名のclient.confである点を除いて、同じですopenvpn@client
。
今、私に残されているのは、いくつかのポートフォワードを実行することですが、この質問の対象ではありません。