OpenVPN 客户端到客户端

lob*_*obi 23 linux vpn openvpn

当使用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
Run Code Online (Sandbox Code Playgroud)

ysd*_*sdx 68

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

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


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


           .-------------------.
           | OpenVPN server    |
           '-------------------'
             ^           |
          1  |           |  2   
             |           v
 .----------------.  .----------------.
 | Client a       |  | Client b       |
 '----------------'  '----------------'
Run Code Online (Sandbox Code Playgroud)

如果client-to-client残疾人,从客户到另一个客户端的数据包通过主机IP层(iptables的,路由表等)托管VPN服务器的计算机:如果启用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       |
 '----------------'  '----------------'
Run Code Online (Sandbox Code Playgroud)

在这种情况下(client-to-client禁用),您可以使用 iptables 阻止客户端到客户端的数据包:

 iptables -A FORWARD -i tun0 -o tun0 -j DROP
Run Code Online (Sandbox Code Playgroud)

tun0你的 VPN 接口在哪里。

  • @MohammedNoureldin,我用 asciio (http://search.cpan.org/dist/App-Asciio/) 制作了原始图表,这是一个用于 asciiart 图表的所见即所得的点击式编辑器。 (3认同)
  • 我对图表有疑问,你是逐个字符、逐个空格地绘制它吗?或者您是否使用任何应用程序来帮助您简单快速地实现这一目标? (2认同)
  • @MohammedNoureldin,我没有使用 Windows。我正在使用 Debian,它可以从软件包中直接安装。 (2认同)

Dia*_*ond 8

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

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


roa*_*ima 6

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

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

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

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