![仅允许在同一子网掩码内的 VPN 客户端之间转发](https://linux22.com/image/785647/%E4%BB%85%E5%85%81%E8%AE%B8%E5%9C%A8%E5%90%8C%E4%B8%80%E5%AD%90%E7%BD%91%E6%8E%A9%E7%A0%81%E5%86%85%E7%9A%84%20VPN%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B9%8B%E9%97%B4%E8%BD%AC%E5%8F%91.png)
我在服务器上使用 Wireguard(接口 wg0)作为 VPN,其中所有连接的客户端都具有由服务器分配的 IPv6 地址(由 AllowedIPs 控制)。
假设我们有三个客户:
- 客户端 A,具有 7767:1::a
- 客户端 B,使用 7767:2::b
- 客户端 C,使用 7767:2::c
我想配置服务器(即使用类似 iptables 的东西)以允许客户端 B 和 C 之间的转发(因为它们位于同一子网 /32 上),并拒绝客户端 A 和 B/C 之间的转发(因为它们位于不同的子网 /32 上)。而且我不想每次使用新子网时都担心明确指定子网。
像这样的事情会起作用(未经测试):
prefix="7767"
ip6tables -A FORWARD -i wg0 -m state --state INVALID -j DROP
ip6tables -A FORWARD -i wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
for ((i=0;i<65536;++i))
do
subnet="$(printf "$prefix:%x" $i)"
ip6tables -A FORWARD -i wg0 -s $subnet::/32 -d $subnet::/32 -j ACCEPT
done
ip6tables -A FORWARD -i wg0 -j DROP
是否有一些通用规则可用于这种情况?或者也许除了 iptables 之外还有其他工具更适合这种情况?