OpenVPN客户端到客户端


17

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

客户端到客户端的配置应根据文档阻止此操作:

如果您希望连接客户端之间能够通过VPN相互访问,请取消注释client-to-client指令。默认情况下,客户端将只能访问服务器。

禁用此选项后,为什么客户端可以继续相互通信?

这是我的服务器配置文件:

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

Answers:


54

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

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


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


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

如果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       |
 '----------------'  '----------------'

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

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

tun0您的VPN接口在哪里。


将此标记为答案;简洁却非常有用,实际上在答案中提供了iptables防火墙规则。
lobi

1
我对图表有疑问,您是否按字符绘制字符并按空间绘制字符?还是您使用任何应用程序来帮助您简单快速地获得它?
Mohammed Noureldin

3
@MohammedNoureldin,我用asciio(search.cpan.org/dist/App-Asciio)制作了原始图表,这是WYSWYG的asciiart图点击式编辑器。
ysdx

谢谢,您是否设法在Windows上运行它?它似乎是一个中世纪的应用程序,我无法在Windows上运行它,我尝试使用camelbox软件包进行安装,但始终出现404错误。
Mohammed Noureldin

2
@MohammedNoureldin,我没有使用Windows。我正在使用Debian,可以直接从软件包中安装它。
ysdx

5

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

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

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

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


这就是我的想法:实现此目的的唯一方法是将每个客户端放在不同的子网中。这基本上可以回答问题,此外,您还提供了一些有关如何执行此操作的文档。我将其标记为答案。谢谢。
lobi 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.