徒手 發表於 2023-5-21 00:00:00

查看服务器是否被DDOS攻击的方法

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>
        常见流量攻击</li><li>
        第一种类型:CC类攻击<ul class="second_class_ul"><li>
        CC类攻击检测</li></ul></li><li>
        第二种类型:SYN类攻击<ul class="second_class_ul"><li>
        SYN类攻击检测</li><li>
        防护SYN类攻击措施</li></ul></li><li>
        第三种类型:UDP类攻击<ul class="second_class_ul"><li>
        UDP类攻击检测</li></ul></li><li>
        第四种类型:TCP洪水攻击<ul class="second_class_ul"><li>
        TCP洪水攻击检测</li><li>
        防御TCP洪水攻击方法</li></ul></li><li>
        扩展<ul class="second_class_ul"><li>
        问题1:解决time_wait连接数大量问题</li><li>
        问题2:ESTABLISHED连接数过大问题</li></ul></li><li>
        DDoS攻击防御方法<ul class="second_class_ul"></ul></li></ul></div><p class="maodian"></p><h2>
        常见流量攻击</h2>
<p>
        服务器的攻击分为四类,cc攻击、syn攻击、udp攻击、tcp洪水攻击。那么当被攻击时会出现哪些症状呢,我们是如何来判断服务器是否被攻击,属于哪种攻击类型?</p>
<p class="maodian"></p><h2>
        第一种类型:CC类攻击</h2>
<p>
        CC攻击是DDoS(分布式拒绝服务)的一种,这种一种比DDOS流氓行为更具有技术含量的一种攻击方式,CC攻击完全模拟正常访问行为,没有虚假IP,也没有大的流量异常,但一样会造成您的服务器无法正常连接,一条ADSL的普通用户发起的CC攻击就可以干掉一台高性能的服务器。<br>
        服务器呗CC攻击时,会出现80端口关闭的现象,即出现丢包和高延迟的现象, 因为80端口被大量的垃圾数据堵塞导致正常的连接被中止。可以通过在CMD命令窗口输入命令 netstat -an 来查看,如果看到类似如下大量显示雷同的连接记录基本就可以被CC攻击了:</p>
<p>
        ……<br>
        TCP 192.168.1.3:80 192.168.1.6:2205 SYN_RECEIVED 4<br>
        A.网站出现service unavailable提示</p>
<p>
        B.CPU占用率很高</p>
<p>
        C.网络连接状态:netstat –na,若观察到<strong>大量的ESTABLISHED的连接状态</strong> 单个IP高达几十条甚至上百条</p>
<p>
        D.外部无法打开网站,软重启后短期内恢复正常,几分钟后又无法访问。</p>
<p class="maodian"></p><h3>
        CC类攻击检测</h3>
<p>
        第一条命令:</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">tcpdump <span class="token operator">-</span>s0 <span class="token operator">-</span>A <span class="token operator">-</span>n <span class="token operator">-</span>i any <span class="token operator">|</span> grep <span class="token operator">-</span>o <span class="token operator">-</span>E <span class="token string">'(GET|POST|HEAD) .*'</span>
</code></pre>
<p>
        正常的输出结果类似于这样</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">POST <span class="token operator">/</span>ajax<span class="token operator">/</span>validator<span class="token punctuation">.</span>php HTTP<span class="token operator">/</span><span class="token number">1.1</span>
</code></pre>
<p class="maodian"></p><h2>
        第二种类型:SYN类攻击</h2>
<p>
        A.CPU占用很高</p>
<p>
        B.网络连接状态:netstat –na,若观察到<strong>大量的SYN_RECEIVED的连接状态</strong></p>
<p class="maodian"></p><h3>
        SYN类攻击检测</h3>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">netstat <span class="token operator">-</span>na             显示所有活动的网络连接
