OpenVPNクライアントツークライアント


16

client-to-client無効にしたTUN(レイヤー3)OpenVPNサーバーを使用している場合、クライアントは引き続き相互に通信できます。

ドキュメントによると、クライアントからクライアントへの構成はこれを防ぐ必要があります。

接続しているクライアントがVPNを介して互いに到達できるようにする場合は、クライアント間ディレクティブのコメントを外します。デフォルトでは、クライアントはサーバーにのみアクセスできます。

このオプションが無効になっているときに、クライアントが相互に通信し続けることができるのはなぜですか?

これが私のサーバー設定です:

port 443
proto tcp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh4096.pem
topology subnet
server 10.10.201.0 255.255.255.128
ifconfig-pool-persist ipp.txt
crl-verify /etc/openvpn/keys/crl.pem
push "route [omitted]"
push "dhcp-option DNS [omitted]"
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login
cipher AES-256-CBC
tls-auth /etc/openvpn/keys/pfs.key 0
verb 4

回答:


54

場合client-to-clientされる有効(すなわち、カーネルへの)ホストのIP層に送信せずに、内部で、VPNサーバーに転送クライアントからクライアントへのパケットを。ホストネットワークスタックは、これらのパケットをまったく認識しません。

           .-------------------.
           | IP Layer          |
           '-------------------'


           .-------------------.
           | TUN device (tun0) |
           '-------------------'


           .-------------------.
           | OpenVPN server    |
           '-------------------'
             ^           |
          1  |           |  2   
             |           v
 .----------------.  .----------------.
 | Client a       |  | Client b       |
 '----------------'  '----------------'

client-to-client無効になっている場合、クライアントから別のクライアントへのパケットは、VPNサーバーをホストしているマシンのホストIPレイヤー(iptables、ルーティングテーブルなど)を通過します:IP転送が有効になっている場合、ホストはパケットを転送します(そのルーティングテーブル)を再びTUNインターフェイスに送信すると、VPNデーモンはパケットをトンネル内の正しいクライアントに転送します。

           .-------------------.
           | IP Layer          |  (4) routing, firewall, NAT, etc.
           '-------------------'      (iptables, nftables, conntrack, tc, etc.)
              ^          |
          3   |          |  5
              |          v
           .-------------------.
           | TUN device (tun0) |
           '-------------------'
             ^           |
          2  |           |  6  
             |           v
           .-------------------.
           | OpenVPN server    |
           '-------------------'
             ^           |
          1  |           |  7  
             |           v
 .----------------.  .----------------.
 | Client a       |  | Client b       |
 '----------------'  '----------------'

この場合(client-to-client無効)、iptablesを使用してクライアント間のパケットをブロックできます。

 iptables -A FORWARD -i tun0 -o tun0 -j DROP

tun0VPNインターフェイスはどこですか。


これを答えとしてマークしました。簡潔でありながら非常に情報量が多く、実際にはiptablesファイアウォールルールが回答に含まれています。
ロビ

1
ダイアグラムについて質問がありますが、文字ごとに、スペースごとに描画しますか?または、簡単かつ迅速にそれを取得するのに役立つアプリを使用していますか?
モハメッドヌールディン

3
@MohammedNoureldin、私はasciio(search.cpan.org/dist/App-Asciio)でオリジナルの図を作成しました。これはasciiart図用のWYSWYGポイントアンドクリックエディターです。
ysdx

ありがとう、Windowsで実行できましたか?それは中世のアプリのようで、Windowsで実行できませんでした。キャメルボックスパッケージでインストールしようとしましたが、常に404エラーが発生します。
モハメッドヌールディン

2
@MohammedNoureldin、私はWindowsを使用していません。私はDebianを使用していますが、パッケージから直接インストールできます。
ysdx

5

マニュアルページの次の段落でopenvpnこの質問に答えていますが、最初の読書では必ずしも明確ではありません。

OpenVPNサーバーモードは、単一のトンネルまたはタップインターフェイスを介して複数のクライアントを処理するため、事実上ルーターです。この --client-to-client フラグは、すべてのクライアント発信トラフィックをTUN / TAPインターフェースにプッシュするのではなく、クライアント間トラフィックを内部的にルーティングするようOpenVPNに指示します。

このオプションを使用すると、各クライアントは現在接続されている他のクライアントを「見る」ことになります。それ以外の場合、各クライアントにはサーバーのみが表示されます。カスタムのクライアントごとのルールを使用してトンネルトラフィックをファイアウォールする場合は、このオプションを使用しないでください。

このclient-to-clientオプションは、サーバー上の通常のルーティングテーブルを短絡します。削除しても、クライアントがサーバーのルーティングテーブルを使用するのを防ぐことはできません。それらのルーティングテーブル(およびサーバーのファイアウォール構成)がクライアントに相互の参照を許可している場合、クライアントはそれを行うことができます。


5

ここにあるようにディレクティブにコメントするだけではありません:

このディレクティブのコメントを外すと、異なるクライアントがお互いを「見る」ことができます。デフォルトでは、クライアントにはサーバーのみが表示されます。 クライアントにサーバーのみを表示させるには、サーバーのTUN / TAPインターフェイスを適切にファイアウォールする必要もあります。

したがって、クライアントごとに個別のIPアドレスポリシーを構成できます。クライアント固有のルールとアクセスポリシーの構成については、https//openvpn.net/index.php/open-source/documentation/howto.htmlをご覧ください。そしてここ:https : //www.sbarjatiya.com/notes_wiki/index.php/Configuring_separate_IP_and_firewall_rule_for_each_openvpn_client


これは、私が考えていたことを意味します。これを達成する唯一の方法は、各クライアントを異なるサブネットに配置することです。これは主に質問に答えるだけでなく、その方法に関するドキュメントを提供しました。これを答えとして書き留めます。ありがとう。
ロビ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.