web-dev-qa-db-ja.com

OpenVPNクライアント対クライアント

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

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

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
18
lobi

client-to-client is enabled、VPNサーバーはクライアント間のパケットをホストのIPレイヤー(つまりカーネル)に送信せずに内部的に転送します。ホストネットワークスタックは、これらのパケットをまったく認識しません。

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


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


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

client-to-client is disabled、クライアントから別のクライアントへのパケットは、VPNサーバーをホストしているマシンのホストIPレイヤー(iptables、ルーティングテーブルなど)を通過します。IP転送の場合is enabled、ホストは(ルーティングテーブルを使用して)パケットを再度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

どこ tun0はVPNインターフェイスです。

59
ysdx

here のように、ディレクティブにコメントを付けるだけではありません。

このディレクティブのコメントを外して、異なるクライアントがお互いに「見える」ようにします。デフォルトでは、クライアントにはサーバーのみが表示されます。 クライアントにサーバーのみを表示させるには、サーバーの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

7
Diamond

openvpnのmanページの次の段落はこの質問に答えますが、最初に読んだときは必ずしも明確ではありません。

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

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

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

6
roaima