<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://qingliezhiquan.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E6%80%BB%E8%AE%BA</id>
	<title>服务器安全防护总论 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://qingliezhiquan.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E6%80%BB%E8%AE%BA"/>
	<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E6%80%BB%E8%AE%BA&amp;action=history"/>
	<updated>2026-08-07T08:57:59Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E6%80%BB%E8%AE%BA&amp;diff=11357&amp;oldid=prev</id>
		<title>Mwroot: /* 最终概念 */</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E6%80%BB%E8%AE%BA&amp;diff=11357&amp;oldid=prev"/>
		<updated>2026-07-13T16:23:23Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;最终概念&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:23, 14 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l273&quot;&gt;Line 273:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 273:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;CDN、WAF 和云厂商负责在服务器上游处理分布式攻击、带宽型攻击和应用层请求洪水。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;CDN、WAF 和云厂商负责在服务器上游处理分布式攻击、带宽型攻击和应用层请求洪水。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;最小防护结构只需要保留三个核心方向：已经确认的恶意来源进入 &amp;lt;code&amp;gt;mw_ban&amp;lt;code&amp;gt;，单 IP 并发连接过高由 connlimit 处理，单 IP 建立新连接过快由 hashlimit 处理。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;最小防护结构只需要保留三个核心方向：已经确认的恶意来源进入 &amp;lt;code&amp;gt;mw_ban&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/&lt;/ins&gt;code&amp;gt;，单 IP 并发连接过高由 connlimit 处理，单 IP 建立新连接过快由 hashlimit 处理。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;防火墙规则的价值不在于数量，而在于每条规则都明确知道自己限制的对象。&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;防火墙规则的价值不在于数量，而在于每条规则都明确知道自己限制的对象。&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E6%80%BB%E8%AE%BA&amp;diff=11356&amp;oldid=prev</id>
		<title>Mwroot: /* 最小防护规则 */</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E6%80%BB%E8%AE%BA&amp;diff=11356&amp;oldid=prev"/>
		<updated>2026-07-13T16:22:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;最小防护规则&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:22, 14 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l185&quot;&gt;Line 185:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 185:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;流量进入 &amp;lt;code&amp;gt;MW-WEB-GUARD&amp;lt;/code&amp;gt; 后，白名单会先返回原 INPUT 链。其他来源依次检查并发连接数和建立新连接的速度。没有超限的流量走到自定义链末尾时，也会自动返回 INPUT 链，继续经过原有的腾讯云规则、黑名单规则和其他防火墙规则。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;流量进入 &amp;lt;code&amp;gt;MW-WEB-GUARD&amp;lt;/code&amp;gt; 后，白名单会先返回原 INPUT 链。其他来源依次检查并发连接数和建立新连接的速度。没有超限的流量走到自定义链末尾时，也会自动返回 INPUT 链，继续经过原有的腾讯云规则、黑名单规则和其他防火墙规则。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;这套命令使用的是 IPv4 的 &amp;lt;code&amp;gt;iptables&amp;lt;code&amp;gt;。如果服务器同时通过 IPv6 对外提供网站服务，IPv6 流量需要由 &amp;lt;code&amp;gt;ip6tables&amp;lt;/code&amp;gt;、nftables 或相应的 IPv6 防火墙规则处理。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;这套命令使用的是 IPv4 的 &amp;lt;code&amp;gt;iptables&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/&lt;/ins&gt;code&amp;gt;。如果服务器同时通过 IPv6 对外提供网站服务，IPv6 流量需要由 &amp;lt;code&amp;gt;ip6tables&amp;lt;/code&amp;gt;、nftables 或相应的 IPv6 防火墙规则处理。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 查看命中与撤销规则 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 查看命中与撤销规则 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E6%80%BB%E8%AE%BA&amp;diff=11355&amp;oldid=prev</id>
		<title>Mwroot at 16:22, 13 July 2026</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E6%80%BB%E8%AE%BA&amp;diff=11355&amp;oldid=prev"/>
		<updated>2026-07-13T16:22:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:22, 14 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l185&quot;&gt;Line 185:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 185:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;流量进入 &amp;lt;code&amp;gt;MW-WEB-GUARD&amp;lt;/code&amp;gt; 后，白名单会先返回原 INPUT 链。其他来源依次检查并发连接数和建立新连接的速度。没有超限的流量走到自定义链末尾时，也会自动返回 INPUT 链，继续经过原有的腾讯云规则、黑名单规则和其他防火墙规则。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;流量进入 &amp;lt;code&amp;gt;MW-WEB-GUARD&amp;lt;/code&amp;gt; 后，白名单会先返回原 INPUT 链。其他来源依次检查并发连接数和建立新连接的速度。没有超限的流量走到自定义链末尾时，也会自动返回 INPUT 链，继续经过原有的腾讯云规则、黑名单规则和其他防火墙规则。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;这套命令使用的是 IPv4 的 &amp;lt;code&amp;gt;iptables&amp;lt;code&amp;gt;。如果服务器同时通过 IPv6 对外提供网站服务，IPv6 流量需要由 &amp;lt;code&amp;gt;ip6tables&amp;lt;code&amp;gt;、nftables 或相应的 IPv6 防火墙规则处理。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;这套命令使用的是 IPv4 的 &amp;lt;code&amp;gt;iptables&amp;lt;code&amp;gt;。如果服务器同时通过 IPv6 对外提供网站服务，IPv6 流量需要由 &amp;lt;code&amp;gt;ip6tables&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/&lt;/ins&gt;code&amp;gt;、nftables 或相应的 IPv6 防火墙规则处理。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 查看命中与撤销规则 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 查看命中与撤销规则 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l235&quot;&gt;Line 235:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 235:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;由于新增限制都集中在自定义链中，这些操作不会删除 &amp;lt;code&amp;gt;mw_white&amp;lt;code&amp;gt;、&amp;lt;code&amp;gt;mw_ban&amp;lt;code&amp;gt;、腾讯云链或其他原有规则。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;由于新增限制都集中在自定义链中，这些操作不会删除 &amp;lt;code&amp;gt;mw_white&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/&lt;/ins&gt;code&amp;gt;、&amp;lt;code&amp;gt;mw_ban&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/&lt;/ins&gt;code&amp;gt;、腾讯云链或其他原有规则。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;也可以使用备份完整恢复此前的 iptables 状态：&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;也可以使用备份完整恢复此前的 iptables 状态：&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E6%80%BB%E8%AE%BA&amp;diff=11354&amp;oldid=prev</id>
		<title>Mwroot: Created page with &quot;网站突然变慢、无法访问，或者重启 Apache 后立即恢复，可能不是带宽已经耗尽，而是大量 TCP 连接占用了 Apache 的进程、线程或连接队列。排查这类问题时，只需先建立一个简单框架：ss 负责观察连接，ipset 负责保存 IP 名单，iptables 负责决定放行或丢弃，connlimit 限制一个 IP 同时占用的连接数，hashlimit 限制一个 IP 建立新连接的速度。  == 观察连接现场：ss 与...&quot;</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E6%80%BB%E8%AE%BA&amp;diff=11354&amp;oldid=prev"/>
		<updated>2026-07-13T15:39:34Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;网站突然变慢、无法访问，或者重启 Apache 后立即恢复，可能不是带宽已经耗尽，而是大量 TCP 连接占用了 Apache 的进程、线程或连接队列。排查这类问题时，只需先建立一个简单框架：ss 负责观察连接，ipset 负责保存 IP 名单，iptables 负责决定放行或丢弃，connlimit 限制一个 IP 同时占用的连接数，hashlimit 限制一个 IP 建立新连接的速度。  == 观察连接现场：ss 与...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;网站突然变慢、无法访问，或者重启 Apache 后立即恢复，可能不是带宽已经耗尽，而是大量 TCP 连接占用了 Apache 的进程、线程或连接队列。排查这类问题时，只需先建立一个简单框架：ss 负责观察连接，ipset 负责保存 IP 名单，iptables 负责决定放行或丢弃，connlimit 限制一个 IP 同时占用的连接数，hashlimit 限制一个 IP 建立新连接的速度。&lt;br /&gt;
