Ove*_*ryd 2 linux routing iptables wireguard
我的问题与网络路由和 iptables 的基础知识有关,可能是因为我对如何设置它缺乏了解。
我使用wireguard 在主机之间建立了一个覆盖网络,其中一个位于路由器/NAT 后面。到目前为止,覆盖网络运行良好,每个主机都可以与其他主机通信。
现在,我想让主机 A 成为专用网络的网关,但遗憾的是我未能做到这一点。
你能帮我解开 iptables 转发之谜吗?
VPN 的覆盖网络是169.254.0.0/24
,路由器后面的专用网络是192.168.0.0/24
。
169.254.0.0/24
,在 Wireguard 上运行)192.168.0.0/24
)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 发送数据包。
这是一个工作配置。唷,实际上我自己得到了它,但我花了一段时间才把事情做好。
我必须确保对等方(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)
我只需要从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)
我需要在两个接口上接受转发数据包。我会在 上伪装小包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 之后如何解决这个问题。该死,这很复杂。
归档时间: |
|
查看次数: |
4155 次 |
最近记录: |