简短问题:
我正在尝试在 AWS 上配置自己的 NAT 实例,从标准 AWS Linux 2 实例开始,似乎新的“正确”配置方法是使用防火墙而不是 iptables,所以我正在寻找与以下答案等效的答案这个问题,但使用firewalld。
更长的描述:
我 99% 确定我的 VPC、子网和路由表配置正确。在 ec2 实例上,我启用了 IP4 转发、禁用了 ICMP 转发并禁用了源/目标检查。
我相信我唯一缺少的步骤是旧的社区 NAT 实例 AMI 在启动时运行一个脚本来执行此操作:
(iptables -t nat -C POSTROUTING -o eth0 -s ${VPC_CIDR_RANGE} -j MASQUERADE 2> /dev/null ||
iptables -t nat -A POSTROUTING -o eth0 -s ${VPC_CIDR_RANGE} -j MASQUERADE ) ||
die
基于本指南,我试图用firewalld复制相同的功能,我已经完成了
firewall-cmd --zone=internal --add-source=10.0.4.0/22
firewall-cmd --zone=external --add-interface=eth0
firewall-cmd --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth0 -j MASQUERADE -s 10.0.4.0/22
我也尝试过出于ping
测试目的,
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p icmp -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
我可以成功 ssh 到 NAT 实例,可以从它 ping 外部世界,也可以从私有子网 ping 它,但我无法从私有子网 ping 外部世界。我怀疑我对当只有一个 PHY(eth0)时防火墙的工作方式的理解有问题,但是......我被卡住了。所以,
a) 我的基本假设是我应该使用firewalld而不是iptables,这是否正确?b) 如果是这样,我如何让NAT在单个接口上与它一起工作?
谢谢!
答案1
在 EC2 上,除了正确的 iptable/nftable 设置之外,还需要确保在 EC2 级别禁用源目标检查。
https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html#EIP_Disable_SrcDestCheck