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