如何通过PostUp iptables规则限制WireGuard其他分支节点仅能访问指定LAN子网IP
我来帮你搞定这个需求!你的场景里,HostA.2作为连接LAN A和WireGuard hub的节点,要限制HostB这类分支节点只能访问LAN里的10.0.0.3,不能碰其他IP,直接在HostA.2的WireGuard配置里加PostUp/PostDown的iptables规则就能实现,下面一步步来:
首先得确认HostA.2已经开了IP转发,不然跨子网的流量根本转不动。临时开启可以用:
sysctl -w net.ipv4.ip_forward=1
要是想永久生效,就把net.ipv4.ip_forward=1写到/etc/sysctl.conf里,然后执行sysctl -p生效。
接下来修改HostA.2的WireGuard配置文件(一般是/etc/wireguard/wg1.conf),在[Interface]段里添加PostUp和PostDown脚本。这里假设你的LAN接口是eth0(你可以换成自己实际的LAN接口名,比如enp0s3之类的):
[Interface] PrivateKey = 你的HostA.2私钥 Address = 172.16.0.2/32 # 下面是核心的限制规则 PostUp = iptables -A FORWARD -i wg1 -d 10.0.0.3/32 -o eth0 -j ACCEPT; \ iptables -A FORWARD -i eth0 -s 10.0.0.3/32 -o wg1 -j ACCEPT; \ iptables -A FORWARD -i wg1 -o eth0 -j DROP PostDown = iptables -D FORWARD -i wg1 -d 10.0.0.3/32 -o eth0 -j ACCEPT; \ iptables -D FORWARD -i eth0 -s 10.0.0.3/32 -o wg1 -j ACCEPT; \ iptables -D FORWARD -i wg1 -o eth0 -j DROP # 如果你的配置里已经有其他PostUp规则(比如SNAT),直接把上面的规则追加进去就行
我给你解释下每条规则的作用:
- 第一条规则:允许从WireGuard接口(wg1)进来的、目标是10.0.0.3的流量转发到LAN接口,这样HostB就能正常访问HostA.3了。
- 第二条规则:允许从LAN接口出来的、源是10.0.0.3的响应流量转发回WireGuard接口,这步很重要!不然只有你发出去的流量,收不到响应,连接根本建立不起来。
- 第三条规则:拒绝所有其他从WireGuard接口到LAN接口的转发流量,这样HostB就碰不到10.0.0.4或者LAN里的其他IP了。
要注意规则的顺序!iptables是按从上到下的顺序匹配规则的,所以一定要把允许规则放在拒绝规则前面,不然先匹配到拒绝,流量直接就被丢了。
要是你需要允许的是一个IP段而不是单个IP,比如10.0.0.0/24里的10.0.0.0-10.0.0.10,就把10.0.0.3/32换成对应的CIDR,比如10.0.0.0/28(根据你的实际网段调整)。
配置完之后,重启WireGuard服务生效:
wg-quick down wg1 && wg-quick up wg1
最后可以在HostB上测试:ping 10.0.0.3应该能通,ping 10.0.0.4或者其他LAN IP应该超时,这样就说明规则生效了。
备注:内容来源于stack exchange,提问作者OutwardThinking

