我将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
请求数据。我在问,所以我知道如何打开正确的端口。当前由于端口是如此随机,我需要打开所有内容
答案 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级别中,我应该允许所有临时端口范围吗?
在实践中,要涵盖可能会启动到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配置了动态端口映射。它具有从49153
到65535
的默认临时端口范围,并且通常,32768
以下的端口不在临时端口范围内,因此TCP连接中主机端口的随机性。您确实有较低的端口值,但这一定是由于您的实例配置(ip_local_port_range
的默认值通常在大多数情况下是32768 - 61000
)
请从here阅读有关如何配置它的详细信息,并且可以在here
中找到设置端口设置的确切点。可以使用以下任一方法配置或设置单个端口 单个端口实现所有连接,或通过以下方式编辑端口范围
/proc/sys/net/ipv4/ip_local_port_range
,但不建议使用 偏离默认范围。