我正在尝试设置通用 iptables 规则,以便将其分发到我的小型 4 节点集群。
我希望所有服务器:
接受端口 22、80、443 上的任何流量
如果源是 127.0.0.1,则为所有流量
或者所有流量的来源都是我的集群中的一台服务器
我想要的任何东西
iptables -F
iptables -A INPUT -p all -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p all -s <SERVER-A> -j ACCEPT
iptables -A INPUT -p all -s <SERVER-B> -j ACCEPT
iptables -A INPUT -p all -s <SERVER-C> -j ACCEPT
iptables -A INPUT -p all -s <SERVER-D> -j ACCEPT
iptables -A INPUT -j DROP
这看上去正确吗?
答案1
- 废除最终规则并制定默认政策
DROP
(iptables -P INPUT DROP
) - 此规则集不会处理来自传出连接的返回数据包;
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
在顶部添加(除非你想不允许传出连接,在这种情况下某些OUTPUT
规则会使这一点更加清晰)。 - 制定
FORWARD
连锁政策DROP
,以防有人失误/proc/sys/net/ipv4/ip_forward
。
答案2
我诚挚地推荐使用 IPtables 包装器。如果仅使用包装器,则无法满足您所需的简单规则。
我们用火力全开效果很好 - 默认发行版中有 Debian/Ubuntu 软件包,通过 RPMForge 有 RHEL/CentOS 软件包(iirc)。
您描述的规则的 firehol 配置将遵循以下步骤:
my_ips="<你的服务器列表>" 连接任何世界 保护强度 100/秒 50 政策下降 服务器身份通过 tcp-reset 拒绝 服务器 ssh 接受 服务器 http 接受 服务器 https 接受 服务器全部接受 src“$my_ips”
创建完整的路由器规则也不是太难 - 上面的例子是针对本地(非路由)防火墙,正如您在问题中描述的那样。
FireHOL 和其他 IPtables 包装器也倾向于在防火墙规则中添加(或轻松添加)合理的默认值,以过滤已知的坏数据包 - 例如上面的“保护”行,最终会创建许多(10+)有用的 iptables 规则。
我更喜欢 FireHOL 的另一个原因是配置文件仍然只是一个 bash 脚本,允许您最终编写的任何 IPtables shell 脚本的完全灵活性。
答案3
对于您的最后一条规则。拒绝数据包比丢弃数据包更有利于互联网。例如...
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited