You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何实现本地KVM虚拟机通过公网IPv4地址/子网对外全球可访问

如何实现本地KVM虚拟机通过公网IPv4地址/子网对外全球可访问

看起来你已经握有核心资源——自有ASN和IPv4子网,现在主要卡在动态公网IP环境下,怎么把这些子网落地到本地KVM虚拟机,同时解决之前WireGuard遇到的MTU/MSS和真实IP显示问题对吧?我给你拆解几个可行的方案,从改进你试过的WireGuard到更适配自有ASN的专业路由方案:

方案一:修复WireGuard的痛点,快速复用现有配置

你之前用WireGuard遇到的问题其实都是可解决的,改起来最快:

  • MTU/MSS调整:WireGuard默认MTU是1420,但德国电信的PPPoE链路会占用8字节,所以把WireGuard的MTU降到1412更适配。在你的WireGuard配置文件(/etc/wireguard/wg0.conf)里,给每个Peer段加上MTU = 1412;同时在物理服务器上设置MSS钳位,避免TCP包过大被丢弃:
    iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
    
    把这条命令加到开机自启里(比如写入/etc/rc.local或者创建一个简单的systemd服务),确保重启后生效。
  • 真实IP显示问题:之前应该是用了SNAT把虚拟机流量转换成WireGuard内网IP了,改成DNAT直接映射就行。在物理服务器上,把WireGuard接口收到的、目标为你自有子网的流量,直接转发到对应的KVM虚拟机内网IP:
    iptables -t nat -A PREROUTING -i wg0 -d 你的IPv4子网段/24 -j DNAT --to-destination 对应虚拟机的内网IP
    
    别忘了确保物理服务器开启IP转发:执行echo 1 > /proc/sys/net/ipv4/ip_forward,然后把net.ipv4.ip_forward=1加到/etc/sysctl.conf里永久生效。

方案二:利用自有ASN+BGP隧道,实现真正的公网路由

这才是最匹配你资源的长期方案——直接把你的IPv4子网通过BGP宣告到公网,完全不需要依赖NAT,外部能直接访问虚拟机的公网IP,也能看到真实的客户端来源IP:

  1. 搭建动态BGP隧道:因为你家里是动态公网IP,找一家支持动态IP的BGP隧道服务商,建立一条GRE或IPsec隧道到你的物理Linux服务器。
  2. 在物理服务器上配置BGP:用FRRouting(FRR)这个Linux开源路由套件来实现BGP功能:
    • 先安装FRR并启用bgpd服务:apt install frr && systemctl enable --now bgpd
    • 编辑/etc/frr/frr.conf,添加BGP会话配置(替换成你的实际参数):
      router bgp 你的ASN编号
       neighbor 隧道服务商的端点IP remote-as 服务商的ASN编号
       neighbor 隧道服务商的端点IP update-source 你的物理服务器公网IP(动态IP可以用DDNS或脚本自动更新这个字段)
       network 你的IPv4子网段/24
      
    • 重启FRR服务生效:systemctl restart frr
  3. FritzBox端口转发配置:把隧道需要的端口(比如GRE用47号端口,IPsec用500和4500端口)转发到你的物理Linux服务器,确保隧道能穿透路由器。
  4. KVM虚拟机绑定公网IP:直接给KVM虚拟机配置你自有子网里的公网IP,网关设为物理服务器的内网IP;然后在物理服务器上添加静态路由,把子网的流量导向隧道接口即可。

方案三:MikroTik虚拟路由方案(如果你想尝试这个方向)

其实不需要两个MikroTik,只需要在你的物理服务器上部署一个MikroTik虚拟机作为核心路由:

  • 创建MikroTik KVM虚拟机,给它分配两个网卡:一个桥接物理服务器的内网(和其他KVM虚拟机在同一网段),另一个桥接物理服务器的公网接口(或者把物理服务器设为FritzBox的DMZ主机,让MikroTik直接获取动态公网IP)。
  • 在MikroTik上配置BGP(和方案二逻辑一致),把你的ASN和IPv4子网宣告到公网;同时配置路由规则,让其他KVM虚拟机的流量通过MikroTik走隧道出去。
  • 把其他KVM虚拟机的网关设为MikroTik的内网IP,直接使用你自有子网的公网IP,这样外部访问就能直接连接到虚拟机的公网IP,也能看到真实的客户端IP。

方案选择建议

  • 如果只是临时需求,方案一最快,改改配置就能用;
  • 如果是长期稳定的公网服务,方案二绝对是最优解——这是真正的公网路由模式,没有NAT带来的限制,完全发挥你自有ASN和子网的价值;
  • MikroTik方案适合喜欢可视化路由配置的用户,但学习成本略高,不如FRR直接在Linux上配置灵活。

备注:内容来源于stack exchange,提问作者Tintenfisch

火山引擎 最新活动