netstat <span class="token operator">-</span>an <span class="token operator">|</span> grep <span class="token operator">:</span><span class="token number">80</span> <span class="token operator">|</span> sort         显示所有<span class="token number">80</span>端口的网络连接并排序。<span class="token number">80</span>端口为http端口
netstat <span class="token operator">-</span>n <span class="token operator">-</span>p <span class="token operator">|</span> grep SYN_REC <span class="token operator">|</span> wc <span class="token operator">-</span>l          查看当前有多少活动的SYNC_REC连接,最好值小于<span class="token number">5.</span>
netstat <span class="token operator">-</span>n <span class="token operator">-</span>p <span class="token operator">|</span> grep SYN_REC <span class="token operator">|</span> sort <span class="token operator">-</span>u      列出所有连接过的IP地址
netstat <span class="token operator">-</span>n <span class="token operator">-</span>p <span class="token operator">|</span> grep SYN_REC <span class="token operator">|</span> awk ‘<span class="token punctuation">{<!-- --></span>print $<span class="token number">5</span><span class="token punctuation">}</span>’ <span class="token operator">|</span> awk <span class="token operator">-</span>F<span class="token operator">:</span> ‘<span class="token punctuation">{<!-- --></span>print $<span class="token number">1</span><span class="token punctuation">}</span>’   列出所有发送SYN_REC连接节点的IP地址
netstat <span class="token operator">-</span>ntu <span class="token operator">|</span> awk ‘<span class="token punctuation">{<!-- --></span>print $<span class="token number">5</span><span class="token punctuation">}</span>’ <span class="token operator">|</span> cut <span class="token operator">-</span>d<span class="token operator">:</span> <span class="token operator">-</span>f1 <span class="token operator">|</span> sort <span class="token operator">|</span> uniq <span class="token operator">-</span>c <span class="token operator">|</span> sort <span class="token operator">-</span>n
使用netstat命令计算每个主机连接到本机的连接数
netstat <span class="token operator">-</span>anp <span class="token operator">|</span> grep ‘tcp<span class="token operator">|</span>udp’ <span class="token operator">|</span> awk ‘<span class="token punctuation">{<!-- --></span>print $<span class="token number">5</span><span class="token punctuation">}</span>’ <span class="token operator">|</span> cut <span class="token operator">-</span>d<span class="token operator">:</span> <span class="token operator">-</span>f1 <span class="token operator">|</span> sort <span class="token operator">|</span> uniq <span class="token operator">-</span>c <span class="token operator">|</span> sort <span class="token operator">-</span>n      列出所有连接到本机的udp或者tcp连接的数量
netstat <span class="token operator">-</span>ntu <span class="token operator">|</span> grep ESTAB <span class="token operator">|</span> awk ‘<span class="token punctuation">{<!-- --></span>print $<span class="token number">5</span><span class="token punctuation">}</span>’ <span class="token operator">|</span> cut <span class="token operator">-</span>d<span class="token operator">:</span> <span class="token operator">-</span>f1 <span class="token operator">|</span> sort <span class="token operator">|</span> uniq <span class="token operator">-</span>c <span class="token operator">|</span> sort <span class="token operator">-</span>nr      检查ESTABLISHED 连接并且列出每个IP地址的连接数量
Netstat <span class="token operator">-</span>plan<span class="token operator">|</span>grep <span class="token operator">:</span><span class="token number">80</span><span class="token operator">|</span> awk <span class="token punctuation">{<!-- --></span>‘print $<span class="token number">5</span>’<span class="token punctuation">}</span> <span class="token operator">|</span> cut <span class="token operator">-</span>d<span class="token operator">:</span> <span class="token operator">-</span>f1 <span class="token operator">|</span> sort <span class="token operator">|</span> uniq <span class="token operator">-</span>c <span class="token operator">|</span> sort <span class="token operator">-</span>nk <span class="token number">1</span>          列出所有连接到本机<span class="token number">80</span>端口的IP地址和其他连接数
</code></pre>
<p>
        <img title="查看服务器是否被DDOS攻击的方法" alt="查看服务器是否被DDOS攻击的方法" src="https://zhuji.jb51.net/uploads/img/202305/f61ee9765abbb084d0705ff7d27c6479.jpg">  <strong>1、利用netstat 工具来检测查看SYN连接</strong></p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">netstat <span class="token operator">-</span>n <span class="token operator">-</span>p <span class="token operator">-</span>t <span class="token operator">|</span>wc <span class="token operator">-</span>l
</code></pre>
<p>
        <img title="查看服务器是否被DDOS攻击的方法" alt="查看服务器是否被DDOS攻击的方法" src="https://zhuji.jb51.net/uploads/img/202305/a04b8d7fbdbf2373bec94c5fa5bdb812.jpg"></p>
<p class="maodian"></p><h3>
        防护SYN类攻击措施</h3>
