我家里有一台物理 Linux 服务器,上面有多个 KVM 客户端 (Debian 12 Bookworm)。我还可以访问 IPv4 子网 + ASN,并希望通过这些公共 IP 使 KVM 客户端可访问,以便我 (和其他人) 可以在全球范围内与它们通信。
我从我的互联网提供商(德国电信)获得了一个没有 NAT 的唯一动态 IPv4 地址,因此我在连接时无需与其他人共享我的 IP 地址。重新连接时会分配一个新的 IPv4 地址。我使用 FritzBox 7530 作为调制解调器和路由器。
我已经尝试过 WireGuard,但遇到了 MTU/MSS 问题。此外,对于客户端 IP 地址,它只会显示本地网络地址,而不是真正的公共 IP 地址。
我也考虑过 MikroTik,但我真的不明白如何将两个虚拟 MikroTik 路由器(如果我需要两个的话)连接在一起,然后使子网可供 KVM 客户机使用。
答案1
@u1686_grawity 我会在任何提供 BGP 的托管商处订购虚拟服务器,例如 Vultr。
在这种情况下,如果您在一个地方宣布 BGP 但想要在另一个地方使用该地址,那么这本质上需要某种隧道。
隧道类型实际上并不重要 – 它可以是 WG 或 GRE 或 IPIP(SIT)或 L2TP 或 OpenVPN,只要您有 IP 内的 IP,结果就是一样的。
但是,就您而言,听起来 WireGuard 将是最简单的选择,因为它具有更多的自动漫游功能,即 BGP VM 不需要使用新的主机 IP 地址手动更新。
请注意,如果您将 WireGuard 与 wg-quick 一起使用,则应指定Table=
退出 wg-quick 通常执行的默认路由设置。
我已经尝试过 WireGuard,但遇到了 MTU/MSS 问题
这不是 WireGuard 特有的问题;所有隧道都会导致 MTU 减少(由于额外的 IP 标头和其他开销),并且如果 a) 您阻止 ICMP,b) 您正在与之通信的远程客户端或服务器阻止 ICMP,或 c) 满月,大多数隧道都会出现此类问题。
一些隧道,例如 OpenVPN,尝试使用 IP 级碎片化(将内部数据包拆分为两个外部数据包),但这会导致性能降低……更不用说阻止 IP 碎片的网络了。
最好的解决方法可能是在数据包进入隧道接口之前应用 TCP MSS 限制,以便双方协商一个适合通过隧道的 MSS。但是,仍然要确保您不会阻止 ICMP“目标不可到达”,以便路径 MTU 发现有机会发挥作用 - 尤其是对于非基于 TCP 的协议。
将服务器网络接口的 MTU 降低到隧道的 MTU 也会适当减少 TCP MSS(因为主机将直接根据其看到的 MTU 进行计算),但这需要大量手动配置才能实现与单个 iptables“TCPMSS”规则相同的功能。
此外,对于客户端 IP 地址,它只会显示本地网络地址,而不是真正的公共 IP 地址。
这也不是 WireGuard 的问题;这是您设置路由的方式的问题(或缺少路由)。如果您将隧道主机的 IP 地址视为“客户端”IP 地址,则意味着您已在 iptables 中启用了 SNAT(伪装)。
不要使用 SNAT。相反,使用策略路由作为让响应数据包通过隧道路由回来的推荐方法(根据其“源地址”)。
我也考虑过 MikroTik,但我真的不明白如何将两个虚拟 MikroTik 路由器(如果我需要两个的话)连接在一起,然后使子网可供 KVM 客户机使用。
虽然这在技术上是可行的,但我认为使用 RouterOS VM 的唯一原因是:a)为了保持一致性,如果你同时运行它身体的Mikrotik 路由器(但听起来你不喜欢),或者 b)如果你只是喜欢配置风格。
除此之外,RouterOS 没有任何神奇的功能可以帮助您应对这种情况 - 它只进行常规路由、常规 BGP 等 - 因此,您可以在 RouterOS 中执行的任何基本路由设置都可以在常规 Linux 上轻松完成。(而且直接在 VM 主机上执行此操作可能比在单独的 VM 上执行更容易。)
假设我有 2+1 个公共 IPv4,通过隧道连接到主机的单个 IPv4 地址,我怎样才能将其中两个绑定到访客,并将一个(+1)绑定到主机?
有几种可能的配置;例如:
- 在 BGP 路由器上,通过隧道接口静态路由整个 xyz0/24。
- 在家庭 VM 主机上,将整个 /24 分配给所有 VM 所在的桥接接口 - 例如将 xyz1/24 添加到 vmbr0 接口。
- 在虚拟机上,配置来自 /24 的地址,就好像它是本地子网一样(因为在步骤 2 之后它确实是)。
这是最简单的方法;您甚至可以删除 vmbr0 以前的原始“内部”地址。
您可以随时拆分 /24;例如,如果您在同一个 VM 主机上有四个独立的桥接接口,则在步骤 2 中您可以为每个接口分配一个 /26(将 xyz1/26 添加到 vmbr0,然后将 xyz65/26 添加到 vmbr1,等等)。
另一种方法是路由单个 IP 地址:
- 同上。
- 在主 VM 主机上,将单个地址作为 /32 分配给任意接口。(这通常使用“lo”环回接口完成。)
- 在两台虚拟机上执行相同的操作并将地址分配给某个接口作为 /32 - 但也保留现有的内部地址。
- 在主机上,为每个虚拟机添加静态路由/32
via
该虚拟机的内部地址。
使用 /32 有一点优势,因为它甚至允许您使用全零和全一的地址(iexyz0 和 xyz255)。
在全部在上述方法中,如果 VM 主机运行 Linux,那么您将需要“策略路由”规则来引导返回流量通过隧道:
通过隧道接口将默认路由(0.0.0.0/0)添加到单独的路由表(例如表 2)。
manual: ip route add 0.0.0.0/0 dev wg0 table 2 wg-quick: Table=2
添加策略规则(通过
ip rule
),以便数据包从您的新 /24 选择表 2。ip -4 rule add from x.y.z.0/24 lookup 2