如何限制WireGuard VPN用户仅访问本地192.168.0.x网络且不影响VPN连接?
如何限制WireGuard VPN用户仅访问本地192.168.0.x网络且不影响VPN连接?
老哥,我来帮你捋清楚这个问题!首先得说下你之前操作的问题出在哪:你把服务器的OUTPUT链默认策略改成了DROP,但WireGuard服务器本身需要和公网的客户端(比如你5G下的手机)通信,这部分流量属于服务器自己的OUTPUT流量,直接被你禁掉了,所以客户端连不上VPN了。而且你之前改的规则是全局的,会影响所有流量,这显然不是你想要的效果。
正确的思路是针对临时用户单独做限制,不影响服务器本身和其他正常客户端,具体步骤如下:
第一步:先恢复之前的iptables规则,避免服务器出问题
先把被你改坏的OUTPUT链恢复正常,不然服务器自己都没法和外界通信:
# 把OUTPUT链默认策略改回ACCEPT iptables -P OUTPUT ACCEPT # 删除之前加的那条OUTPUT规则 iptables -D OUTPUT -d 192.168.0.0/16 -j ACCEPT # 如果之前加了FORWARD的规则,也一起删掉 iptables -D FORWARD -p udp -m udp --sport ##### -j ACCEPT iptables -D FORWARD -p udp -m udp --dport ##### -j ACCEPT
第二步:给临时用户的WireGuard配置做路由限制
打开你的WireGuard服务器配置文件(一般是/etc/wireguard/wg0.conf),找到这个临时用户的[Peer]段,修改AllowedIPs,只让他的流量指向本地192.168.0.x网络,不要包含0.0.0.0/0(这个是全流量走VPN的意思)。比如:
[Peer] PublicKey = 临时用户的WireGuard公钥 # 这里只写本地网络段,加上用户的VPN内网IP(比如10.0.0.5,根据你的服务器内网段调整) AllowedIPs = 192.168.0.0/24, 10.0.0.5/32
改完之后重启WireGuard服务生效:
wg-quick down wg0 && wg-quick up wg0
第三步:用iptables的FORWARD链限制临时用户的流量
因为WireGuard客户端的流量是通过服务器的FORWARD链转发的,所以我们在这里做精准限制:
假设临时用户的VPN内网IP是10.0.0.5(你要换成实际分配给他的IP),本地网络是192.168.0.0/24:
# 允许临时用户访问本地192.168.0.x网络 iptables -A FORWARD -s 10.0.0.5/32 -d 192.168.0.0/24 -j ACCEPT # 允许本地网络的设备回包给临时用户 iptables -A FORWARD -d 10.0.0.5/32 -s 192.168.0.0/24 -j ACCEPT # 拒绝临时用户的其他所有转发流量(比如访问公网) iptables -A FORWARD -s 10.0.0.5/32 -j DROP
额外确认:确保IP转发已经开启
这个你之前应该已经开了(不然VPN没法正常工作),但还是确认一下:
# 临时开启 echo 1 > /proc/sys/net/ipv4/ip_forward # 永久开启(重启后生效),编辑/etc/sysctl.conf,把net.ipv4.ip_forward=1的注释去掉 # 然后执行sysctl -p生效
这样设置之后,临时用户连VPN后只能访问你本地192.168.0.x的设备,没法上公网;而你自己的手机用原来的配置连接VPN,依然可以正常访问公网和本地网络,完全不受影响~
备注:内容来源于stack exchange,提问作者espresso fan
相关产品推荐
相关产品推荐