<p>
        防范也主要从两方面入手,一是sysctl的自身的关于syn方面的配置,二是防火墙策略上。</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">sysctl <span class="token operator">-</span>w net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_syncookies<span class="token operator">=</span><span class="token number">1</span> # tcp syncookie,默认关闭

sysctl <span class="token operator">-</span>w net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_max_syn_backlog<span class="token operator">=</span><span class="token number">1280</span> # syn队列,默认<span class="token number">1024</span>,》 <span class="token number">1280</span>可能工作不稳定,需要修改内核源码参数

sysctl <span class="token operator">-</span>w net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_synack_retries<span class="token operator">=</span><span class="token number">2</span> # syn<span class="token operator">-</span>ack握手状态重试次数,默认<span class="token number">5</span>,遭受syn<span class="token operator">-</span>flood攻击时改为<span class="token number">1</span>或<span class="token number">2</span>

sysctl <span class="token operator">-</span>w net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_syn_retries<span class="token operator">=</span><span class="token number">2</span> # 外向syn握手重试次数,默认<span class="token number">4</span>
</code></pre>
<p>
        通过下列命令查看。</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">[root@localhost nginx]# sysctl <span class="token operator">-</span>a<span class="token operator">|</span>grep syn

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>netfilter<span class="token punctuation">.</span>ip_conntrack_tcp_timeout_syn_recv <span class="token operator">=</span> <span class="token number">60</span>

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>netfilter<span class="token punctuation">.</span>ip_conntrack_tcp_timeout_syn_sent <span class="token operator">=</span> <span class="token number">120</span>

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_max_syn_backlog <span class="token operator">=</span> <span class="token number">1024</span>

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_syncookies <span class="token operator">=</span> <span class="token number">1</span>

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_synack_retries <span class="token operator">=</span> <span class="token number">5</span>

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_syn_retries <span class="token operator">=</span> <span class="token number">5</span>

fs<span class="token punctuation">.</span>quota<span class="token punctuation">.</span>syncs <span class="token operator">=</span> <span class="token number">25</span>
</code></pre>
<p>
        <img title="查看服务器是否被DDOS攻击的方法" alt="查看服务器是否被DDOS攻击的方法" src="https://zhuji.jb51.net/uploads/img/202305/ae78abbe9b6860f2b9acab8038b7c6bf.jpg"> 如未受到攻击,上面的参数不建议修改。据说有增加主机的不稳定性的风险。</p>
<p class="maodian"></p><h2>
        第三种类型:UDP类攻击</h2>
<p>
        A.观察网卡状况 每秒接受大量的数据包</p>
<p>
        B.网络状态:netstat –na TCP信息正常</p>
<p class="maodian"></p><h3>
        UDP类攻击检测</h3>
<p>
        检测udp端口</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">检测端口是否打开:nc <span class="token operator">-</span>zuv ip 端口

服务器监听端口:nc <span class="token operator">-</span>l <span class="token operator">-</span>u ip 端口(可以发送和接受信息)

客户端检测端口:nc <span class="token operator">-</span>u ip 端口(可以发送和接受信息)

查看监听的tup端口:ss <span class="token operator">-</span>ant

查看监听的udp端口:ss <span class="token operator">-</span>anu

查看所有协议端口:ss <span class="token operator">-</span>ano
</code></pre>
<p>
        <img title="查看服务器是否被DDOS攻击的方法" alt="查看服务器是否被DDOS攻击的方法" src="https://zhuji.jb51.net/uploads/img/202305/28454584444bfef0236b6fb054e82347.jpg"><img title="查看服务器是否被DDOS攻击的方法" alt="查看服务器是否被DDOS攻击的方法" src="https://zhuji.jb51.net/uploads/img/202305/f9578d601bcb7729b74bddbebd482595.jpg"></p>
<p class="maodian"></p><h2>
        第四种类型:TCP洪水攻击</h2>
<p>
        A.CPU占用很高</p>
<p>
        B.netstat –na,若观察到大量的<strong>ESTABLISHED的连接状态 单个IP高达几十条甚至上百条</strong>,属于正常。 <strong>查看TCP端口连接数</strong></p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">查看网络连接总数
<span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">netstat</span> <span class="token expression"><span class="token operator">-</span>an <span class="token operator">|</span>wc <span class="token operator">-</span>l</span></span>

