我正在尝试锁定一个 Amazon EC2 实例,该实例有一个用于 Amazon SNS 的开放端口。我无法使用安全组来限制端口,因为 IP 是不断变化的,因此必须对那里的所有人开放,然后使用 IPtables 进行保护。
我需要做的就是断开除本地之外的所有端口连接,然后接受来自 SNS 端点的连接,例如 sns.us-west-1.amazonaws.com
例如。
#!/bin/bash
# Deny all except localhost on 8080
iptables -A INPUT ! -s 127.0.0.1 -p tcp -m tcp --dport 8080 -j DROP
# Run every 5 minutes and whitelist resolved AWS SNS IP
iptables -I INPUT -p tcp -s sns.us-west-1.amazonaws.com --dport 8080 -j ACCEPT
问题在于 sns 端点“sns.us-west-1.amazonaws.com”正在定期更改 IP。
如果我运行该 iptables 规则,它会为不断变化中的新 IP 添加一条 ACCEPT 规则。据我所知,亚马逊不免费提供此 IP 列表。
如果我可以让 IPtables 专门从端点允许,例如“sns.us-west-1.amazonaws.com”,那么就没问题了,但据我所知,这是不可能的,因为它总是将规则解析为 IP。
我能想到的唯一解决方法是每隔几分钟运行一次 cron,将端点和它解析到的任何 IP 列入白名单,而不是维护一个来自亚马逊的 SNS IP 范围的公共列表,以供查询和列入白名单。
这引发了 iptables 的 -I 或 -A 和 -C 标志的问题。第一次运行时我无法运行 -C,因为它找不到任何内容并且出现错误。我无法运行 -I,因为每次遇到重复的 IP 时它都会添加。
我该如何执行以下操作:
1)始终有 DENY 规则:iptables -A INPUT !-s 127.0.0.1 -p tcp -m tcp --dport 8080 -j DROP
2)添加一条规则,允许 8080 上的源“sns.ap-southeast-2.amazonaws.com”,但首先检查当时解析的 IP 是否存在匹配的规则。