OpenVPN 客户端到客户端

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

答案1

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

           .-------------------.
           | 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

tun0你的 VPN 接口在哪里?

答案2

你需要做的不仅仅是评论指令这里

取消注释此指令以允许不同的客户端能够“看到”彼此。默认情况下,客户端只能看到服务器。 为了强制客户端只能看到服务器,您还需要适当地对服务器的 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

答案3

手册页的下一段openvpn回答了这个问题,尽管初读时可能不太清楚:

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

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

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

相关内容