如何通过wireguard覆盖网络转发/路由数据包?

Ove*_*ryd 2 linux routing iptables wireguard

我的问题与网络路由和 iptables 的基础知识有关,可能是因为我对如何设置它缺乏了解。

我使用wireguard 在主机之间建立了一个覆盖网络,其中一个位于路由器/NAT 后面。到目前为止,覆盖网络运行良好,每个主机都可以与其他主机通信。

现在,我想让主机 A 成为专用网络的网关,但遗憾的是我未能做到这一点。

你能帮我解开 iptables 转发之谜吗?

3 网络

VPN 的覆盖网络是169.254.0.0/24,路由器后面的专用网络是192.168.0.0/24

  • 互联网
  • 覆盖网络(169.254.0.0/24,在 Wireguard 上运行)
  • 专用网络 ( 192.168.0.0/24)

4 台主机

  • VPN服务器

    wg0: 169.254.0.1

  • 客户

    wg0: 169.254.0.2

  • 主机A

    wg0: 169.254.0.3
    eth0: 192.168.0.33

  • 主机B

    eth0: 192.168.0.53

为了说明真实的网络,下面是这张图: 真实网络

这是覆盖网络: 覆盖网络

此时,我的客户端无法通过主机 A 向主机 B 发送数据包。

Ove*_*ryd 5

这是一个工作配置。唷,实际上我自己得到了它,但我花了一段时间才把事情做好。

客户

我必须确保对等方(VPN 服务器)被允许使用该192.168.178.0/24范围。

[Interface]
Address = 169.254.0.2/32
PrivateKey = ...
ListenPort = 51280

[Peer]
PublicKey = ...
AllowedIPs = 169.254.0.1/32, 192.168.178.0/24
Endpoint = ...:51280
Run Code Online (Sandbox Code Playgroud)

VPN服务器

我只需要从tun0接口和MASQUERADE它们转发数据包。此外,我还将网络添加到了主机A的192.168.178.0/24网络中。AllowedIPs

$ iptables -A FORWARD -i tun0 -j ACCEPT
$ iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

线卫配置:

[Interface]
Address = 169.254.0.1/32
PrivateKey = ...
ListenPort = 51280

[Peer]
Endpoint = ...:51280
PublicKey = ...
AllowedIps = 169.254.0.2/32

[Peer]
Endpoint = ...:51280
PublicKey = ...
AllowedIps = 169.254.0.3/32, 192.168.178.0/24
Run Code Online (Sandbox Code Playgroud)

主机A

我需要在两个接口上接受转发数据包。我会在 上伪装小包eth0

$ iptables -A FORWARD -i tun0 -j ACCEPT
$ iptables -A FORWARD -i eth0 -j ACCEPT
$ iptables -A POSTROUTING -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

Wireguard 方面,配置没有什么特别的。它只是连接到 VPN 服务器。

[Interface]
Address = 169.254.0.3/32
PrivateKey = ...
ListenPort = 51280

[Peer]
Endpoint = ...:51280
PublicKey = ...
AllowedIps = 169.254.0.1/32
PersistentKeepalive = 25
Run Code Online (Sandbox Code Playgroud)

然而,在使用主机 A(位于路由器/NAT 后面)时存在一个主要缺陷。VPN 服务器必须知道主机 A 的端点(公共 IP + 端口)才能向其发送数据包。一段时间后,路由器将失去状态,因此 VPN 服务器将无法再连接到主机 A。

我通过将设置添加PersistentKeepalive[Peer]主机 A 上的 VPN 服务器部分来修复此问题。(感谢评论中的@AB 指出了这一点。)

我想知道如果两者都位于路由器/NAT 之后如何解决这个问题。该死,这很复杂。