![通过 NAT 的虚拟网关](https://linux22.com/image/189985/%E9%80%9A%E8%BF%87%20NAT%20%E7%9A%84%E8%99%9A%E6%8B%9F%E7%BD%91%E5%85%B3.png)
我有以下网络设置:
网关:
Internet <-- eth0 : a.b.c.d (static address)
Clients <-- eth1 : DHCP at server at 172.16.0.1, leasing 172.16.0.0/24
客户:
Gateway <-- eth0: 172.16.0.0/24
客户端可以访问互联网并且转发正常。我想创建某种“虚拟”地址,客户端可以通过网关访问该地址,但该地址实际上是互联网上的某些机器。
因此,当他们连接时,172.32.1.1
他们实际上连接到谷歌等。我用NAT尝试过:
TARGET=$(dig -q google.com)
VIRTUAL=172.32.1.1
iptables -t nat -A PREROUTING -d "$VIRTUAL" -j DNAT --to "$TARGET"
iptables -t nat -A POSTROUTING -s "$TARGET" -j SNAT --to "$VIRTUAL"
这种方法可行,但是当我从网关 ping 它时,我得到了
From 20.249.x.y icmp_seq=1 Destination Net Unreachable
(其中 20.249.xy 是我的网关的网关),当我从客户端跟踪到该虚拟 IP 时,我得到以下信息:
traceroute to 172.32.1.1 (172.32.1.1), 30 hops max, 38 byte packets
1 172.32.1.1 (172.32.1.1) 31.886 ms 31.638 ms 34.029 ms
2 172.32.1.1 (172.32.1.1) 39.660 ms 40.489 ms 39.153 ms
3 172.32.1.1 (172.32.1.1) 41.879 ms 40.367 ms 40.436 ms
4 172.32.1.1 (172.32.1.1) 47.375 ms 48.200 ms 48.878 ms
5 172.32.1.1 (172.32.1.1) 47.801 ms 47.280 ms 47.405 ms
这对我来说看起来非常奇怪。有办法解决这些问题吗?我试图使用ip tunnel
,但看起来它也需要不同的端设置,这显然是我做不到的。
服务器上的 iptables 配置-A FORWARD -i eth1 -j ACCEPT
仅包含这两个规则。
答案1
您可能想要刷新现有的损坏的 iptables 规则,并从头开始。在充当网关的 Linux 机器上,假设以下条件:
linux网关有两个网卡; eth0 面向 LAN,而 eth1 面向 WAN。
在网关上启用 IP 数据包转发:
$ sudo echo 1 > /proc/sys/net/ipv4/ip_forward
根据我们的测试计划在 eth0 上创建两个测试虚拟 IP (VIP)
$ sudo ifconfig eth0:1 10.1.1.1 netmask 255.255.255.0
$ sudo ifconfig eth0:2 10.8.8.8 netmask 255.255.255.0
按照我们的计划配置 iptables
sudo iptables -t nat -A PREROUTING -d 10.1.1.1 -j DNAT --to 1.1.1.1
sudo iptables -t nat -A PREROUTING -d 10.8.8.8 -j DNAT --to 8.8.8.8
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
在这种情况下,当用户 ping VIP 时10.1.1.1
,将被重定向到 Cloudflare 的1.1.1.1
如果用户 ping VIP,10.8.8.8
他们将被重定向到 Google 的8.8.8.8
10.1.1.1 ---> 1.1.1.1
10.8.8.8 ---> 8.8.8.8
答案2
我尝试使用 NAT [...],它以某种方式工作,但是当我从网关 ping 它时,我得到 [网络无法访问]
顾名思义,PREROUTING 和 POSTROUTING 链仅用于进入网关并路由到外部的数据包。
这尤其意味着它们不适用于源自网关的任何数据包,例如您正在执行的 ping。没有办法解决这个问题,过滤器链这样就很奇怪。但对于您的用例,您只需要来自客户端的 NAT,所以这并不重要。
(顺便说一句,您只需要 DNAT;这将创建一个 CONNTRACK 条目,并且反向 NAT 将自动完成)。