查看某个特定ip的连接数
<span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">netstat</span> <span class="token expression"><span class="token operator">-</span>an <span class="token operator">|</span>grep <span class="token number">8.8</span><span class="token number">.8</span><span class="token number">.8</span> <span class="token operator">|</span>wc <span class="token operator">-</span>l</span></span>

查看连接数等待time_wait状态连接数
<span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">netstat</span> <span class="token expression"><span class="token operator">-</span>an <span class="token operator">|</span>grep TIME_WAIT<span class="token operator">|</span>wc <span class="token operator">-</span>l</span></span>

查看建立稳定连接数量
<span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">netstat</span> <span class="token expression"><span class="token operator">-</span>an <span class="token operator">|</span>grep ESTABLISHED <span class="token operator">|</span>wc <span class="token operator">-</span>l</span></span>

查看不同状态的连接数
<span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">netstat</span> <span class="token expression"><span class="token operator">-</span>an <span class="token operator">|</span> awk </span><span class="token string">'/^tcp/ {++y[$NF]} END {for(w in y) print w, y}'</span></span>

查看每个ip跟服务器建立的连接数
<span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">netstat</span> <span class="token expression"><span class="token operator">-</span>nat<span class="token operator">|</span>awk </span><span class="token string">'{print$5}'</span><span class="token expression"><span class="token operator">|</span>awk <span class="token operator">-</span>F <span class="token operator">:</span> </span><span class="token string">'{print$1}'</span><span class="token expression"><span class="token operator">|</span>sort<span class="token operator">|</span>uniq <span class="token operator">-</span>c<span class="token operator">|</span>sort <span class="token operator">-</span>rn</span></span>
(PS:正则解析:显示第<span class="token number">5</span>列,<span class="token operator">-</span>F <span class="token operator">:</span> 以:分割,显示列,sort 排序,uniq <span class="token operator">-</span>c统计排序过程中的重复行,sort <span class="token operator">-</span>rn 按纯数字进行逆序排序)

查看每个ip建立的ESTABLISHED<span class="token operator">/</span>TIME_OUT状态的连接数
<span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">netstat</span> <span class="token expression"><span class="token operator">-</span>nat<span class="token operator">|</span>grep ESTABLISHED<span class="token operator">|</span>awk </span><span class="token string">'{print$5}'</span><span class="token expression"><span class="token operator">|</span>awk <span class="token operator">-</span>F <span class="token operator">:</span> </span><span class="token string">'{print$1}'</span><span class="token expression"><span class="token operator">|</span>sort<span class="token operator">|</span>uniq <span class="token operator">-</span>c<span class="token operator">|</span>sort <span class="token operator">-</span>rn</span></span>
</code></pre>
<p>
        <strong>以下是我自己用VPS测试的结果:</strong></p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">root<span class="token operator">:</span><span class="token operator">~</span># netstat <span class="token operator">-</span>ntu <span class="token operator">|</span> awk <span class="token string">'{print $5}'</span> <span class="token operator">|</span> cut <span class="token operator">-</span>d<span class="token operator">:</span> <span class="token operator">-</span>f1 <span class="token operator">|</span> sort <span class="token operator">|</span> uniq <span class="token operator">-</span>c <span class="token operator">|</span> sort <span class="token operator">-</span>n
<span class="token number">1</span> <span class="token number">114.226</span><span class="token number">.9</span><span class="token punctuation">.</span>xx
<span class="token number">1</span> <span class="token number">174.129</span><span class="token number">.237</span><span class="token punctuation">.</span>xx
<span class="token number">1</span> <span class="token number">58.60</span><span class="token number">.118</span><span class="token punctuation">.</span>xx
<span class="token number">1</span> Address
<span class="token number">1</span> servers<span class="token punctuation">)</span>
<span class="token number">2</span> <span class="token number">118.26</span><span class="token number">.131</span><span class="token punctuation">.</span>xx
<span class="token number">3</span> <span class="token number">123.125</span><span class="token number">.1</span><span class="token punctuation">.</span>x
</code></pre>
<p>
        <img title="查看服务器是否被DDOS攻击的方法" alt="查看服务器是否被DDOS攻击的方法" src="https://zhuji.jb51.net/uploads/img/202305/0af7ab8c6a15a38e2cd30bb6dc803693.jpg"> 每个IP几个、十几个或几十个连接数都还算比较正常,如果像上面成百上千肯定就不正常了。</p>
