我在两个节点 A(172.31.17.22)和 B(172.31.16.9)之间启用了数据包转发,但数据包未被转发,节点 B 上的 tcpdump 没有显示任何不发往其自身的流量:ping 172.31.16.9 -c 1(直接从 A 到 B)
A 上的 Tcpdump(tcpdump -e icmp -I eth0):
0e:34:43:04:5c:8c(是 未知) >0e:b8:b3:ed:48:10(oui 未知),以太网类型 IPv4 (0x0800),长度 98:ip-172-31-17-22.ec2.internal > ip-172-31-16-9.ec2.internal:ICMP 回显请求,id 28945,seq 1,长度 64
0e:b8:b3:ed:48:10(是 未知) >0e:34:43:04:5c:8c(oui 未知),以太网类型 IPv4 (0x0800),长度 98:ip-172-31-16-9.ec2.internal > ip-172-31-17-22.ec2.internal:ICMP 回显答复,id 28945,seq 1,长度 64
在 B 上:
0e:34:43:04:5c:8c(是 未知) >0e:b8:b3:ed:48:10(oui 未知),以太网类型 IPv4 (0x0800),长度 98:ip-172-31-17-22.ec2.internal > ip-172-31-16-9.ec2.internal:ICMP 回显请求,id 28945,seq 1,长度 64
0e:b8:b3:ed:48:10(是 未知) >0e:34:43:04:5c:8c(oui 未知),以太网类型 IPv4 (0x0800),长度 98:ip-172-31-16-9.ec2.internal > ip-172-31-17-22.ec2.internal:ICMP 回显答复,id 28945,seq 1,长度 64
现在,如果我想将数据包从 A 转发到 B,再转发到 C,我会在 A 上设置一条路由,以便发往 C 的数据包首先发送到 B。因此,我在 A 上设置了一条路由,其中 C=15.15.15.15。然后尝试 ping:
sudo ip route add 15.15.15.15/32 via 192.168.7.234
Ping 15.15.15.15 -c 1
A 上的 Tcpdump:
0e:34:43:04:5c:8c(是 未知) >0e:b8:b3:ed:48:10(oui 未知),以太网类型 IPv4 (0x0800),长度 98:ip-172-31-17-22.ec2.internal > 15.15.15.15:ICMP 回显请求,id 28970,seq 1,长度 64
在 B 上,我们什么也看不到。这真的很奇怪,因为我们可以从 tcpdump 中看到以太网地址完全相同。此外,我在自己的网络上使用另外两个 Linux 节点运行了此测试,可以看到从 B 上,我们应该期望看到如下内容:
… IPv4 (0x0800),长度 98:192.168.7.173 > 15.15.15.15:ICMP 回显请求,ID 17443,序号 1,长度 64 … IPv4 (0x0800),长度 118:192.168.7.254 > 192.168.7.154:ICMP 192.168.7.254 udp 端口 ntp 不可达,长度 84
在 AWS 上,我有一条规则允许来自任何地方的 ICMP 连接...此外,我在两个节点上都设置了 /etc/sysctl.conf:
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
我刷新了我的 iptables 规则(在两个节点上),以便允许转发:
[root@ip-172-31-16-9 ec2-用户]# iptables -L
链输入(策略接受)目标保护选择源
目标链转发(策略接受)目标保护选择源
目标链输出(策略接受)目标保护选择源
目标
因此,我的结果是,它可以在我的 LAN 上运行,但在 AWS EC2 上却不运行...那么 EC2 会阻止 IP 转发吗?
答案1
每个 EC2 实例默认执行源/目标检查。这意味着实例必须是其发送或接收的任何流量的源或目标。但是,当源或目标不是其自身时,NAT 实例必须能够发送和接收流量。因此,您必须禁用 NAT 实例上的源/目标检查。https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html#EIP_Disable_SrcDestCheck
要从 AWS CLI 禁用源/目标检查:
aws ec2 modify-instance-attribute --instance-id <instance_id> \
--no-source-dest-check
要从EC2
服务控制台禁用源/目标检查,请突出显示要禁用检查的实例。
然后选择:
- 操作
- 联网
- 更改来源/目标检查
在弹出窗口中选择是的,禁用