![将所有流量从虚拟 IP 转发到局域网内的虚拟机](https://linux22.com/image/720147/%E5%B0%86%E6%89%80%E6%9C%89%E6%B5%81%E9%87%8F%E4%BB%8E%E8%99%9A%E6%8B%9F%20IP%20%E8%BD%AC%E5%8F%91%E5%88%B0%E5%B1%80%E5%9F%9F%E7%BD%91%E5%86%85%E7%9A%84%E8%99%9A%E6%8B%9F%E6%9C%BA.png)
我正在尝试设置特定的 NAT,但在这里有点卡住了。
我的设置如下:
- 3 个专用网卡,每个网卡运行几个虚拟机,与子网 10.100.0.0/16 中的 tinc 互连
- 1 个 VPS 带有 2 个网卡,其中 1 个网卡带有一个公网 IP,第二个网卡带有大量公网 IP(至少 25 个),此 VPS 还通过 Tinc 与同一子网 10.100.0.0/16 中的专用服务器相连
VM 完全能够访问专用服务器和 vps,并且专用服务器和 vps 对 VM 也完全能够访问。
专用 1:10.100.0.10 专用 1:10.100.0.20 专用 1:10.100.0.30 VM 1:10.100.2.3 VM 2:10.100.2.4 VM 3:10.100.2.5 VPS:10.100.0.101
所有虚拟机都使用 VPS IP 作为网关,如下所示:
root@test-ubuntu:~# ip a l dev ens3
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:c1:fa:f5 brd ff:ff:ff:ff:ff:ff
inet 10.100.2.3/16 brd 10.100.255.255 scope global ens3
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fec1:faf5/64 scope link
valid_lft forever preferred_lft forever
root@test-ubuntu:~# ip r s dev ens3
default via 10.100.0.101
10.100.0.0/16 proto kernel scope link src 10.100.2.3
169.254.169.254 via 10.100.2.1
问题是我想使用此 VPS 上的所有公共 IP 直接访问 VM。我知道我必须进行一些 nat,但在测试了几个小时不同的方法并阅读了文档后,我承认我完全陷入了困境。
root@network1:~# ip a l dev ens3
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:86:e6:a1 brd ff:ff:ff:ff:ff:ff
inet 145.YYY.XXX.60/32 brd 145.YYY.XXX.60 scope global ens3
valid_lft forever preferred_lft forever
root@network1:~# ip a l dev ens6
3: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:78:93:e1 brd ff:ff:ff:ff:ff:ff
inet 147.AAA.BBB.97/27 brd 147.AAA.BBB.127 scope global ens6
valid_lft forever preferred_lft forever
inet 147.AAA.BBB.98/27 brd 147.AAA.BBB.127 scope global secondary ens6:1
valid_lft forever preferred_lft forever
inet 147.AAA.BBB.99/27 brd 147.AAA.BBB.127 scope global secondary ens6:2
valid_lft forever preferred_lft forever
[....]
inet 147.AAA.BBB.124/27 brd 147.AAA.BBB.127 scope global secondary ens6:27
valid_lft forever preferred_lft forever
inet 147.AAA.BBB.125/27 brd 147.AAA.BBB.127 scope global secondary ens6:28
valid_lft forever preferred_lft forever
目前,我的规则是空的(我只显示 nat 表,但对于通用表来说它是相同的):
root@haproxy-1:~# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 96 packets, 3096 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 96 packets, 3096 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
因为我的目标是将到达一个 IP(假设为 147.AAA.BBB.98)的所有流量重定向到具有 IP 10.100.2.3 的 VM,所以我想到了这一点:
VM 外部:
iptables -t nat -A PREROUTING -d 147.AAA.BBB.98 -j DNAT --to-destination 10.100.2.3
Vm 至外部:
iptables -t nat -I POSTROUTING -s 10.100.2.3 -j SNAT --to-source 147.AAA.BBB.98
VPS 上当然启用了 Ipforward
但它不起作用:/
如果我在 VPS 上执行一些 Tcpdump,我会看到数据包来自外部,但没有任何东西进入 VM。如果我尝试从 VM ping 外部,我会看到数据包进入 VPS 内部,数据包已发送但未收到任何内容。
但是,如果我使用 VPS 的主 IP(ens3 上的 IP)执行此操作,一切都会按预期进行
我想知道是不是因为 tinc VPN 在接口 ens3 上运行,所以数据包应该从一个接口转发到另一个接口
你知道我该怎么做才能解决这个问题吗?
编辑:第二个接口上的 IP 与主接口上的 IP 不在同一个子网中,所以我不得不使用另一个路由表,我的路由如下所示:
root@haproxy-1:~# ip r s
default via 145.XXX.YYY.1 dev ens3
10.100.0.0/16 dev prov proto kernel scope link src 10.100.0.101
145.XXX.YYY.1 dev ens3 scope link
147.AAA.BBB.96/27 dev ens6 proto kernel scope link src 147.AAA.BBB.97
root@haproxy-1:~# ip r s table 101
default via 147.AAA.BBB.126 dev ens6
谢谢
答案1
我自己回答是因为我找到了一个解决方案(不确定这是否是最好的想法)。
由于两个接口使用不同的GW,我确实使用路由表来使两者正常工作,这没有问题。
规则设置正确:
root@haproxy-1:~# ip rule show
0: from all lookup local
32765: from 147.AAA.BBB.96/27 lookup 101
32766: from all lookup main
32767: from all lookup default
但我不知道的是,我还需要一条规则来告诉来自 10.100.0.0/16 的流量需要使用表 101
所以我添加了这条规则:
ip rule add from 10.100.2.0/16 lookup 101
我的表格现在如下所示:
root@haproxy-1:~# ip rule show
0: from all lookup local
32764: from 10.100.2.0/16 lookup 101
32765: from 147.AAA.BBB.96/27 lookup 101
32766: from all lookup main
32767: from all lookup default
并且流量完美地路由到虚拟机并从虚拟机路由到外部。如果我对转发到虚拟机的 IP (147.AAA.BBB.98) 执行 nmap,我只会看到虚拟机的开放端口,而看不到 VPS 的某个端口。
请注意,我确实使用了这个解释来解决我的问题: http://www.rjsystems.nl/en/2100-adv-routing.php
无论如何,它现在按我想要的方式工作了