<p>
        上述所讲到的判断分析,让我们能准确的判断存在的问题是什么,怎么第一时间来解决问题。让我们能更好的维护我们的网站安全。</p>
<p class="maodian"></p><h3>
        TCP洪水攻击检测</h3>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)"><span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">tail</span> <span class="token expression"><span class="token operator">-</span>f <span class="token operator">/</span>var<span class="token operator">/</span>log<span class="token operator">/</span>messages</span></span>

Apr <span class="token number">18</span> <span class="token number">11</span><span class="token operator">:</span><span class="token number">21</span><span class="token operator">:</span><span class="token number">56</span> web5 kernel<span class="token operator">:</span> possible SYN flooding on port <span class="token number">80.</span> Sending cookies<span class="token punctuation">.</span>
</code></pre>
<p>
        检查连接数增多,并且SYN_RECV 连接特别多:</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">检查连接数增多,并且SYN_RECV 连接特别多:
<span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">netstat</span> <span class="token expression"><span class="token operator">-</span>n awk </span><span class="token string">'/^tcp/ { S[$NF]} END {for(a in S) print a, S}'</span></span>

TIME_WAIT <span class="token number">16855</span>

CLOSE_WAIT <span class="token number">21</span>

SYN_SENT <span class="token number">99</span>

FIN_WAIT1 <span class="token number">229</span>
</code></pre>
<p>
        根据经验,正常时检查连接数如下:</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)"><span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">netstat</span> <span class="token expression"><span class="token operator">-</span>n awk </span><span class="token string">'/^tcp/ { S[$NF]} END {for(a in S) print a, S}'</span></span>
</code></pre>
<p>
        <img title="查看服务器是否被DDOS攻击的方法" alt="查看服务器是否被DDOS攻击的方法" src="https://zhuji.jb51.net/uploads/img/202305/1bac385324f760973691b980cf1e26bd.jpg"> 根据netstat查看到的对方IP特征:</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)"><span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">netstat</span> <span class="token expression"><span class="token operator">-</span>na grep SYN_RECV more</span></span>
</code></pre>
<p>
        <img title="查看服务器是否被DDOS攻击的方法" alt="查看服务器是否被DDOS攻击的方法" src="https://zhuji.jb51.net/uploads/img/202305/a94ba0d6a22d91225541c9e926781a1a.jpg"> 以下配置,第一段参数是最重要的,第二段参数是辅助的,其余参数是其他作用的:</p>
<pre class="set-code-hide prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)"><span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">vi</span> <span class="token expression"><span class="token operator">/</span>etc<span class="token operator">/</span>sysctl<span class="token punctuation">.</span>conf</span></span>

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_synack_retries<span class="token operator">=</span><span class="token number">0</span>

#半连接队列长度

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_max_syn_backlog<span class="token operator">=</span><span class="token number">200000</span>

#系统允许的文件句柄的最大数目,因为连接需要占用文件句柄

fs<span class="token punctuation">.</span>file<span class="token operator">-</span>max<span class="token operator">=</span><span class="token number">819200</span>

#用来应对突发的大并发connect 请求

net<span class="token punctuation">.</span>core<span class="token punctuation">.</span>somaxconn<span class="token operator">=</span><span class="token number">65536</span>

#最大的TCP 数据接收缓冲(字节)

net<span class="token punctuation">.</span>core<span class="token punctuation">.</span>rmem_max<span class="token operator">=</span><span class="token number">1024123000</span>

#最大的TCP 数据发送缓冲(字节)

net<span class="token punctuation">.</span>core<span class="token punctuation">.</span>wmem_max<span class="token operator">=</span><span class="token number">16777216</span>

#网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目

net<span class="token punctuation">.</span>core<span class="token punctuation">.</span>netdev_max_backlog<span class="token operator">=</span><span class="token number">165536</span>

#本机主动连接其他机器时的端口分配范围

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>ip_local_port_range<span class="token operator">=</span><span class="token number">1000065535</span>
</code></pre>
<p>
        <strong>使配置生效:</strong></p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)"><span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">sysctl</span> <span class="token expression"><span class="token operator">-</span>p</span></span>

