У меня довольно сложная настройка сети, но я также новичок в маршрутизации и подобных темах.
Мой интернет-провайдер предоставляет несколько статических 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
}
}