OpenVPN客户端到客户端

当禁用client-to-client的TUN(第3层)OpenVPN服务器时,我的客户端仍然可以相互通话。

客户端到客户端configuration应根据文档来防止此问题:

如果希望连接客户端以便能够通过VPN到达对方,请取消注释客户端到客户端的指令。 默认情况下,客户端将只能访问服务器。

当这个选项被禁用时,为什么客户端可以继续相互通信?

这是我的服务器conf:

 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 

如果启用 client-to-client ,则VPN服务器在内部转发客户端到客户端的数据包,而不将其发送到主机的IP层(即内核)。 主机networking堆栈根本看不到这些数据包。

  .-------------------. | IP Layer | '-------------------' .-------------------. | TUN device (tun0) | '-------------------' .-------------------. | OpenVPN server | '-------------------' ^ | 1 | | 2 | v .----------------. .----------------. | Client a | | Client b | '----------------' '----------------' 

如果禁用 client-to-client ,则从客户端到另一个客户端的数据包将通过托pipeVPN服务器的计算机的主机IP层(iptables,路由表等): 如果启用IP转发 ,主机可能会转发将数据包(使用其路由表)再次发送到TUN接口和VPN守护程序将会将数据包转发到隧道内的正确客户端。

  .-------------------. | IP Layer | (4) routing, firewall, NAT, etc. '-------------------' (iptables, nftables, conntrack, 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接口。

您需要做的不仅仅是评论指令,因为它在这里说:

取消该指令的注释以允许不同的客户端能够“看到”彼此。 默认情况下,客户端只能看到服务器。 要强制客户端只能看到服务器,您还需要适当地防火墙服务器的TUN / TAP接口。

因此,您可以为每个客户端configuration单独的IP地址策略。 请参阅configuration特定客户端的规则和访问策略 : 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 。

openvpn手册页的下一段回答了这个问题,虽然在一读时不一定清楚:

由于OpenVPN服务器模式通过单个tun或tap接口处理多个客户端,因此它实际上是一个路由器。 --client-to-client标志告诉OpenVPN在内部路由客户端到客户端的stream量,而不是把所有的客户端始发stream量推送到TUN / TAP接口。

当使用此选项时,每个客户端将“看到”当前连接的其他客户端。 否则,每个客户端将只能看到服务器。 如果要使用自定义的每个客户端规则对隧道通信进行防火墙,请不要使用此选项。

client-to-client选项使服务器上的正常路由表短路。 删除它不会阻止客户端使用服务器的路由表。 如果这些路由表(以及服务器的防火墙configuration)允许客户端彼此看到,那么他们将能够这样做。