注意,以下参数面对外网时,不要打开。因为副作用很明显,具体原因请google,如果已打开请显式改为<span class="token number">0</span>,然后执行sysctl <span class="token operator">-</span>p关闭。因为经过试验,大量TIME_WAIT状态的连接对系统没太大影响:

#当出现 半连接 队列溢出时向对方发送syncookies,调大 半连接 队列后没必要

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_syncookies<span class="token operator">=</span><span class="token number">0</span>

<span class="token macro property"><span class="token directive-hash">#</span><span class="token expression">TIME_WAIT状态的连接重用功能</span></span>

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_tw_reuse<span class="token operator">=</span><span class="token number">0</span>

#时间戳选项,与前面net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_tw_reuse参数配合

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_timestamps<span class="token operator">=</span><span class="token number">0</span>

<span class="token macro property"><span class="token directive-hash">#</span><span class="token expression">TIME_WAIT状态的连接回收功能</span></span>

net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_tw_recycle<span class="token operator">=</span><span class="token number">0</span>
</code></pre>
<p class="maodian"></p><h3>
        防御TCP洪水攻击方法</h3>
<p>
        <strong>通过调整tcp参数来防范DDOS攻击</strong> sysctl -a | grep syn 看到:SYN相关的配置 net.ipv4.tcp_max_syn_backlog = 1024</p>
<p>
        net.ipv4.tcp_syncookies = 0</p>
<p>
        net.ipv4.tcp_synack_retries = 5</p>
<p>
        net.ipv4.tcp_syn_retries = 5</p>
<p>
        tcp_max_syn_backlog是SYN队列的长度,tcp_syncookies是一个开关,是否打开SYN Cookie 功能,该功能可以防止部分SYN攻击。tcp_synack_retries和tcp_syn_retries定义SYN 的重试次数。加大SYN队列长度可以容纳更多等待连接的网络连接数,打开SYN Cookie功能可以阻止部分 SYN攻击,降低重试次数也有一定效果。 <strong>调整上述设置的方法是:</strong></p>
<p>
        增加SYN队列长度到2048:</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">sysctl <span class="token operator">-</span>w net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_max_syn_backlog<span class="token operator">=</span><span class="token number">2048</span>
</code></pre>
<p>
        打开SYN COOKIE功能:</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">sysctl <span class="token operator">-</span>w net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_syncookies<span class="token operator">=</span><span class="token number">1</span>
</code></pre>
<p>
        降低重试次数:</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">sysctl <span class="token operator">-</span>w net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_synack_retries<span class="token operator">=</span><span class="token number">3</span>

sysctl <span class="token operator">-</span>w net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_syn_retries<span class="token operator">=</span><span class="token number">3</span>
</code></pre>
<p>
        为了系统重启动时保持上述配置,可将上述命令加入到/etc/rc.d/rc.local文件中。</p>
<p>
        <strong>防止同步包洪水(Sync Flood)</strong></p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)"><span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">iptables</span> <span class="token expression"><span class="token operator">-</span>A FORWARD <span class="token operator">-</span>p tcp <span class="token operator">--</span>syn <span class="token operator">-</span>m limit <span class="token operator">--</span>limit <span class="token number">1</span><span class="token operator">/</span>s <span class="token operator">-</span>j ACCEPT</span></span>
</code></pre>
<p>
        也有人写作</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">iptables</span> <span class="token expression"><span class="token operator">-</span>A INPUT <span class="token operator">-</span>p tcp <span class="token operator">--</span>syn <span class="token operator">-</span>m limit <span class="token operator">--</span>limit <span class="token number">1</span><span class="token operator">/</span>s <span class="token operator">-</span>j ACCEPT</span></span>

<span class="token operator">--</span>limit <span class="token number">1</span><span class="token operator">/</span>s 限制syn并发数每秒<span class="token number">1</span>次,可以根据自己的需要修改
</code></pre>
<p>
        防止各种端口扫描</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)"><span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">iptables</span> <span class="token expression"><span class="token operator">-</span>A FORWARD <span class="token operator">-</span>p tcp <span class="token operator">--</span>tcp<span class="token operator">-</span>flags SYN<span class="token punctuation">,</span>ACK<span class="token punctuation">,</span>FIN<span class="token punctuation">,</span>RST RST <span class="token operator">-</span>m limit <span class="token operator">--</span>limit <span class="token number">1</span><span class="token operator">/</span>s <span class="token operator">-</span>j ACCEPT</span></span>
