![通过 iptables 过滤的 Apache2 网页](https://linux22.com/image/735232/%E9%80%9A%E8%BF%87%20iptables%20%E8%BF%87%E6%BB%A4%E7%9A%84%20Apache2%20%E7%BD%91%E9%A1%B5.png)
情况:我有一个配置为路由器和防火墙(iptables)的 Ubuntu 18.04 盒子,有两个分支,还有一个运行 Apache2(出于兼容性原因)的 Ubuntu 14.04。
问题:下面两行令我头疼的规则:
-A FORWARD -s 10.1.5.0/24 -d 10.1.2.10/32 -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.1.2.10/32 -d 10.1.5.0/24 -m multiport --sports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
当 iptables 规则被刷新时,我可以正常访问 Web 服务器,但是,只需应用如下所示的简单规则:
-A FORWARD -s 10.1.5.0/24 -d 10.1.2.10/32 -j ACCEPT
-A FORWARD -s 10.1.2.10/32 -d 10.1.5.0/24 -j ACCEPT
导致我的 Web 服务器停止响应。Tcpdump 表明已联系 Web 服务器,并且可能已完成 TCP 握手,但 Web 服务器未回复网页。
10.1.2.10 是我的 Web 服务器,而 10.1.5.0/24 是一个包含“用户”机器的子网。
问题:我的 iptables 有问题吗?或者可能是 Apache 配置错误?
更新:以下规则使 Web 服务器正确响应(我仍然不明白为什么)。如果我尝试应用任何其他过滤器(例如按端口、目标或进行限制)ctstate
,Web 服务器就会停止转发。tcpdump
输出表明存在与之前相同的问题 - TCP 握手可能已完成,但没有转发任何网页。
-A FORWARD -s 10.1.2.10/32 -p tcp -j ACCEPT
-A FORWARD -s 10.1.5.0/24 -d 10.1.2.10/32 -j ACCEPT
答案1
您的简单规则中有拼写错误。应该这样:
-A FORWARD -s 10.1.5.0/24 -d 10.1.2.10/32 -j ACCEPT
-A FORWARD -d 10.1.2.10/32 -s 10.1.5.0/24 -j ACCEPT
他们应该读:
-A FORWARD -s 10.1.5.0/24 -d 10.1.2.10/32 -j ACCEPT
-A FORWARD -s 10.1.2.10/32 -d 10.1.5.0/24 -j ACCEPT
您的第一次尝试产生了两个相同的规则,其中第二条规则永远不会被满足。