&lt;br /&gt;
== 观察连接现场：ss 与 watch ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt; 是 Linux 中查看 Socket 状态的工具，可以把它理解成服务器网络层的现场监控器。它能够显示服务器是否仍在监听端口、目前有多少连接，以及这些连接处在 TCP 通信的哪个阶段。&lt;br /&gt;
&lt;br /&gt;
下面的命令显示整个系统的 Socket 概况：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ss -s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
它适合快速判断服务器的连接总量是否突然异常，但不能直接说明 443 端口有多少连接。&lt;br /&gt;
&lt;br /&gt;
下面的命令检查是否仍有程序监听 HTTPS 端口：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ss -lntp &amp;#039;( sport = :443 )&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果没有任何输出，说明当前没有程序监听 443 端口。问题通常应从 Apache 是否运行、HTTPS 配置是否成功加载、端口是否被其他程序占用等方向排查。&lt;br /&gt;
&lt;br /&gt;
下面的命令统计已经完成 TCP 握手的 HTTPS 连接：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ss -Hnt state established &amp;#039;( sport = :443 )&amp;#039; | wc -l&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ESTABLISHED&amp;lt;/code&amp;gt; 表示 TCP 三次握手已经完成。这些连接可能来自正常用户、搜索引擎、爬虫、KeepAlive 或慢连接，因此连接数量很高并不自动等于正在遭受攻击。&lt;br /&gt;
&lt;br /&gt;
下面的命令统计尚未完成握手的 HTTPS 连接：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ss -Hnt state syn-recv &amp;#039;( sport = :443 )&amp;#039; | wc -l&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果 &amp;lt;code&amp;gt;SYN-RECV&amp;lt;/code&amp;gt; 长时间异常增多，说明服务器收到了大量连接请求，但其中许多握手没有完成。这可能与 SYN flood、网络丢包或者 TCP 握手队列压力有关。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;watch&amp;lt;/code&amp;gt; 本身不懂网络，它只是反复执行另一条命令。例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
watch -n 1 &amp;quot;ss -Hnt state established &amp;#039;( sport = :443 )&amp;#039; | wc -l&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这表示每秒重新统计一次已经建立的 HTTPS 连接。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ss 负责观察，watch 负责持续观察。&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== 管理名单与检查流量：ipset 和 iptables ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ipset&amp;lt;/code&amp;gt; 是一个 IP 名单管理工具。它可以保存单个 IP，也可以保存整个网段。它本身不决定放行还是封禁，只负责维护名单。&lt;br /&gt;
&lt;br /&gt;
例如，&amp;lt;code&amp;gt;mw_white&amp;lt;/code&amp;gt; 可以保存白名单，&amp;lt;code&amp;gt;mw_ban&amp;lt;/code&amp;gt; 可以保存黑名单。iptables 只需使用一条规则，便能查询整个名单，不必为每个 IP 分别建立一条防火墙规则。&lt;br /&gt;
&lt;br /&gt;
向黑名单加入一个 IP：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ipset add mw_ban 74.7.227.12&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
向黑名单加入整个 &amp;lt;code&amp;gt;/24&amp;lt;/code&amp;gt; 网段：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ipset add mw_ban 74.7.227.0/24&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个 &amp;lt;code&amp;gt;/24&amp;lt;/code&amp;gt; 网段通常包含最多 256 个 IPv4 地址。封禁整个网段能够一次处理大量同源地址，但也比封禁单个 IP 更容易影响同一网段中的正常来源。&lt;br /&gt;
&lt;br /&gt;
iptables 是真正执行网络判断的工具。进入服务器的数据包会按照规则的先后顺序接受检查。规则可以检查来源地址、目标端口、连接状态和 ipset 名单，然后决定继续检查、接受、返回上一层规则或者直接丢弃。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DROP&amp;lt;/code&amp;gt; 表示静默丢弃数据包。&amp;lt;code&amp;gt;RETURN&amp;lt;/code&amp;gt; 表示结束当前自定义链，返回调用它的上一层链继续检查。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-I&amp;lt;/code&amp;gt; 是插入规则，&amp;lt;code&amp;gt;-A&amp;lt;/code&amp;gt; 是把规则追加到链尾。由于 iptables 从上到下检查规则，规则顺序会直接影响最终结果。&lt;br /&gt;
&lt;br /&gt;
下面的命令可以查看 INPUT 链、规则编号和每条规则的命中次数：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
iptables -L INPUT -n -v --line-numbers&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
规则左侧的数据包数量会随着命中而增加，因此可以据此判断具体是哪条规则正在发挥作用。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ipset 是名单册，iptables 是按照名单和条件执行判断的门卫。&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== 两种核心限制：connlimit 和 hashlimit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;connlimit&amp;lt;/code&amp;gt; 解决的是并发连接问题。它关心的不是某个 IP 一天访问了多少次，而是这个 IP 此刻同时保持着多少条 TCP 连接。&lt;br /&gt;
&lt;br /&gt;
如果一个来源 IP 同时保持几十甚至几百条连接，它可能持续占用服务器的 Socket、Apache 进程或工作线程。connlimit 可以在连接数量超过阈值以后，拒绝这个来源继续建立新连接。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;connlimit 限制的是一个 IP 同时占用多少个座位。&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hashlimit&amp;lt;/code&amp;gt; 解决的是新连接速度问题。有些异常流量不会长期保持大量连接，而是不断重复建立连接、关闭连接、再次建立连接。即使同时存在的连接数量不高，这种行为仍然会反复消耗 TCP 握手、TLS 握手和 Apache 资源。&lt;br /&gt;
&lt;br /&gt;
使用 &amp;lt;code&amp;gt;--hashlimit-mode srcip&amp;lt;/code&amp;gt; 时，每个来源 IP 都会单独计算速度。某个 IP 超过速率，只会影响这个 IP，不会让所有访问者共同争抢一个总额度。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;hashlimit 限制的是一个 IP 冲进大门的速度。&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
hashlimit 看到的是 TCP 新连接，而不是 MediaWiki 页面请求。一个已经建立的 KeepAlive 连接可以连续发送多个 HTTP 请求，不会因为每次请求页面而重新进入 TCP 新连接状态。&lt;br /&gt;
&lt;br /&gt;
因此，connlimit 和 hashlimit 主要处理连接层面的异常。真正的 HTTP 请求洪水还需要 CDN、WAF、反向代理或者 Apache 应用层规则处理。&lt;br /&gt;
&lt;br /&gt;
== 最小防护规则 ==&lt;br /&gt;
&lt;br /&gt;
为了避免把新增规则散落在原有 INPUT 链中，可以建立一条独立的自定义链。所有网站连接限制都集中放在这条链里，撤销时也只需要删除这一条入口和自定义链。&lt;br /&gt;
&lt;br /&gt;
应用规则前，可以把当前状态保存为文本备份：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 保存当前 iptables 规则&lt;br /&gt;
iptables-save &amp;gt; /root/iptables-before-web-guard.v4&lt;br /&gt;
&lt;br /&gt;
# 保存当前 ipset 名单&lt;br /&gt;
ipset save &amp;gt; /root/ipset-before-web-guard.set&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
建立独立的网站防护链：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 如果防护链不存在，就创建它&lt;br /&gt;
iptables -nL MW-WEB-GUARD &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 || \&lt;br /&gt;
iptables -N MW-WEB-GUARD&lt;br /&gt;
&lt;br /&gt;
# 清空防护链中的旧测试规则&lt;br /&gt;
iptables -F MW-WEB-GUARD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
白名单来源跳过本链中的连接限制，但仍会返回 INPUT 链，继续接受服务器原有规则的检查：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 白名单跳过本链中的并发和速率限制&lt;br /&gt;
iptables -A MW-WEB-GUARD \&lt;br /&gt;
  -m set --match-set mw_white src \&lt;br /&gt;
  -j RETURN&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
