2 个虚拟机之间的简单 MASQUERADE NAT

2 个虚拟机之间的简单 MASQUERADE NAT

我使用云服务,并尝试在两个虚拟机之间设置 NAT。我从未在这个简单的步骤中遇到过问题,但这次不同,我几乎要放弃了。

第一个虚拟机有两个接口:

eth0      Link encap:Ethernet  HWaddr 00:16:3e:dc:0d:77  
          inet addr:95.141.xx.xx  Bcast:95.141.xx.255  Mask:255.255.254.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:705379 errors:0 dropped:19373 overruns:0 frame:0
          TX packets:495549 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 

eth1      Link encap:Ethernet  HWaddr 00:16:3e:29:27:84  
          inet addr:192.168.100.20  Bcast:192.168.103.255  Mask:255.255.252.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:643381 errors:0 dropped:18631 overruns:0 frame:0
          TX packets:513203 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 

它运行 bind9、varnish 缓存服务器等等。

root@varnish:/etc/bind# nslookup
> server 127.0.0.1
Default server: 127.0.0.1
Address: 127.0.0.1#53
> www.google.com
Server:     127.0.0.1
Address:    127.0.0.1#53
Non-authoritative answer:
Name:   www.google.com
Address: 74.125.225.81

一个简单的 MASQUERADE 的 iptables 使用这个脚本配置:

/sbin/iptables -t nat -F ; /sbin/iptables -F
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -I FORWARD 1 -i eth1 -j ACCEPT
iptables -I FORWARD 1 -o eth0 -j ACCEPT

我可以 ping 通 VM2:

root@varnish:~# ping 192.168.100.18
PING 192.168.100.18 (192.168.100.18) 56(84) bytes of data.
64 bytes from 192.168.100.18: icmp_seq=1 ttl=64 time=0.444 ms

另一边我们有另一个虚拟机,它只有一个接口:

eth0      Link encap:Ethernet  HWaddr 00:16:3e:aa:6f:04  
          inet addr:192.168.100.18  Bcast:192.168.103.255  Mask:255.255.252.0

以及正确的路由表:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.100.20  0.0.0.0         UG    0      0        0 eth0
192.168.100.0   *               255.255.252.0   U     0      0        0 eth0
root@nginx1:~# 

当我尝试从 vm2 ping 世界时:

root@nginx1:~# ping www.google.it
PING www.google.it (74.125.225.87) 56(84) bytes of data.
^C
--- www.google.it ping statistics ---
10 packets transmitted, 0 received, 100% packet loss, time 0ms

并且,vm1 上的 tcpdump 仅显示 DNS 请求,网关 vm 没有收到针对 www.google.it 的 ICMP 请求的数据包(也没有被内核丢弃,保持为 0)。

在 vm2 上,resolv.conf 中的 DNS ip 显然是 192.168.100.20,即 vm1

如果我尝试 ping 网关,情况会有所不同:

root@nginx1:~# ping 192.168.100.20
PING 192.168.100.20 (192.168.100.20) 56(84) bytes of data.
64 bytes from 192.168.100.20: icmp_seq=1 ttl=64 time=0.388 ms
64 bytes from 192.168.100.20: icmp_seq=2 ttl=64 time=0.921 ms

我询问过云托管商是否应用了任何过滤器,他们说这不是他们的错误,并且没有应用任何过滤器。

非常感谢您的帮助。

相关内容