我有一项服务(代理后的 Elasticsearch)正在监听 eth1 的 80 和 443 端口上的客户流量。托管我服务的服务器还在 eth0 和 localhost 上托管其他管理员/特权访问内容
我正在尝试设置 iptable 规则来锁定与客户端位于同一网络上的服务器上的 eth1(阻止通过 eth1 进行 ssh/访问在端口 9904 上运行的内部服务等)。我还想确保规则不会禁止对 eth1:80 和 eth1:443 的常规访问。我提出了以下规则,但想与 iptable 专家一起审查此规则可能存在的问题。
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i eth1 -j DROP
- 上述规则是否足够
- 上述内容与谷歌搜索时发现的规则有何不同
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i eth1 -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -i eth1 -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -i eth1 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j DROP -A INPUT -i eth1 -p tcp -j ACCEPT -A INPUT -i eth1 -j DROP
答案1
第一组规则首先允许端口 80 和 443 上的所有传入数据包。然后,它丢弃所有其他传入数据包(已接受的数据包除外)。
第二组规则首先允许端口 80 和 443 上的所有传入数据包。然后,它会丢弃传入连接(不包括已经接受的 80 和 443),这些连接是具有仅有的SYN 标志已设置。然后它允许所有传入数据包。
此处的区别在于您的 OUTGOING 连接会发生什么情况。在第一个规则集中,如果您尝试连接到另一台服务器,该服务器响应发送的任何数据包都将被丢弃,因此您将永远不会收到任何数据。在第二种情况下,这些数据包将被允许,因为来自远程服务器的第一个数据包将同时设置 SYN 和 ACK,因此通过 SYN 测试,并且任何后续数据包都不会设置 SYN,因此通过测试。
传统上,这是使用conntrack
内核来跟踪防火墙中的每个连接来完成的,命令如下
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
将传入数据包与现有连接或与某些其他现有连接(例如 FTP 数据连接)相关的连接进行匹配。如果您未使用 FTP 或使用多个随机端口的其他协议,则第二条规则集基本可实现相同的结果,而无需跟踪和检查这些连接的开销。