限制单个 IPv4 地址同时占用过多网站连接：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 单个 IPv4 地址同时超过 40 条网站连接时，拒绝继续建立新连接&lt;br /&gt;
iptables -A MW-WEB-GUARD \&lt;br /&gt;
  -p tcp --syn \&lt;br /&gt;
  -m connlimit \&lt;br /&gt;
  --connlimit-saddr \&lt;br /&gt;
  --connlimit-above 40 \&lt;br /&gt;
  --connlimit-mask 32 \&lt;br /&gt;
  -j DROP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这条规则只在对方建立新连接时检查。&amp;lt;code&amp;gt;--connlimit-saddr&amp;lt;/code&amp;gt; 表示按照来源地址统计，&amp;lt;code&amp;gt;--connlimit-mask 32&amp;lt;/code&amp;gt; 表示每个 IPv4 地址单独计算。&lt;br /&gt;
&lt;br /&gt;
限制单个 IPv4 地址持续高速建立新连接：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 单个 IPv4 地址持续超过每秒 10 个新连接时，丢弃超出的连接&lt;br /&gt;
iptables -A MW-WEB-GUARD \&lt;br /&gt;
  -p tcp --syn \&lt;br /&gt;
  -m hashlimit \&lt;br /&gt;
  --hashlimit-name mw_web_new \&lt;br /&gt;
  --hashlimit-mode srcip \&lt;br /&gt;
  --hashlimit-above 10/second \&lt;br /&gt;
  --hashlimit-burst 30 \&lt;br /&gt;
  --hashlimit-htable-expire 600000 \&lt;br /&gt;
  -j DROP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;10/second&amp;lt;/code&amp;gt; 是持续速率，&amp;lt;code&amp;gt;burst 30&amp;lt;/code&amp;gt; 用来容忍短时间的正常突发。该规则只丢弃超速期间的新连接，不会把来源 IP 永久加入黑名单。长期不活跃的速率记录会在十分钟后清理。&lt;br /&gt;
