我整天都在阅读有关 IP 表、规则如何工作、基本 Web 服务器的规则集等内容。现在,我正尝试使用这个线程作为起点,使用 IPtables 配置我的 Web 服务器:适合网络服务器的 iptables 启动规则有哪些?
因为我不想只是复制粘贴任何有用的内容,所以我逐条添加规则,并考虑每条规则为什么我需要它。我发现我基本上需要通过端口 80、443、22、587(邮件服务器)进行访问。
但是,添加这些规则后,我无法通过域名访问我的网站。因此,我与我提到的帖子进行了比较,发现我没有这条规则:
# Allow traffic already established to continue
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
所以我添加了这条规则来测试一下,突然间我就可以访问我的网站了。然后我想,也许是因为我已经从这个 IP 连接到网站了,但如果我通过其他 IP/网络连接,我仍然可以访问我的网站,这取决于这条规则。
因为我想理解这一点,我不太明白为什么访问我的网站要依赖于该规则。已经有一条规则允许通过端口 80(我的网络服务器运行的端口)传入流量,但似乎只有这条规则还不够?PS,这是我目前开放端口 80 的规则:
target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:http
我希望有人可以解释一下该规则,以及为什么我可以遵循该规则访问我的网站,而没有该规则则不能。
编辑:我确实明白为什么有人想要添加此规则,我认为它会加快速度,因为它不再需要经过所有其他规则,但我只是想了解为什么在我的情况下,拥有此规则对于访问我的网站至关重要..
谢谢!
答案1
iptables 是一个防火墙statefull
,与 相反,stateless
这意味着它将连接标识为与状态关联的流。首先发起连接(NEW 状态),(tcp 的 SYN 数据包或 UDP 的第一个数据包)。然后,做出决定(BLOCK、DROP 或 ACCEPT)。这是您在 ESTABLISHED 规则之前创建的。如果在 NEW 状态下接受数据包,则属于同一连接的数据包不一定会被接受(它不再是 NEW 状态。对于 tcp,它将是 SYN-ACK、ACK、Push、Push-ACK 等数据包)。这些数据包属于 ESTABLISHED 状态。通常,接受 ESTABLISHED 数据包以使其正常工作。
如果您不激活此规则,您将拥有stateless
防火墙。要使其工作,您需要接受every
与您选择的端口相对应的数据包。这可能会导致安全问题(想象一下,客户端防火墙试图访问网络服务器;每个数据包都发往网络服务器端口 80或来自 Web 服务器端口 80将被接受(对于 Web 服务器答案)。如果有人伪造 Web 服务器 IP 地址,那么它就会完全绕过防火墙,只要它尝试连接源端口 80。
RELATED
这里没有必要。它对应于不属于连接的流量,但有时很有用:
- 当端口关闭时,会发出 ICMP 端口不可达数据包,此数据包不属于该连接,但可能有用
- 对于在控制流量中选择其数据端口的协议
FTP
;RELATED 授权数据流量,即使没有与之关联的明确规则。
更多关于此这里
答案2
困惑了我很久,留作以后参考。
引自https://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO-3.html:
NAT:该表与“过滤器”表略有不同,因为只有新连接的第一个数据包才会遍历该表:此遍历的结果将应用于同一连接中的所有未来数据包。
因此这个--state ESTABLISHED,RELATED 在nat表中无效。
请注意,如果您conntrack -D
在设置 nat 表之后使用,这将使 iptables 认为它看到的下一个数据包是“新连接的第一个数据包”(可通过 --state NEW 匹配),如果您有相关规则,则会导致一个连接的中间以反向进行 NAT,这很可能会破坏已建立的连接。