Amazon Linux-iptables NAT 规则与 GRE 流量不匹配

Amazon Linux-iptables NAT 规则与 GRE 流量不匹配

我正在尝试在 AWS VPC/EC2 中制作一些原型,但无法使 NAT 规则正常工作。我有以下设置(所有实例都运行 Amazon Linux AMI):

  • 实例 10.0.0.10 和 10.1.0.10 之间的 GRE 隧道
  • 实例 10.0.0.10 使用 10.0.1.20 作为 10.1.0.10 的网关
  • 我希望 10.0.1.20 伪装来自 10.0.0.10 的流量

除了 GRE 流量以外,NAT 似乎都可以按预期工作:

10.0.0.10] ping -c 1 10.1.0.10

在网关(10.0.1.20)上,tcpdump 显示这正在按预期进行 NAT:

10.0.1.20] tcpdump -i eth0
IP 10.0.0.10 > 10.1.0.10: ICMP echo request, id 30493, seq 1, length 64
IP 10.0.1.20 > 10.1.0.10: ICMP echo request, id 30493, seq 1, length 64

但是,如果我对 GRE 隧道内部进行 ping 操作,流量就会被转发,而无需进行 NAT:

10.0.0.10] ping -c 1 10.2.0.10 # 10.2/16 is routed through the GRE tunnel
------
10.0.1.20] tcpdump -i eth0
IP 10.0.0.10 > 10.1.0.10: GREv0, length 88: IP 10.0.0.10 > 10.2.0.10: ICMP echo request, id 30237, seq 1, length 64
IP 10.0.0.10 > 10.1.0.10: GREv0, length 88: IP 10.0.0.10 > 10.2.0.10: ICMP echo request, id 30237, seq 1, length 64

我的 iptable 规则非常简单;只有一条 NAT POSTROUTING 规则:

10.0.1.20] sudo iptables -v -t nat -L POSTROUTING
Chain POSTROUTING (policy ACCEPT 6 packets, 411 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  all  --  any    any     10.0.0.10            10.1.0.10

查看 iptables 数据包计数器,当我在 GRE 隧道外 ping 时,我可以看到 NAT 前/后路由计数器与过滤表的转发计数器一起递增。当我通过 GRE 隧道 ping 时,我只看到过滤转发计数器递增。同样,连接跟踪-L显示外部 ping 的条目,但没有显示内部 ping 的条目。

答案1

经过几个小时的谷歌搜索,我终于找到了答案:
PPTP/GRE 多转发 NAT IPTables 示例

我只需要安装以下内核模块:

sudo modprobe ip_gre
sudo modprobe nf_nat_proto_gre
sudo modprobe nf_conntrack_proto_gre

nf_conntrack_proto_gre是使 NAT 工作所需的唯一模块,但为了安全起见,我还安装了另外两个模块。

相关内容