我正在运行一个嵌入式Linux系统,其内核是3.18.21,在MIPS上有一些应用程序。当我在Linux上运行iptables & ip6tables时,如下所示:
iptables -A 输入 -p tcp --dport 80 -j 删除
ip6tables -A 输入 -p tcp --dport 80 -j 删除
tcp 端口 80 用于 http。然后我发现到这台Linux服务器(Linux服务器上运行着一个Web服务器应用程序)的http连接不再起作用。
但是当我运行 natstat 命令时,如下所示:
netstat -tuln | 网络统计grep 听
显示如下:(我只提取了80端口)
tcp 0 0 :::80 :::* 听
这是否意味着 80 端口仍然开放?那么为什么我无法使用http访问Linux上运行的Web服务器(我检查并确认Web服务器进程仍在运行)。
答案1
iptables
不会阻止应用程序打开 TCP 或 UDP 端口(因为这可能会导致应用程序崩溃)。相反,它将阻止传入数据包到达实际端口。如果应用于传出流量,它可以阻止匹配数据包的实际发送。
如果您使用iptables ... -j DROP
,则与规则匹配的任何数据包的处理都会短暂停止,从而有效地导致数据包被忽略而没有任何响应。对于合法的 TCP 连接,这通常会导致发送方挂起,直到连接超时。但由于主机仍然必须响应 ARP 请求,扫描仪仍然可以检测到主机的存在,并将端口标记为“受防火墙保护”。
(如果扫描器不在同一网段,则无法直接观察 ARP 响应,但可以通过查看目标网段的路由器是否响应 ICMP“主机”的连接尝试来推断其存在/不存在。无法访问”错误消息。
没有“主机无法访问”错误+没有 TCP 重置/ICMP“端口无法访问”= 端口很可能受防火墙保护。)
如果使用iptables ... -j REJECT
,任何符合规则的数据包都将被处理就好像所讨论的目的地端口从未打开过一样,无论端口的实际状态如何。这通常会导致 TCP 重置或 ICMP 错误响应数据包被发送回原始数据包的发送者,就像尝试连接到没有防火墙的关闭端口时一样。这允许发送方检测到连接被拒绝,因此连接尝试可以更快地失败。对于扫描仪来说,这样的结果应该与正常的“关闭”端口没有区别。
如果发送者伪造了原始数据包的源 IP 地址,则响应可能会被滥用作为对另一台主机的拒绝服务攻击的一部分,但现代操作系统将降低 TCP 重置/发送的优先级和/或速率限制默认情况下 ICMP 错误数据包,因此这不应成为主要问题。
答案2
iptables/nftables 不会也无法阻止应用程序侦听[在端口上]。