如何在单台机器和虚拟机网络上从一个 WAN 连接到另一个 WAN?

如何在单台机器和虚拟机网络上从一个 WAN 连接到另一个 WAN?

我的网络设置相当复杂,但我对路由和类似主题也是新手。

我的 ISP 通过 PPPoE 提供多个静态 IP,我们将它们称为 IP0、IP1、IP2、IP3 等。IP0 分配给路由器,并通过接口 INT1 提供给整个 LAN,也提供给我的主机。

在该主机 INT2 上的不同接口上,存在与调制解调器的单独连接。通过 INT2,我可以获得与 IP1、IP2、IP3 的单独 PPP 连接,但我还获得了新的虚拟接口 PPP1、PPP2、PPP3。

我成功创建了必要的路由表和路由规则,因此我可以使用主机上的所有 4 个外部 IP,还可以将外部 IP 分配给主机上运行的虚拟机。例如,我的主机在互联网上显示为 IP0,VM1 显示为 IP2,VM2 显示为 IP2,VM3 显示为 IP3。我可以通过正确的 IP 从外部主机连接到所有 4 个主机。

有一件事不起作用。我无法通过 WAN 从 VM1 连接到 VM2 和 VM3 上的服务。 从 VM1 来看,IP2 和 IP3 无法 ping 通,并且没有连接到任何服务。VM2 和 VM3 也是如此。在主机上,我也无法通过 PPP1 或任何其他组合 ping IP2 和 IP3。

我可以通过将服务的扩展 IP 替换为 LAN 中的 VM 内部 IP 来解决这个问题,但我正在寻找更透明的解决方案。

有任何想法吗?

我的操作系统是 Debian 10,并且使用 nftables 作为防火墙。

网络图

我的网络配置:

ip rule show
0:  from all lookup local
32672:  from IP1 lookup PPP1-RT
32673:  from IP2 lookup PPP2-RT
32674:  from IP3 lookup PPP3-RT
32676:  from VM1_VLAN_IP lookup PPP1-RT
32678:  from VM2_VLAN_IP lookup PPP2-RT
32679:  from VM3_VLAN_IP lookup PPP3-RT
32766:  from all lookup main
32767:  from all lookup default
ip route show table PPP1-RT
default dev PPP1 scope link metric 1
PPP_GATEWAY_IP dev PPP1 scope link src IP1 metric 1
ip route show table main
default via HOST_LAN_IP dev INT1 proto dhcp metric 1
PPP_GATEWAY_IP dev PPP1 proto kernel scope link src IP1
PPP_GATEWAY_IP dev PPP2 proto kernel scope link src IP2
PPP_GATEWAY_IP dev PPP3 proto kernel scope link src IP3
VM_VLAN_SUBNET dev VLAN proto kernel scope link src VLAN_HOST_IP metric 425
LAN_SUBNET dev INT1 proto kernel scope link src HOST_LAN_IP metric 1
/etc/nftables.conf

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
        chain input {
                type filter hook input priority 0; policy drop;
                ct state established,related accept
                iif "lo" accept
                ct state invalid log prefix "Invalid packet: " drop
                ip protocol icmp accept
                ip protocol igmp accept
                ip6 nexthdr ipv6-icmp accept
                udp dport 0-65535 ct state new jump UDP
                tcp dport 0-65535 tcp flags & (fin | syn | rst | ack) == syn ct state new jump TCP
                udp dport 0-65535 log prefix "UDP reject: " reject
                tcp dport 0-65535 log prefix "TCP reject: " reject with tcp reset
                ip protocol != { tcp, udp, icmp } log prefix "Other IPv4 reject: " reject with icmp type prot-unreachable
                log prefix "Other reject: " reject with icmpx type admin-prohibited
        }

        chain forward {
                type filter hook forward priority 0; policy drop;
        meta l4proto tcp tcp flags & (syn|rst) == syn counter packets 53 bytes 3072 tcp option maxseg size set rt mtu
                ct state established,related accept
                ct state invalid log prefix "Invalid forward packet: " drop
        #vlan
        iifname "VLAN" ip saddr VM_VLAN_SUBNET accept
        #VM1
            oifname "VLAN" ip daddr VM1_VLAN_IP tcp dport { SOME_OPEN_PORTS } accept
    #VM2
          oifname "VLAN" ip daddr VM2_VLAN_IP tcp dport { SOME_OPEN_PORTS } accept
    #VM3
          oifname "VLAN" ip daddr VM3_VLAN_IP tcp dport { SOME_OPEN_PORTS } accept
          log prefix "Other forward reject: " reject with icmpx type host-unreachable
        }

        chain output {
                type filter hook output priority 0; policy accept;
        }

        chain UDP {
                        #some services

        }

        chain TCP {
                        #some services
        }
}

# NAT
table ip nat {
        chain prerouting {
                type nat hook prerouting priority 0; policy accept;
                #VM1
        ip daddr { IP1 } tcp dport { SOME_OPEN_PORTS } dnat VM1_VLAN_IP
                #VM2
        ip daddr { IP2 } tcp dport { SOME_OPEN_PORTS } dnat VM2_VLAN_IP
                #VM3
        ip daddr { IP3 } tcp dport { SOME_OPEN_PORTS } dnat VM3_VLAN_IP
        }

        chain postrouting {
                type nat hook postrouting priority 100; policy accept;
                #VM1
        ip saddr VM1_VLAN_IP oifname "PPP1" snat IP1
                #VM2
        ip saddr VM2_VLAN_IP oifname "PPP2" snat IP2
                #VM3
        ip saddr VM3_VLAN_IP oifname "PPP3" snat IP3
        }
}

相关内容