如何通过WireGuard实现单向流量控制并满足特定组网访问需求
如何通过WireGuard实现单向流量控制并满足特定组网访问需求
嘿,这个需求我之前折腾WireGuard的时候也碰到过!你说得没错,WireGuard自带的AllowedIPs确实没法实现单向访问——它本质是路由规则,用来决定哪些流量会走WireGuard隧道,而不是访问控制规则,所以只要两边配置了对应的AllowedIPs,流量就是双向可路由的。
不过除了在每台机器上手动写一堆零散的iptables规则,其实有更简洁的方案:把针对性的防火墙规则直接嵌入WireGuard的配置文件,用PostUp和PostDown钩子在隧道启动/关闭时自动加载/清理规则,既省心又不容易出错。
先明确你的需求逻辑:
- A可以主动访问B、C(ping、telnet等都正常)
- B可以主动访问C,但C不能反向访问B
- B、C都不能主动访问A
假设我们给三台机器分配WireGuard内网IP:
- A: 10.0.0.1/32
- B: 10.0.0.2/32
- C: 10.0.0.3/32
- WireGuard接口名统一为
wg0
下面是每台机器的具体配置方案:
机器A的配置
A需要能主动连接B、C,但要拒绝B、C的主动访问请求。我们可以在WireGuard配置里添加入站拦截规则:
[Interface] PrivateKey = <A的私钥> Address = 10.0.0.1/32 PostUp = iptables -A INPUT -i wg0 -s 10.0.0.2/32 -j DROP; iptables -A INPUT -i wg0 -s 10.0.0.3/32 -j DROP PostDown = iptables -D INPUT -i wg0 -s 10.0.0.2/32 -j DROP; iptables -D INPUT -i wg0 -s 10.0.0.3/32 -j DROP [Peer] PublicKey = <B的公钥> Endpoint = <B的公网IP:端口> AllowedIPs = 10.0.0.2/32 [Peer] PublicKey = <C的公钥> Endpoint = <C的公网IP:端口> AllowedIPs = 10.0.0.3/32
这里的PostUp规则会在隧道启动后,直接丢弃所有来自B、C的入站流量,但A主动发起连接的返程流量会被iptables的状态跟踪(ESTABLISHED,RELATED)自动允许,所以A能正常访问B、C,反过来却不行。
机器B的配置
B需要能访问C,但不能被C访问,同时不能访问A。我们可以通过AllowedIPs限制B的路由范围,再加上入站拦截规则:
[Interface] PrivateKey = <B的私钥> Address = 10.0.0.2/32 PostUp = iptables -A INPUT -i wg0 -s 10.0.0.3/32 -j DROP PostDown = iptables -D INPUT -i wg0 -s 10.0.0.3/32 -j DROP [Peer] PublicKey = <A的公钥> Endpoint = <A的公网IP:端口> AllowedIPs = 10.0.0.1/32 # 这里保留A的路由是为了让A能主动连B,返程流量能回来 [Peer] PublicKey = <C的公钥> Endpoint = <C的公网IP:端口> AllowedIPs = 10.0.0.3/32
- 因为
AllowedIPs只包含A和C的IP,B没有到其他地址的路由,自然没法主动访问A; - 入站规则直接丢弃C的主动连接请求,但B访问C的返程流量正常通行。
机器C的配置
C只需要接受A和B的主动访问,不能主动发起任何反向连接。我们可以直接在C的配置里限制出向流量:
[Interface] PrivateKey = <C的私钥> Address = 10.0.0.3/32 PostUp = iptables -A OUTPUT -o wg0 -d 10.0.0.1/32 -j DROP; iptables -A OUTPUT -o wg0 -d 10.0.0.2/32 -j DROP PostDown = iptables -D OUTPUT -o wg0 -d 10.0.0.1/32 -j DROP; iptables -D OUTPUT -o wg0 -d 10.0.0.2/32 -j DROP [Peer] PublicKey = <A的公钥> Endpoint = <A的公网IP:端口> AllowedIPs = 10.0.0.1/32 [Peer] PublicKey = <B的公钥> Endpoint = <B的公网IP:端口> AllowedIPs = 10.0.0.2/32
这条PostUp规则会直接阻止C向A、B发起任何出站流量,从源头上杜绝了反向访问的可能,同时不影响A、B主动连接C的返程流量。
关键注意点
- WireGuard的
AllowedIPs是路由规则,不是防火墙规则,它只决定“流量是否走隧道”,不决定“流量是否被允许通过隧道”; - 利用iptables的状态跟踪特性,我们不需要手动允许返程流量——只要主动发起连接,对应的返程流量会被自动归类为
ESTABLISHED,RELATED状态,默认被防火墙允许; - 用
PostUp/PostDown的好处是规则和WireGuard隧道绑定,启动/关闭隧道时自动添加/删除规则,不用手动维护零散的iptables规则。
备注:内容来源于stack exchange,提问作者Patrick Visi
相关产品推荐
相关产品推荐

