У меня довольно сложная настройка сети, но я также новичок в маршрутизации и подобных темах.
Мой провайдер предоставляет несколько статических IP-адресов через PPPoE, назовем их IP0, IP1, IP2, IP3 и так далее. IP0 назначается маршрутизатору и предоставляется всей локальной сети, а также моему хосту через интерфейс INT1.
На другом интерфейсе на этом хосте INT2 существует отдельное соединение с модемом. Через INT2 я могу получить отдельные соединения PPP с IP1, IP2, IP3, но я также получаю новые виртуальные интерфейсы PPP1, PPP2, PPP3.
Мне удалось создать необходимые таблицы маршрутизации и правила маршрутизации, чтобы я мог использовать все 4 ext IP на этом хосте, а также назначать ext IP для виртуальных машин, работающих на этом хосте. Например, в Интернете мой хост отображается как IP0, VM1 - как IP2, VM2 - как IP2, а VM3 - как IP3. Я могу подключиться ко всем 4 из них с внешних хостов через правильный IP-адрес.
Есть одна вещь, которая не работает. Я не могу подключиться с VM1 к сервисам на VM2 и VM3 через WAN. Начиная с VM1, 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
}
}