</code></pre>
<p>
        Ping洪水攻击(Ping of Death)</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)"><span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">iptables</span> <span class="token expression"><span class="token operator">-</span>A FORWARD <span class="token operator">-</span>p icmp <span class="token operator">--</span>icmp<span class="token operator">-</span>type echo<span class="token operator">-</span>request <span class="token operator">-</span>m limit <span class="token operator">--</span>limit <span class="token number">1</span><span class="token operator">/</span>s <span class="token operator">-</span>j ACCEPT</span></span>
</code></pre>
<p class="maodian"></p><h2>
        扩展</h2>
<p class="maodian"></p><h3>
        问题1:解决time_wait连接数大量问题</h3>
<p>
        查询到time_wait连接数过多情况下,调整内核参数:/etc/sysctl.conf</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)"><span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">vim</span> <span class="token expression"><span class="token operator">/</span>etc<span class="token operator">/</span>sysctl<span class="token punctuation">.</span>conf</span></span>
添加以下配置文件:
net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_syncookies <span class="token operator">=</span> <span class="token number">1</span>
net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_tw_reuse <span class="token operator">=</span> <span class="token number">1</span>
net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_tw_recycle <span class="token operator">=</span> <span class="token number">1</span>
net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_fin_timeout <span class="token operator">=</span> <span class="token number">300</span>

让配置生效
# <span class="token operator">/</span>sbin<span class="token operator">/</span>sysctl <span class="token operator">-</span>p

参数详解:
<span class="token number">1.</span>net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_syncookies <span class="token operator">=</span> <span class="token number">1</span> 表示开启 syn cookies 。当出现 syn 等待队列溢出时,启用 cookies 来处理,可防范少量 syn <span class="token operator">*</span><span class="token operator">*</span><span class="token operator">*</span>,默认为 <span class="token number">0</span> ,表示关闭;
<span class="token number">2.</span>net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_tw_reuse <span class="token operator">=</span> <span class="token number">1</span> 表示开启重用。允许将 time<span class="token operator">-</span>wait sockets 重新用于新的 tcp 连接,默认为 <span class="token number">0</span> ,表示关闭;
<span class="token number">3.</span>net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_tw_recycle <span class="token operator">=</span> <span class="token number">1</span> 表示开启 tcp 连接中 time<span class="token operator">-</span>wait sockets 的快速回收,默认为 <span class="token number">0</span> ,表示关闭。
<span class="token number">4.</span>net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_fin_timeout 修改系靳默认的 timeout 时间
</code></pre>
<p>
        如果以上配置调优后性能还不理想,可继续修改一下配置:</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)"><span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">vim</span> <span class="token expression"><span class="token operator">/</span>etc<span class="token operator">/</span>sysctl<span class="token punctuation">.</span>conf</span></span>
net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_keepalive_time <span class="token operator">=</span> <span class="token number">1200</span>   #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是<span class="token number">2</span>小时,改为<span class="token number">20</span>分钟。
net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>ip_local_port_range <span class="token operator">=</span> <span class="token number">1024</span> <span class="token number">65000</span>   #表示用于向外连接的端口范围。缺省情况下很小:<span class="token number">32768</span>到<span class="token number">61000</span>,改为<span class="token number">1024</span>到<span class="token number">65000</span>。
net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_max_syn_backlog <span class="token operator">=</span> <span class="token number">8192</span>   #表示SYN队列的长度,默认为<span class="token number">1024</span>,加大队列长度为<span class="token number">8192</span>,可以容纳更多等待连接的网络连接数。
net<span class="token punctuation">.</span>ipv4<span class="token punctuation">.</span>tcp_max_tw_buckets <span class="token operator">=</span> <span class="token number">5000</span>   #表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。
默认为<span class="token number">180000</span>,改为<span class="token number">5000</span>。
对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
</code></pre>
<p class="maodian"></p><h3>
        问题2:ESTABLISHED连接数过大问题</h3>
<p>
        怎么解决请求结束后依然存在大量ESTABLISHED没有被释放</p>
<p>
        初步推断是tomcat服务器回收session时出了问题,这个一般都跟服务器的Timeout设置有联系。</p>
<p>
        <strong>查看tomcat的配置文件 server.xml</strong></p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">Copy
