我在设置 wireguard 时遇到问题。我的问题是来自 wireguard hos 以外的任何地方的数据包都不会通过 wg0 接口发送出去。我运行 wg0 并启用了 192.168.96.1/24 ip 转发。我可以通过 wg0 IP 和其 LAN IP 访问 wg0 主机上的 Web 服务器。但没有来自其他 LAN 主机的流量 - 或者伪装流量的应答没有通过 wg0 发送出去,但可以看到它进入了 eth0。
ip route
192.168.96.0/24 dev wg0 proto kernel scope link src 192.168.96.1
我有很多与 docker 相关的 nat 规则。但我不知道为什么数据包没有路由到我的 wg0 主机
# iptables --list-rules
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o hassio -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o hassio -j DOCKER
-A FORWARD -i hassio ! -o hassio -j ACCEPT
-A FORWARD -i hassio -o hassio -j ACCEPT
-A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 9000 -j ACCEPT
...
-A DOCKER -d 172.30.33.6/32 ! -i hassio -o hassio -p tcp -m tcp --dport 22 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i hassio ! -o hassio -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o hassio -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
# iptables -t nat --list-rules
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.30.32.0/23 ! -o hassio -j MASQUERADE
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 9000 -j MASQUERADE
...
-A POSTROUTING -s 172.30.33.6/32 -d 172.30.33.6/32 -p tcp -m tcp --dport 22 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i hassio -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 9000 -j DNAT --to-destination 172.17.0.3:9000
....
-A DOCKER ! -i hassio -p tcp -m tcp --dport 2222 -j DNAT --to-destination 172.30.33.6:22
答案1
如果您安装了 Docker,您肯定希望保留 FORWARD 丢弃或拒绝策略。我发现使用配置中的PostUp
和选项让 Wireguard 处理自己的 iptables 规则会更简洁一些。在您的部分下,您应该输入类似以下内容(假设 hassio 是您的主要网络接口):PostDown
wg0.conf
[Interface]
PostUp = iptables -I FORWARD 1 -i %i -o hassio -s 192.168.96.0/24 -j ACCEPT; iptables -t nat -A POSTROUTING -s 192.168.96.0/24 -o hassio -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -o hassio -s 192.168.96.0/24 -j ACCEPT; iptables -D POSTROUTING -s 192.168.96.0/24 -o hassio -j MASQUERADE
然后需要将其与允许反向 FORWARD 流量的规则配对:我个人选择更通用的 ESTABLISHED/RELATED 规则,形式为-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
。我真的不知道有什么情况我需要做除了允许已经 ESTABLISHED/RELATED 会话继续之外的任何事情。
PS - 我还对真正只在 LAN 上运行的主机使用“REJECT”策略。当某些内容不被允许时,REJECT 会踢出 ICMP 数据包,而 DROP 只会默默地断开连接;REJECT 使调试变得容易得多。