我的网络设置相当复杂,但我对路由和类似主题也是新手。
我的 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
}
}