&lt;br /&gt;
让进入 80 和 443 端口的 TCP 流量经过自定义防护链：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 如果入口规则不存在，就把 80、443 流量送入网站防护链&lt;br /&gt;
iptables -C INPUT \&lt;br /&gt;
  -p tcp \&lt;br /&gt;
  -m multiport --dports 80,443 \&lt;br /&gt;
  -j MW-WEB-GUARD 2&amp;gt;/dev/null || \&lt;br /&gt;
iptables -I INPUT 1 \&lt;br /&gt;
  -p tcp \&lt;br /&gt;
  -m multiport --dports 80,443 \&lt;br /&gt;
  -j MW-WEB-GUARD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -C&amp;lt;/code&amp;gt; 用来检查入口规则是否已经存在。只有规则不存在时，后面的插入命令才会执行，因此重复运行不会不断产生相同入口。&lt;br /&gt;
&lt;br /&gt;
流量进入 &amp;lt;code&amp;gt;MW-WEB-GUARD&amp;lt;/code&amp;gt; 后，白名单会先返回原 INPUT 链。其他来源依次检查并发连接数和建立新连接的速度。没有超限的流量走到自定义链末尾时，也会自动返回 INPUT 链，继续经过原有的腾讯云规则、黑名单规则和其他防火墙规则。&lt;br /&gt;
&lt;br /&gt;
这套命令使用的是 IPv4 的 &amp;lt;code&amp;gt;iptables&amp;lt;code&amp;gt;。如果服务器同时通过 IPv6 对外提供网站服务，IPv6 流量需要由 &amp;lt;code&amp;gt;ip6tables&amp;lt;code&amp;gt;、nftables 或相应的 IPv6 防火墙规则处理。&lt;br /&gt;
&lt;br /&gt;
== 查看命中与撤销规则 ==&lt;br /&gt;
&lt;br /&gt;
下面的命令显示自定义防护链及其命中次数：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
iptables -L MW-WEB-GUARD -n -v --line-numbers&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果 connlimit 或 hashlimit 规则前面的数据包计数持续增加，说明相应规则正在丢弃超限的新连接。&lt;br /&gt;
&lt;br /&gt;
下面的命令显示 INPUT 链中的入口：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
iptables -L INPUT -n -v --line-numbers&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
INPUT 链中应当存在一条把 80、443 端口流量送入 &amp;lt;code&amp;gt;MW-WEB-GUARD&amp;lt;/code&amp;gt; 的规则。&lt;br /&gt;
&lt;br /&gt;
压力测试可以使用 Apache 自带的 &amp;lt;code&amp;gt;ab&amp;lt;/code&amp;gt; 工具。例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ab -n 500 -c 50 https://qingliezhiquan.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这表示总共发送 500 个请求，同时保持最多 50 个并发请求。由于 ab 默认会频繁建立新连接，它可能同时触发 connlimit 和 hashlimit。&lt;br /&gt;
&lt;br /&gt;
如果压力测试的来源 IP 存在于 &amp;lt;code&amp;gt;mw_white&amp;lt;/code&amp;gt; 中，该来源会跳过本链限制，因此不会验证这两条规则。&lt;br /&gt;
&lt;br /&gt;
撤销规则时，先删除 INPUT 链中的入口：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 删除 INPUT 通往网站防护链的入口&lt;br /&gt;
iptables -D INPUT \&lt;br /&gt;
  -p tcp \&lt;br /&gt;
  -m multiport --dports 80,443 \&lt;br /&gt;
  -j MW-WEB-GUARD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后清空并删除自定义链：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 清空网站防护链&lt;br /&gt;
