ICMP 请求未被 NAT 实例转发

问题描述 投票:0回答:1

我正在 AWS EC2 上设置 NAT 实例。 我从 fck-nat 一个旨在取代默认 nat-gateway 的项目中获得灵感。

到目前为止,我有两个工作实例,每个实例都位于单独的子网中。 一个实例具有公共 IP 并连接到互联网网关。 另一个位于“私有”子网中,路由到第一个实例。

我可以从 nat-instance ping 1.1.1.1(这是我用于测试的地址)。 我可以从私有子网 ping nat-instance。

但是转发似乎不起作用,我遵循了上述脚本以及aws文档nat实例中的说明(相当不推荐使用)。

我确定:

  1. 路由工作正常(貌似是这样)
  2. 我在上述文件中使用
    sysctl -p file_name
    net.ipv4.ip_forward=1
    允许 ip 转发。
  3. 使用
    iptables -t nat -A POSTROUTING -o ens5 -j MASQUERADE
  4. 禁用 nat-instance 上的源/目标。

我怀疑是安全组,但从 nat-instance 执行 ping 操作正常,并且对私有实例应用相同的安全性并不能解决问题。

我怀疑我不知道的底层安全性,或者我的 nat 设置不完整。

根据我获取的一些日志,显示了我在 nat 实例上从 tcpdump 获得的内容。

  • XX.XX.AA.AA
    将是 nat 实例的 IP。
  • XX.XX.AA
    将是 nat-instance 子网的网络。
  • XX.XX.BB.BB
    将是私有子网中实例的 IP。
  • XX.XX.BB
    将是私有子集的网络。
[user_name@ip-XX-XX-AA-AA ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 06:1e:58:67:bb:a9 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-033f1bdf14d0a2f0a
    altname device-number-0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 02:42:f5:9d:a2:cf brd ff:ff:ff:ff:ff:ff
[user_name@ip-XX-XX-AA-AA ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  anywhere             anywhere             tcp dpt:51678
DROP       all  -- !127.0.0.0/8          127.0.0.0/8          ! ctstate RELATED,ESTABLISHED,DNAT
DROP       tcp  --  anywhere             anywhere             tcp dpt:51678
DROP       all  -- !127.0.0.0/8          127.0.0.0/8          ! ctstate RELATED,ESTABLISHED,DNAT

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (1 references)
target     prot opt source               destination         

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere
[user_name@ip-XX-XX-AA-AA ~]# tcpdump -n net XX.XX.BB
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ens5, link-type EN10MB (Ethernet), snapshot length 262144 bytes
09:50:12.566281 IP XX.XX.BB.BB > 1.1.1.1: ICMP echo request, id 7, seq 4, length 64
09:50:13.606290 IP XX.XX.BB.BB > 1.1.1.1: ICMP echo request, id 7, seq 5, length 64
09:50:14.646280 IP XX.XX.BB.BB > 1.1.1.1: ICMP echo request, id 7, seq 6, length 64

--- 编辑 --- 添加

tracepath
所需的输出以及驻留在私有子网中的实例的路由表。

[user_name@ip-XX-XX-BB-BB ~]# tracepath 1.1.1.1
 1?: [LOCALHOST]                      pmtu 9001
 1:  XX.XX.AA.AA                                           0.986ms asymm  2 
 1:  XX.XX.AA.AA                                           0.883ms asymm  2 
 2:  no reply
 3:  no reply
[user_name@ip-XX-XX-BB-BB ~]# ip route
default via XX.BB.BB.1 dev ens5 proto dhcp src XX.XX.BB.BB metric 512 
XX.XX.0.2 via XX.XX.BB.1 dev ens5 proto dhcp src XX.XX.BB.BB metric 512 
XX.XX.BB.0/24 dev ens5 proto kernel scope link src XX.XX.BB.BB metric 512 
XX.XX.BB.1 dev ens5 proto dhcp scope link src XX.XX.BB.BB metric 512 
10.42.0.0/24 dev cni0 proto kernel scope link src 10.42.0.1 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown

如果路由表看起来不正确,我会使用 AWS 路由表并将 nat-instance 指定为

0.0.0.0/0
的网关 像这样:

amazon-web-services amazon-ec2 iptables nat
1个回答
0
投票

在调查和阅读一些帖子后,我发现我忘记允许数据包通过:

  • iptables -A FORWARD -i ens5 -o ens5 -m state --state RELATED,ESTABLISHED -j ACCEPT
  • iptables -A FORWARD -i ens5 -o ens5 -j ACCEPT

添加执行这些命令后,私有子网内的实例会收到 ping 响应,并且使用

config.io
tracepath
进行快速检查表明它正在使用来自 nat 实例的公共 IP。

© www.soinside.com 2019 - 2024. All rights reserved.