为什么从ECR中提取AWS ECS应用程序需要“怪异” TCP端口?

时间:2018-09-24 14:27:47

标签: amazon-web-services docker acl amazon-ecs vpc

我将ECS与NLB一起使用。 ECS正在从ECR中提取图像。我不明白的是,为什么ECS要求我打开所有TCP端口才能从ECR中拉出?

2 621567429603 eni-0f5e97a3c2d51a5db 18.136.60.252 10.0.12.61 443 55584 6 13 6504 1537798711 1537798719 ACCEPT OK
2 621567429603 eni-0f5e97a3c2d51a5db 10.0.12.61 54.255.143.131 44920 443 6 13 5274 1537798711 1537798719 ACCEPT OK
2 621567429603 eni-0f5e97a3c2d51a5db 54.255.143.131 10.0.12.61 443 44952 6 13 6504 1537798711 1537798719 ACCEPT OK
2 621567429603 eni-0f5e97a3c2d51a5db 10.0.12.61 18.136.60.252 55584 443 6 15 5378 1537798711 1537798719 ACCEPT OK
2 621567429603 eni-0f5e97a3c2d51a5db 10.0.12.61 18.136.60.252 55612 443 6 15 5378 1537798711 1537798719 ACCEPT OK
2 621567429603 eni-0f5e97a3c2d51a5db 52.219.36.183 10.0.12.61 443 51892 6 19 11424 1537798711 1537798719 ACCEPT OK
2 621567429603 eni-0f5e97a3c2d51a5db 10.0.12.61 54.255.143.131 44908 443 6 14 1355 1537798711 1537798719 ACCEPT OK
2 621567429603 eni-0f5e97a3c2d51a5db 52.219.36.183 10.0.12.61 443 51912 6 31807 44085790 1537798711 1537798719 ACCEPT OK
2 621567429603 eni-0f5e97a3c2d51a5db 18.136.60.252 10.0.12.61 443 55612 6 12 6452 1537798711 1537798719 ACCEPT OK

我的流程记录在上面。 10.0.0.0/8是我的VPC专用地址。请注意,第一次说SRC:18.136.60.252:443正在访问10.0.12.61:55584为何是此目标端口?

然后下一行2 621567429603 eni-0f5e97a3c2d51a5db 10.0.12.61 54.255.143.131 44920 443 6 13 5274 1537798711 1537798719 ACCEPT OK。为什么我的ECS使用源端口44920请求数据。我在问,所以我知道如何打开正确的端口。当前由于端口是如此随机,我需要打开所有内容

3 个答案:

答案 0 :(得分:6)

当它说18.136.60.252:443 is accessing 10.0.12.61:55584时,我不会说 18.136.60.252 正在“访问”您的本地VPC IP。我想说的是,“ 18.136.60.252”正在通过已经建立的TCP连接(由ecs-agent发起)向本地VPC IP发送响应,该响应由操作系统分配给随机SRC端口以建立TCP通信(55584)在您的实例中)。

您不需要集中精力应该允许哪个源端口。您宁愿告诉OS(防火墙)“让响应进入已建立的连接”。在iptables中是这样的:

从实例到网络,以访问远程443端口:

iptables -A OUTPUT -o eth0 -p tcp -m multiport --dports 80,443 -j ACCEPT

从远程主机到您的实例,让响应返回:

iptables -A INPUT -i eth0 -p tcp -m multiport --sports 80,443 -m state --state RELATED,ESTABLISHED -j ACCEPT
.                                               ^ source port          ^ the rule only applies to already established connections

在这里您可以找到一些更好的解释:

https://unix.stackexchange.com/q/323546/18256

https://superuser.com/a/1171322/131073

  

为什么我的ECS使用源端口44920请求数据

操作系统是将这些端口分配给ECS代理以用作源端口的操作系统,它只是一个随机选择的免费端口。


通过OP和自学澄清后进行编辑

  

因此,在AWS NACL级别中,我应该允许所有临时端口范围吗?

根据AWS NACL docs

  

在实践中,要涵盖可能会启动到VPC中面向公众的实例的流量的不同类型的客户端,您可以打开临时端口1024-65535。但是,您也可以向ACL添加规则,以拒绝该范围内任何恶意端口上的流量。确保将DENY规则放在表中的位置早于打开广泛的临时端口的ALLOW规则。

但是要考虑到:

  

您可以使用与安全组类似的规则设置网络ACL,以便为VPC添加附加的安全层。 (强调我的)

  

在OS级别上可以吗?如果我使用的是docker,我需要通过Dockerfile做到吗?

我的建议是通过安全组进行管理,因为它们是“有状态的”,这意味着它们可以跟踪建立的每个连接,自动允许对临时端口的“响应”,而无需配置这些规则。例如,您可以“拒绝”所有入站流量,并允许TCP 443用于出站流量。这不是不是,这意味着响应无法到达临时端口,它们确实可以(尽管拒绝所有入站流量),因为安全组会记住连接。查看更多信息here

  

安全组:有状态:无论任何规则,都会自动允许返回流量

     

网络ACL:无状态:规则中必须明确允许回程流量 <-这是在回答上一个有关临时端口的问题

关于操作系统和iptables,我将首先探讨安全性组,至少对于当前用例而言,这些安全性组易于配置和维护。

答案 1 :(得分:2)

我只是根据ECS出站网络经验在此添加我的想法。您的ECS EC2具有正在运行的ecs-agent,该代理正在与ECS和CloudWatch API持续进行交互。 ecs-agent会不断通知EC2主机状态,docker容器正在运行并将代理日志发送到上述API。

ecs-agent进程正在特定的时间间隔内与上述AWS API(443)进行交互,这就是源端口不断变化的原因。这是我的EC2服务器netstat日志的输出。

命令-netstat -tcp

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 ip-172-31-86-188.:47364 52.46.132.80:https      ESTABLISHED 4188/agent          
tcp        0      0 ip-172-31-86-188.:57190 52.46.132.44:https      ESTABLISHED 4188/agent 

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 ip-172-31-86-188.:57190 52.46.132.44:https      ESTABLISHED 4188/agent          
tcp        0      0 ip-172-31-86-188.:60646 52.46.128.101:https     ESTABLISHED 4188/agent    

要从ECR中提取图像,您的EC2仅需要ECR端点的443端口。所有其他流量都是与ecs-agent有关的集群维护。让我知道您根据您的EC2 TCP日志以及哪个进程负责的想法。

答案 2 :(得分:2)

必须为ECS配置了动态端口映射。它具有从4915365535的默认临时端口范围,并且通常,32768以下的端口不在临时端口范围内,因此TCP连接中主机端口的随机性。您确实有较低的端口值,但这一定是由于您的实例配置(ip_local_port_range的默认值通常在大多数情况下是32768 - 61000

请从here阅读有关如何配置它的详细信息,并且可以在here

中找到设置端口设置的确切点。
  

可以使用以下任一方法配置或设置单个端口   单个端口实现所有连接,或通过以下方式编辑端口范围   /proc/sys/net/ipv4/ip_local_port_range,但不建议使用   偏离默认范围。