Linux iptables:删除除单个 IP 地址之外的所有 Apache 请求

Linux iptables:删除除单个 IP 地址之外的所有 Apache 请求

我目前正在 Debian 10 服务器上使用 Apache 构建网站。我想阻止除单个 IP 地址(我的家庭网络的公共 IP 地址)之外的所有到我网站的流量,这样我就可以构建我的网站,而不会在构建网站时让其他用户访问该网站。我想使用带有 iptables 的服务器防火墙来解决这个问题。我创建了以下规则:

sudo iptables --policy INPUT DROP
sudo iptables --policy OUTPUT DROP
sudo iptables --policy FORWARD DROP

iptables -A INPUT -p tcp -m multiport --dports 80,443 -s 1.2.3.4 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -p tcp -m multiport --sports 80,443 -s 1.2.3.4 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

经过几天的测试,我得出结论,问题一定出在我的 OUTPUT 链上。任何见解或想法都将不胜感激,谢谢!!!

更新:根据请求添加 iptables-save 的输出。

此外,经过更多测试后,似乎当我尝试通过服务器的 IP 地址从我的家庭作业网络以外的网络访问我的网站时,请求会被丢弃。每当我尝试通过域名访问我的网站时,请求都不会被丢弃。我是不是漏掉了 DNS 的某些内容?

谢谢大家的帮助!

# Generated by xtables-save v1.8.2 on Sun Oct 25 00:48:27 2020
*filter
:INPUT DROP [304:18242]
:FORWARD DROP [0:0]
:OUTPUT DROP [79:6999]
-A INPUT -s 1.2.3.4 -p tcp -m multiport --dports 80,443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A OUTPUT -d 1.2.3.4 -p tcp -m multiport --sports 80,443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Sun Oct 25 00:48:27 2020
# Generated by xtables-save v1.8.2 on Sun Oct 25 00:48:27 2020
*nat
:PREROUTING ACCEPT [255:14541]
:INPUT ACCEPT [4:240]
:POSTROUTING ACCEPT [1:67]
:OUTPUT ACCEPT [49:3523]
COMMIT
# Completed on Sun Oct 25 00:48:27 2020
# Generated by xtables-save v1.8.2 on Sun Oct 25 00:48:27 2020
*mangle
:PREROUTING ACCEPT [343:22686]
:INPUT ACCEPT [342:22646]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [102:10858]
:POSTROUTING ACCEPT [53:7350]
COMMIT
# Completed on Sun Oct 25 00:48:27 2020

更新:现在可以确认问题是无论我的防火墙规则如何,我仍然可以通过我的域名访问网站

答案1

我假设您的网络服务器不是您的家庭网络的一部分。

我假设在设置 Web 服务器时,您具有某种类型的控制台访问权限。我之所以做出此假设,是因为您正在将 iptables 过滤表的所有链(INPUT、OUTPUT、FORWARD)上的默认策略更改为 DROP,这会导致与 Web 服务器的任何远程连接(例如 ssh)失败。事实上,使用该配置,您甚至会中断对环回接口的访问。

我假设当您使用 1.2.3.4 时,您指的是您的家庭网络公共 IP。

我想通过评论来寻求澄清,但我在 Server Fault 中的声誉还不够。如果您愿意,请随时澄清。如果我的假设是正确的,那么将 OUTPUT 链规则中的“-s”更改为“-d”可能会解决问题。即您的 Web 服务器从源(-s 源)1.2.3.4 接收(在 INPUT 链上),并且您的 Web 服务器发送(在 OUTPUT 链上)到(-d 目标)1.2.3.4。

答案2

我通常配置 iptables 或任何防火墙的方式是,在 INPUT 链上执行默认丢弃,但保持 FORWARD 和 OUTPUT 不变。原因如下:

INPUT 链限制了哪些“外部数据包”可以通过防火墙。因此,我完全阻止了不需要的数据包进入。

FORWARD 链仅适用于标有 forward 的数据包,如路由数据包。这适用于 NAT 或 MASQUERADE 类型的数据包,除非您尝试让此服务器也充当“路由器”,否则这通常与 Web 服务器部署无关。除了防火墙规则外,还有另一个内核运行时标志默认设置为“0”(禁用)。您可以通过运行以下命令来检查:

cat /proc/sys/net/ipv4/ip_forward

OUTPUT 链限制哪些“内部数据包”可以通过防火墙。因此,如果您正在修改此链,那么您就是在限制哪些数据包可以“出去”。通常,如果您预计“未经授权”的数据会从您的服务器传出,则需要这样做。在大多数情况下,这并不重要,并且会增加防火墙的复杂性。

因此,只需使用 INPUT 链并完全避免接触其他链。

答案3

如果您可以使用域名访问您的网站,则问题出在您的 Apache 虚拟主机配置上。

您可能为域名定义了一个虚拟主机。当您使用域名访问时,将使用此虚拟主机。

当您使用 IP 地址访问服务器时,它会转到默认虚拟主机,该主机会执行其他操作。

相关内容