![如何在 Linux 路由器上配置 Wireguard 以将所有流量从 LAN 路由到远程 Wireguard VPN 服务器](https://linux22.com/image/751646/%E5%A6%82%E4%BD%95%E5%9C%A8%20Linux%20%E8%B7%AF%E7%94%B1%E5%99%A8%E4%B8%8A%E9%85%8D%E7%BD%AE%20Wireguard%20%E4%BB%A5%E5%B0%86%E6%89%80%E6%9C%89%E6%B5%81%E9%87%8F%E4%BB%8E%20LAN%20%E8%B7%AF%E7%94%B1%E5%88%B0%E8%BF%9C%E7%A8%8B%20Wireguard%20VPN%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我在 NanoPi R1 上运行着 Armbian Linux。它通过 IPTables NAT/Masquerading 将所有流量从 eth1(LAN 静态 IP,DHCP/DNS 的 dnsmasq)路由到 eth0(WAN dhcp 客户端)。这很好用。LAN 中 eth1 后面的客户端可以访问外部世界。
现在我已经在设备上安装了 Wireguard。云端有一个 Wireguard VPN 服务。我可以在 Pi 上访问它,它会通过 wg0 接口路由来自 Pi 的所有流量。
但 LAN 中的客户端无法再访问任何东西。我不明白如何将所有流量从 eth1 路由到 wg0 并到达 eth0。网上有很多示例,介绍如何以相反的方式配置(VPN 服务器),但我不确定如何配置 wg 接口。
[Interface]
Address = 10.0.0.10/32, fd01:10:0::10/128
ListenPort = 21841
PrivateKey = ...
PostUp = iptables -A FORWARD -i %i -o eth1 -j ACCEPT; iptables -A FORWARD -o %i -i eth1 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -o eth1 -j ACCEPT; iptables -D FORWARD -o %i -i eth1 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth1 -j MASQUERADE
DNS = <provider-ip>
[Peer]
PublicKey = <pubkey>
EndPoint = <vpnserver>:<vpnport>
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
即使我删除或更改 PostUp/Down,行为也不会改变。内核中启用了 IP Forward。
这是我开始 wg0 之后的规则集:
$> iptables -L -n -x -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
12 1752 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4267 282274 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
273 24031 ACCEPT all -- eth1 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- wlan0 * 0.0.0.0/0 0.0.0.0/0
825 87848 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
701 85098 DROP all -- eth0 * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
419 26498 ACCEPT all -- eth1 eth0 192.168.11.0/24 0.0.0.0/0 ctstate NEW
15343 6475800 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- wg0 eth1 0.0.0.0/0 0.0.0.0/0
69 12915 ACCEPT all -- eth1 wg0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
我可以看到,eth1 向 wg0 发送了数据包,但是没有返回。出了什么问题?
masq 表如下所示:
$> iptables -L -n -x -v -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
742 52126 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * eth1 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination