我正在尝试在 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 工作所需的唯一模块,但为了安全起见,我还安装了另外两个模块。