我正在尝试使用 Ubuntu 盒子作为我的 LAN 的网关。这是我的设置:
- Ubuntu 网关
- ens3:WAN 10.0.10.163 网络掩码 255.255.255.224
- ens4:LAN 10.0.10.231 网络掩码 255.255.255.224
- Ubuntu 客户端
- ens3:LAN 10.0.10.238 网络掩码 255.255.255.224
net.ipv4.conf.ip_forward
已在 Ubuntu 网关上启用。以下是网关上已实施的 iptables 规则:
iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
iptables -A FORWARD -i ens4 -j ACCEPT
网关的路由表:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.10.161 0.0.0.0 UG 0 0 0 ens3
10.0.10.160 0.0.0.0 255.255.255.224 U 0 0 0 ens3
10.0.10.224 0.0.0.0 255.255.255.224 U 0 0 0 ens4
169.254.169.254 10.0.10.161 255.255.255.255 UGH 0 0 0 ens3
客户端的路由表:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.10.231 0.0.0.0 UG 0 0 0 ens3
10.0.10.224 0.0.0.0 255.255.255.224 U 100 0 0 ens3
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 ens3
169.254.169.254 10.0.10.225 255.255.255.255 UGH 100 0 0 ens3
两台机器都可以互相 ping 通,因此它们之间的 LAN 连接没有问题。但是,如果我尝试从客户端 ping 8.8.8.8,它会显示 100% 的数据包丢失,并且 LAN 接口上的 tcpdump 没有显示 ping 响应。但是,如果我在网关上执行 tcpdump,它会显示来自客户端的回显请求和回显响应:
user@snort-id:~$ sudo tcpdump -i ens4 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens4, link-type EN10MB (Ethernet), capture size 262144 bytes
13:33:08.503943 IP 10.0.10.238 > google-public-dns-a.google.com: ICMP echo request, id 4424, seq 1, length 64
13:33:08.507787 IP google-public-dns-a.google.com > 10.0.10.238: ICMP echo reply, id 4424, seq 1, length 64
13:33:09.526402 IP 10.0.10.238 > google-public-dns-a.google.com: ICMP echo request, id 4424, seq 2, length 64
13:33:09.530203 IP google-public-dns-a.google.com > 10.0.10.238: ICMP echo reply, id 4424, seq 2, length 64
13:33:10.551124 IP 10.0.10.238 > google-public-dns-a.google.com: ICMP echo request, id 4424, seq 3, length 64
13:33:10.554807 IP google-public-dns-a.google.com > 10.0.10.238: ICMP echo reply, id 4424, seq 3, length 64
因此,仅从 tcpdump 来看,转发似乎正在工作。但是,客户端没有收到任何响应。我不确定这是否重要,但网关和客户端都在 OpenStack 上运行。
非常感谢任何对此提供的帮助。
编辑:根据要求:
网关的 Iptables 输出:
user@snort-id:~$ sudo iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 541 packets, 37916 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 9 packets, 840 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 43 packets, 33087 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 23 packets, 31668 bytes)
pkts bytes target prot opt in out source destination
493 31309 MASQUERADE all -- * ens3 0.0.0.0/0 0.0.0.0/0
user@snort-id:~$ sudo iptables -vnL
Chain INPUT (policy ACCEPT 1938 packets, 132K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 1754 packets, 238K bytes)
pkts bytes target prot opt in out source destination
1754 110K ACCEPT all -- ens4 * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 1250 packets, 168K bytes)
pkts bytes target prot opt in out source destination
两者在客户端iptables -t nat -vnL
均不显示任何规则。iptables -vnL
答案1
好吧,看来我错了,OpenStack(在我的情况下是 Devstack)不会导致问题。默认情况下,Devstack 使用一些反 IP 和 MAC 欺骗措施。为此,它在 Devstack 主机上创建 iptables 规则,导致从网关到客户端的响应数据包被丢弃。为了解决这个问题,我在 Devstack 中添加了以下几行local.conf
Q_USE_SECGROUP=False
[[post-config|$NOVA_CONF]]
[DEFAULT]
security_group_api=nova
firewall_driver=nova.virt.firewall.NoopFirewallDriver
请注意,这实际上会禁用整个防火墙。