<span class="token operator">&lt;</span>Connector port<span class="token operator">=</span><span class="token string">"8080"</span> protocol<span class="token operator">=</span><span class="token string">"HTTP/1.1"</span>
               connectionTimeout<span class="token operator">=</span><span class="token string">"20000"</span>
               redirectPort<span class="token operator">=</span><span class="token string">"8443"</span> URIEncoding<span class="token operator">=</span><span class="token string">"UTF-8"</span> <span class="token operator">/</span><span class="token operator">&gt;</span>
<span class="token operator">*</span><span class="token operator">*</span><span class="token operator">*</span><span class="token operator">*</span><span class="token operator">*</span>
</code></pre>
<p>
        检查配置得出20000毫秒的时候acceptCount=”100” ,明显不合理,最大连接数也太小了吧。</p>
<p>
        所以进一步优化:</p>
<pre class="prettyprint">
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)">Copy
connectionTimeout<span class="token operator">=</span><span class="token string">"20000"</span> 改为 connectionTimeout<span class="token operator">=</span><span class="token string">"100"</span>
acceptCount<span class="token operator">=</span><span class="token string">"100"</span>改为acceptCount<span class="token operator">=</span><span class="token string">"5000"</span>
</code></pre>
<p class="maodian"></p><h2>
        DDoS攻击防御方法</h2>
<p>
        **1. 过滤不必要的服务和端口:**可以使用Inexpress、Express、Forwarding等工具来过滤不必要的服务和端口,即在路由器上过滤假IP。比如Cisco公司的CEF(Cisco Express Forwarding)可以针对封包Source IP和Routing Table做比较,并加以过滤。只开放服务端口成为目前很多服务器的流行做法,例如WWW服务器那么只开放80而将其他所有端口关闭或在防火墙上做阻止策略。 **2. 异常流量的清洗过滤:**通过DDOS硬件防火墙对异常流量的清洗过滤,通过数据包的规则过滤、数据流指纹检测过滤、及数据包内容定制过滤等顶尖技术能准确判断外来访问流量是否正常,进一步将异常流量禁止过滤。单台负载每秒可防御800-927万个syn攻击包。</p>
<p>
        **3. 分布式集群防御:**这是目前网络安全界防御大规模DDOS攻击的最有效办法。分布式集群防御的特点是在每个节点服务器配置多个IP地址(负载均衡),并且每个节点能承受不低于10G的DDOS攻击,如一个节点受攻击无法提供服务,系统将会根据优先级设置自动切换另一个节点,并将攻击者的数据包全部返回发送点,使攻击源成为瘫痪状态,从更为深度的安全防护角度去影响企业的安全执行决策。</p>
<p>
        **4. 高防智能DNS解析:**高智能DNS解析系统与DDOS防御系统的完美结合,为企业提供对抗新兴安全威胁的超级检测功能。它颠覆了传统一个域名对应一个镜像的做法,智能根据用户的上网路线将DNS解析请求解析到用户所属网络的服务器。同时智能DNS解析系统还有宕机检测功能,随时可将瘫痪的服务器IP智能更换成正常服务器IP,为企业的网络保持一个永不宕机的服务状态。</p>
<p>
        参考链接 :</p>
<p>
        https://www.cnblogs.com/mydomain/archive/2013/05/14/3079002.html</p>
<p>
        https://www.cnblogs.com/hello-sky/p/11598954.html</p>
<p>
        五种简单CC攻击解决方案 http://www.anxinidc.com/faq/anquan/126.html</p>
<p>
        linux检测及防止DDOS攻击的技巧(2) http://www.xitongzhijia.net/xtjc/20150608/50328_2.html</p>
<p>
        TCP洪水攻击(DDOS)诊断与防护http://blog.sina.com.cn/s/blog_6f82cb740101j7z0.html</p>
<p>
        服务器被ddos攻击?分析如何防止DDOS攻击? :https://blog.csdn.net/weixin_34407348/article/details/86013716?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-10.nonecase&amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-10.nonecase</p>
<p>
        DDos攻击的常见方法及防御方法 https://www.cnblogs.com/larry-luo/p/10208074.html</p>
<p>
        原文地址:https://blog.csdn.net/qq_40907977/article/details/106897732</p>
頁: [1]
查看完整版本: 查看服务器是否被DDOS攻击的方法