一行だけ異なる二つのプロファイルは、同じホストで二台目のクライアントが起動した瞬間に別の振る舞いをします。一方は nobind、カーネルが割り当てる任意のローカルポートを使いますが、もう一方は1194を予約するため、二つ目のインスタンスは既に使用中のアドレスで停止します。その行が送信元ポートを誰が選ぶかを決め、それがひいては、そのプロファイルがマシン上の他の何かと共存できるかどうかを決めます。三つの質問で決まり、最初の質問は残り二つに進む前にほとんどのプロファイルに答えます。

nobindが実際に省略するもの

既定では、クライアントは接続前にローカルソケットをバインドし、プロファイルが別段の指定をしない限りローカルポートは1194です。 nobind その予約を外すので、接続時にスタックが未使用のポートを割り当てます。これは既定ではなくオプトアウトであり、その行がないクライアントは1194を保持するため、固定していない二つ目のインスタンスが衝突するのはまさにそのためです。配布されているクライアントプロファイルの多くがその理由でこのディレクティブを含んでおり、サンプルファイルが何かをしていることは、仕組みが既定でそうしていることと同じではありません。

変わらないのは遠い側です。サーバーは依然としてプロファイルが示す場所で待ち受け、構成の宛先ポートは依然として宛先ポートです。動的な送信元ポートが変えるのは自分のソケットの戻りアドレスだけで、サーバー側のソケットには何も変えません。

何も隠しません。公開アドレスは経路が変換した結果であり、パケットは依然としてローカルネットワークを通過し、そのネットワークを運用する誰もが依然としてフローを見ます。 nobind はプライバシー機能でもファイアウォールの回避でもありません。

決める三つの条件

一つの質問が残り二つを決めるので、何かを編集する前にそれに答えてください。相手が外部へ接続するなら、残りの質問は既に下された判断を細めるだけです。相手が内向きの接続を受け入れるなら、ローカルポートをどう調整しても到達可能にはなりません。

この相手は接続を開始しますか。 外部へ接続するなら、応答が同じフローで戻ってくるため、動的な送信元ポートは無害で通常は望ましいです。内向きの接続を待つなら、前方の何かがポートを公開しない限り、動的なポートは到達不能にします。その一つの答えが、すべてのクライアントプロファイルをすべてのサーバープロファイルから分けます。

経路は送信元ポートでフィルタリングしますか。 一つの既知のポート向けに書かれた厳格なルールは明示的なローカルポートを強制し、プロファイルはどのルールを満たすかを記録すべきです。ほとんどのネットワークは宛先だけでフィルタリングするので、この条件は最初のものよりまれです。該当する場合、動的なポートへの優先を上書きします。

複数のインスタンスがホストを共有しますか。 単一の固定ポートでは二つを同時に扱えず、再起動したインスタンスは1194がまだ閉じている状態に見つけることがあります。動的なポートは他を変えずにその衝突を取り除きます。これに自信を持って答えられないなら、はいとみなしてカーネルに選ばせてください。

固定ポートが正解となる場合

ネットワークによっては宛先だけでなく送信元ポートでもフィルタリングするため、運用者が既知の一つのポートからの通信だけを通すルールを書いているかもしれません。その場合ローカルポートを固定するのが正しく、プロファイルは満たすルールを名指すコメントを持つべきです。サーバーポートとの対称性のための固定は、二つの数に互いに何の関係もないため理由になりません。テンプレートにあったからという理由だけで固定しているなら、削除してください。

そうでなければ固定ポートは厄介を買います: 一台のマシン上の二つのクライアントは同時に1194を保持できず、二つ目はプロファイルではなくポートを指すエラーで失敗します。すぐ再起動するコンテナも同じ壁に当たります。修理は、配布プロファイルが既に含んでいたディレクティブです。

サーバーとクライアントは対称ではない

OpenVPN 2.6のマニュアル は nobind を lportの隣に置いており、これは一方のオプションはカーネルが選び、もう一方はあなたが選ぶという一行の論拠です。動的なローカルポートは、応答する側がポートを事前に知り得ないため、発信する相手にしか機能しません。だからクライアントプロファイルをサーバーにコピーすると、誰も到達できないリスナーが生まれます。

複数のネットワークインターフェースを持つホストでは、アドレスはポートとは別の判断です。特定のローカルアドレスをバインドすることと特定のポートをバインドすることは二つの異なる設定であり、二つの上流リンクを持つサーバーは通常どちらも固定します。両方を固定するクライアントは、何の利点もなく同じ硬直性を引き受けています。

まとめはセキュリティではなく役割についてのもので、発信する側は自分の送信元について柔軟でいられますが、応答する側はそうできません。どちらの選択も、相手があなたの身元について学ぶことを変えません。だからこそこのディレクティブはクライアントの例に現れ、サーバーの例にはほとんど現れないのです。

カーネルが選んだポートを確認する

接続後は、構成が意図を述べ、ソケットが実際に起きたことを述べるため、構成ではなくソケットを読んでください。記録する価値のある事実は、ローカルポート、遠隔の端点、そして何かがまだ待ち受けているかどうかです。Linuxホストでは三つともコマンド一つ分の距離にあります。

ss -unp | grep openvpn
ss -lunp | grep openvpn
sudo lsof -nP -i | grep openvpn

クライアントが nobind を使うと、高いローカルポートと構成された遠隔ポートが表示され、これが想定される形です。サーバーは構成されたポートで待ち受けるソケットを表示し、そのソケットがなければプロファイルは待ち受けていないか、バインドに失敗しています。フローはあるのにパケットが戻らない場合は、プロファイルを編集する前に、選ばれた送信元ポートを経路上の任意のポートフィルターと比較してください。一つ変更し、再接続し、ソケットをもう一度読んでください。

関連記事