Назад | Перейти на главную страницу

Как подключиться из одной глобальной сети к другой на одной машине и в сети виртуальных машин?

У меня довольно сложная настройка сети, но я также новичок в маршрутизации и подобных темах.

Мой интернет-провайдер предоставляет несколько статических IP-адресов через PPPoE, назовем их IP0, IP1, IP2, IP3 и так далее. IP0 назначается маршрутизатору и предоставляется всей локальной сети, а также моему хосту через интерфейс INT1.

На другом интерфейсе на этом хосте INT2 есть отдельное соединение с модемом. Через INT2 я могу получить отдельные PPP-соединения с IP1, IP2, IP3, но я также получаю новые виртуальные интерфейсы PPP1, PPP2, PPP3.

Мне удалось создать необходимые таблицы маршрутизации и правила маршрутизации, поэтому я могу использовать все 4 внешних IP-адреса на этом хосте, а также назначить внешний IP-адрес виртуальным машинам, работающим на этом хосте. Например, мой хост отображается в Интернете как IP0, VM1 как IP2, VM2 как IP2, а VM3 как IP3. Я могу подключиться ко всем 4 из них с внешних хостов через правильные IP-адреса.

Есть одна вещь, которая не работает. Я не могу подключиться с ВМ1 к службам на ВМ2 и ВМ3 через WAN. С ВМ1, IP2 и IP3 не пингуются, и нет подключения к каким-либо службам. То же самое для VM2 и VM3. На хосте я также не могу пинговать IP2 и IP3 через PPP1 или в любой другой комбинации.

Я могу обойти проблему, заменив внешние IP-адреса служб внутренним 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
        }
}