You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 14:19:09