OpenVPN over TLS
VPNはトランスポートプロトコルとしてTCPを使用しています。stunnelインスタンスは、TLS / TCPでTCPストリームのコンテンツをカプセル化するために使用されます。このプロトコルスタックを取得します。
[IP] <------------------------> [IP]
[OpenVPN] <------------------------> [OpenVPN]
[TLS] <~~~~~> [TLS]
[TCP] <-> [TCP] <-----> [TCP] <-> [TCP]
[IP] <-> [IP] <-----> [IP] <-> [IP]
[] [] [] []
サーバーstunnel stunnelクライアント
stunnelインスタンス間では、このプロトコルスタックがネットワーク上にあります。
[IP]
[OpenVPN]
[TLS]
[TCP(443)]
[IP]
[...]
TLSはそのペイロードを暗号化するため、攻撃者は次のものしか見ることができません。
[??? ]
[TLS]
[TCP(443)]
[IP]
[...]
はい、それはプレーンなTLSトラフィックです(HTTP / TLS、SMTP / TLS、POP / TLS、またはトラフィックを見る人にとっては他のものでも構いませんが、TCPポート443が使用されるためHTTP / TLSによく似ています)。Wiresharkを使用してこれを確認できます。stunnelインスタンス間のトラフィックを記録します。Wireshark UI(ストリームのパケットの右ボタン)で、wiresharkにトラフィックをTLSとして解釈するように要求できます。TLSトラフィックとして認識します(異なるTLSメッセージが表示されますが、TLSセッションのペイロードは表示されません) 。
クライアントでSNIを使用して、最新のブラウザーが行うように見えるようにすることができます。ALPNを使用することもできますが、stunnelは現在それを処理していません。
TLSが組み込まれたOpenVPN
これに対して、OpenVPNを使用している場合は、次のようなものがあります。
[IP]
[OpenVPN]
[TCP]
[IP]
[...]
これは次のようになります。
[??? ]
[OpenVPN]
[TCP]
[IP]
[...]
組み込みのTLSレイヤーは(IP、イーサネット)パケットをカプセル化しませんが、セッションのセットアップと認証にのみ使用されます:
[TLS]
[OpenVPN]
[TCP]
[IP]
[...]
この場合、トラフィックは単純なTLSトラフィックのようには見えませんが、明らかにOpenVPNです。WiresharkでこのトラフィックをOpenVPNとして解釈すると、OpenVPNメッセージとその中のTLSメッセージ(ペイロードではない)を認識します。
警告
受動的な攻撃者がリモートサーバーが実際にOpenVPNサーバーであることを認識できない場合、アクティブな攻撃者はこれを見つけることができることに注意する必要があります:TLS経由でサーバーに接続するだけで、彼はHTTP / TLSサーバーではないことを確認します。OpenVPNプロトコルを話そうとすることで、彼はあなたのサーバーがOpenVPN / TLSサーバーであることを検出できます。
クライアント認証を使用したOpenVPN over TLS
これについて心配しているので、TLSクライアント認証を有効にできます。攻撃者は、有効なTLSセッションを開始できず、TLSを介してカプセル化されているペイロードを推測できません。
*警告:** OpenVPNの組み込みTLSサポートについては説明していません(なぜ役に立たないかについては上記を参照してください)。
多重化OpenVPN / TLSおよびHTTP / TLS
別のソリューションは、TLSセッションを介してHTTPとOpenVPNの両方を提供することです。 sslhを使用して、プロトコルのペイロードを自動的に検出し、プレーンHTTP / TCPサーバーまたはOpenVPN / TCPサーバーにディスパッチできます。サーバーは標準のHTTP / TLSサーバーのように見えますが、このサーバーでOpenVPN / TLSを話そうとしている人は、それが実際にOpenVPN / TLSサーバーでもあることを検出できます。
OpenVPN / TCP
またはHTTP / TCP
[1] .---------。.------。HTTP / TCP .-------------。
-> | トンネル| ----> | sslh | -------> | HTTPサーバー|
'---------' '------' | '-------------'
| .----------------。
'------> | OpenVPNサーバー|
OpenVPN / TCP '----------------'
[1] = OpenVPN / TLS / TCPまたはHTTP / TLS / TCPのいずれか
OpenVPN over HTTP CONNECT over TLS
別の解決策は、標準のHTTP / TLSサーバーを使用し、HTTP CONNECT / TLSを使用してOpenVPNサーバーに接続することです。これは標準のHTTPサーバーのように見えます。HTTP CONNECTリクエストを許可するために、クライアントの認証を要求することもできます(squidはこれを行うことができるはずです)。
OpenVPNには、HTTPプロキシを使用するオプションがあります。
http-proxy proxy.example.com
これを、リモートHTTPSプロキシに接続するstunnelインスタンスと組み合わせることができるはずです。
http-proxy 127.0.0.1 8443
remote vpn.example.com
このプロトコルスタックを実装するもの:
[IP] <------------------------> [IP]
[OpenVPN] <------------------------> [OpenVPN]
[HTTP] <-------------> [HTTP]
[TLS] <~~~~~> [TLS]
[TCP] <-> [TCP] <-----> [TCP] <-> [TCP]
[IP] <-> [IP] <-----> [IP] <-> [IP]
[] [] [] []
サーバーHTTPS PROXY stunnelクライアント