iptables -F MW-WEB-GUARD&lt;br /&gt;
&lt;br /&gt;
# 删除网站防护链&lt;br /&gt;
iptables -X MW-WEB-GUARD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
由于新增限制都集中在自定义链中，这些操作不会删除 &amp;lt;code&amp;gt;mw_white&amp;lt;code&amp;gt;、&amp;lt;code&amp;gt;mw_ban&amp;lt;code&amp;gt;、腾讯云链或其他原有规则。&lt;br /&gt;
&lt;br /&gt;
也可以使用备份完整恢复此前的 iptables 状态：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
iptables-restore &amp;lt; /root/iptables-before-web-guard.v4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apache 与防火墙的边界 ==&lt;br /&gt;
&lt;br /&gt;
iptables 工作在 Apache 外部。它可以根据 IP、端口、TCP 标志、连接数量和连接速度丢弃流量，但它看不懂具体访问的是哪个 MediaWiki 页面，也不知道一个已经建立的连接中发送了多少次 HTTP 请求。&lt;br /&gt;
&lt;br /&gt;
Apache 负责处理已经进入服务器的 HTTP 请求。慢速发送请求头、慢速上传请求体、KeepAlive 长时间空闲以及 Apache 工作线程被占满，都属于 Apache 层的问题。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;KeepAliveTimeout&amp;lt;/code&amp;gt; 控制一次请求完成后，持久连接还可以空闲等待多久。等待时间较短，可以减少空闲连接长期占用服务器资源。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;RequestReadTimeout&amp;lt;/code&amp;gt; 控制客户端必须在多长时间内、以怎样的最低速度发送完请求头或请求体。它主要用来处理故意极慢发送数据的 HTTP 客户端。&lt;br /&gt;
&lt;br /&gt;
Apache 的 &amp;lt;code&amp;gt;event MPM&amp;lt;/code&amp;gt; 比 &amp;lt;code&amp;gt;prefork MPM&amp;lt;/code&amp;gt; 更擅长处理大量空闲 KeepAlive 连接，因为它不必让主要工作线程一直等待空闲连接。但 MPM 的选择还与 PHP 使用的是 mod_php 还是 PHP-FPM 有关。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;iptables 负责控制谁能建立连接，Apache 负责控制连接进入以后怎样处理请求。&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== 最终概念 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt; 用来观察服务器当前存在什么连接，以及这些连接处于什么 TCP 状态。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ipset&amp;lt;/code&amp;gt; 用来保存 IP 和网段名单。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; 用来按照规则顺序决定流量的去向。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;connlimit&amp;lt;/code&amp;gt; 用来限制单个 IP 同时占用的连接数量。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hashlimit&amp;lt;/code&amp;gt; 用来限制单个 IP 建立新连接的速度。&lt;br /&gt;
&lt;br /&gt;
Apache 负责处理已经进入服务器的 HTTP 请求。&lt;br /&gt;
&lt;br /&gt;
CDN、WAF 和云厂商负责在服务器上游处理分布式攻击、带宽型攻击和应用层请求洪水。&lt;br /&gt;
&lt;br /&gt;
最小防护结构只需要保留三个核心方向：已经确认的恶意来源进入 &amp;lt;code&amp;gt;mw_ban&amp;lt;code&amp;gt;，单 IP 并发连接过高由 connlimit 处理，单 IP 建立新连接过快由 hashlimit 处理。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;防火墙规则的价值不在于数量，而在于每条规则都明确知道自己限制的对象。&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
</feed>