<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[防止SYN洪水攻击的脚本]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[服务器技术]]></category>
<pubDate>Tue, 22 Nov 2011 23:02:41 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	<div class="code"><br/>#! /bin/sh <br/># 防止SYN_RECV攻击的脚本<br/>PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin<br/># 设置某个ip需要被列入黑名单的时间，单位是分钟<br/>TIME_ZONE=30<br/>DATE_ZONE=30<br/>SYN_critical=500<br/>DATE=$(date +%Y%m%d)<br/>HOUR=$(date +%H)<br/>MINITE=$(date +%M)<br/>DATE_AGO=$(date -d &quot;$DATE_ZONE days ago&quot; +%Y%m%d)<br/>DATE_1D_AGO=$(date -d &quot;1 days ago&quot; +%Y%m%d)<br/>TIME_AGO=$(date -d &quot;$TIME_ZONE min ago&quot; +%H%M)<br/># 正常日志<br/>LOG=/home/tools/syn_flood/syn.log<br/># 30分钟前的ip记录<br/>LOG_ago=/home/tools/syn_flood/syn.log.ago<br/># 30分钟以内的ip记录<br/>LOG_current=/home/tools/syn_flood/syn.log.current<br/>#设置轮转日志的大小范围，单位k<br/>LIMIT=16384<br/>export PATH TIME_ZONE DATE_ZONE SYN_critical DATE HOUR MINITE DATE_AGO DATE_1D_AGO TIME_AGO <br/># 将proc文件系统的文件放入tmp<br/>cat /proc/net/tcp6 /proc/net/tcp 2&gt;/dev/null &gt; /tmp/syn_recv<br/># 取到黑名单列表<br/>awk &#039;&#123;print $2,$3,$4&#125;&#039; /tmp/syn_recv &#124; awk &#039;<br/>BEGIN &#123; # set fs<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FS = &quot;&#91; &#93;*&#124;:&quot; ; &#125; <br/># 只处理第五列是SYN_RECV的行<br/>( $5 ~ /03/ )&#123; <br/> # get ipv4addr from file /proc/net/tcp<br/> if (length($1) == 8) <br/> &#123;<br/>&nbsp;&nbsp;rem_addr_ip4 =&nbsp;&nbsp;strtonum(&quot;0x&quot;substr($3,1,2)) ;<br/>&nbsp;&nbsp;rem_addr_ip3 =&nbsp;&nbsp;strtonum(&quot;0x&quot;substr($3,3,2)) ;<br/>&nbsp;&nbsp;rem_addr_ip2 =&nbsp;&nbsp;strtonum(&quot;0x&quot;substr($3,5,2)) ;<br/>&nbsp;&nbsp;rem_addr_ip1 =&nbsp;&nbsp;strtonum(&quot;0x&quot;substr($3,7,2)) ;<br/> &#125;<br/> else<br/> # get ipv6addr from file /proc/net/tcp6<br/> &#123;<br/>&nbsp;&nbsp;rem_addr_ip4 =&nbsp;&nbsp;strtonum(&quot;0x&quot;substr($3,25,2)) ;<br/>&nbsp;&nbsp;rem_addr_ip3 =&nbsp;&nbsp;strtonum(&quot;0x&quot;substr($3,27,2)) ;<br/>&nbsp;&nbsp;rem_addr_ip2 =&nbsp;&nbsp;strtonum(&quot;0x&quot;substr($3,29,2)) ;<br/>&nbsp;&nbsp;rem_addr_ip1 =&nbsp;&nbsp;strtonum(&quot;0x&quot;substr($3,31,2)) ;<br/> &#125; <br/> printf(&quot;%d.%d.%d.%d&#92;n&quot;,rem_addr_ip1,rem_addr_ip2,rem_addr_ip3,rem_addr_ip4); <br/>&#125;&#039; &#124; uniq -c &#124; grep -v &#039;192.168.&#039;&nbsp;&nbsp;&#124; awk&nbsp;&nbsp;&#039;BEGIN&#123;<br/> SYN_critical =&nbsp;&nbsp;ENVIRON&#91;&quot;SYN_critical&quot;&#93;;<br/> DATE = ENVIRON&#91;&quot;DATE&quot;&#93;;<br/> HOUR = ENVIRON&#91;&quot;HOUR&quot;&#93;;<br/> MINITE = ENVIRON&#91;&quot;MINITE&quot;&#93;;<br/>&#125;<br/>( $1 &gt;= SYN_critical )&#123; printf(&quot;&#91; %d %d%d &#93; %s %d&#92;n&quot;,DATE,HOUR,MINITE,$2,$1) &#125;&#039;&nbsp;&nbsp;&gt;&gt; $LOG <br/># 得到旧的ip列表<br/>if &#91; $HOUR = &quot;00&quot; &#93; &amp;&amp; &#91; $MINITE -le 30 &#93;<br/> then<br/> export DATE=$DATE_1D_AGO<br/>fi<br/>awk&nbsp;&nbsp;&#039;BEGIN&#123;<br/> DATE = ENVIRON&#91;&quot;DATE&quot;&#93;;<br/> time_ago = ENVIRON&#91;&quot;TIME_AGO&quot;&#93;;<br/>&#125; <br/>( $2 == DATE &amp;&amp; $3 &lt; time_ago )&#123; print $5 &#125;&#039; $LOG &#124; uniq &gt; $LOG_ago <br/><br/># 得到30分钟内的ip列表<br/>awk&nbsp;&nbsp;&#039;BEGIN&#123;<br/> DATE = ENVIRON&#91;&quot;DATE&quot;&#93;;<br/> time_ago = ENVIRON&#91;&quot;TIME_AGO&quot;&#93;;<br/>&#125; <br/>( $2 == DATE &amp;&amp; $3 &gt; time_ago )&#123; print $5 &#125;&#039; $LOG &#124; uniq &gt; $LOG_current <br/>NUM_LOG_ago=$(wc -l $LOG_ago &#124; awk &#039;&#123;print $1&#125;&#039; ) <br/>NUM_LOG_current=$(wc -l $LOG_current &#124; awk &#039;&#123;print $1&#125;&#039; ) <br/># 看iptables是否运行<br/>IPTAB_STATUS=$(service iptables status &#124; grep -c &#039;Firewall is stopped.&#039;) <br/># 如果30分钟以前有ip被列入黑名单，则删除掉<br/>if &#91; $NUM_LOG_ago -ge 1 &#93;<br/> then<br/>&nbsp;&nbsp;if &#91; $IPTAB_STATUS -eq 0 &#93;<br/>&nbsp;&nbsp; then<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp; for IP in $(cat $LOG_ago)<br/>&nbsp;&nbsp;&nbsp;&nbsp;do<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 确认此ip是否在当前iptables列表中，在则删除该ip<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUM_ip=$(grep -c $IP /etc/sysconfig/iptables)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if &#91; $NUM_ip -ge 1 &#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iptables -D INPUT -s $IP&nbsp;&nbsp;-i eth0 -j DROP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; service iptables save<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br/>&nbsp;&nbsp;&nbsp;&nbsp;done<br/>&nbsp;&nbsp;fi<br/>fi <br/># 处理30分钟内的ip列表，如果不在iptables里，则判断iptables的状态，并加入黑名单 <br/>if &#91; $NUM_LOG_current -ge 1 &#93;<br/> then<br/> # 看iptables是否打开<br/> if &#91; $IPTAB_STATUS -eq 1 &#93;<br/>&nbsp;&nbsp;then<br/>&nbsp;&nbsp;service iptables start<br/> fi<br/> # 把ip加进去<br/> for IP in $(cat $LOG_current)<br/>&nbsp;&nbsp;do<br/>&nbsp;&nbsp; # 确认此ip是否在当前iptables列表中，不在则加进去<br/>&nbsp;&nbsp;&nbsp;&nbsp;NUM_ip=$(grep -c $IP /etc/sysconfig/iptables)<br/>&nbsp;&nbsp;&nbsp;&nbsp;if &#91; $NUM_ip -eq 0 &#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp; then<br/>&nbsp;&nbsp;&nbsp;&nbsp; iptables -A INPUT -s $IP&nbsp;&nbsp;-i eth0 -j DROP<br/>&nbsp;&nbsp;&nbsp;&nbsp; service iptables save<br/>&nbsp;&nbsp;&nbsp;&nbsp;fi<br/>&nbsp;&nbsp;done <br/>fi <br/><br/># 如果iptables列表为空，判断其状态，如果是start ，则stop它<br/> if &#91; $IPTAB_STATUS -eq 0 &#93;<br/>&nbsp;&nbsp;then<br/>&nbsp;&nbsp;# 判断iptables列表是否为空<br/>&nbsp;&nbsp;NUM=$(iptables -L -n &#124; wc -l)<br/>&nbsp;&nbsp;if &#91; $NUM -eq 8 &#93;<br/>&nbsp;&nbsp; then<br/>&nbsp;&nbsp; service iptables stop<br/>&nbsp;&nbsp;fi<br/> fi <br/># 按大小轮转日志，注意，日志轮转都放在晚上1点，这样节省脚本每次运行的if判断开销<br/>################################## 日志轮转&nbsp;&nbsp;#######################################<br/>#if &#91; $HOUR == &quot;01&quot; &#93;<br/># then<br/>#&nbsp;&nbsp;size=$(ls -l -k $LOG &#124; cut -d &quot; &quot; -f 6)<br/>#<br/>#&nbsp;&nbsp;echo &quot;$LOG size is $size, limit is $LIMIT&quot;<br/>#<br/>#&nbsp;&nbsp;if &#91; $size -ge $LIMIT &#93;<br/>#<br/>#&nbsp;&nbsp;&nbsp;&nbsp;then<br/>#<br/>#&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;rolling log file&quot;<br/>#&nbsp;&nbsp;&nbsp;&nbsp;awk&nbsp;&nbsp;&#039;BEGIN&#123;<br/>#&nbsp;&nbsp;&nbsp;&nbsp;DATE = ENVIRON&#91;&quot;DATE&quot;&#93;;<br/>#&nbsp;&nbsp;&nbsp;&nbsp;time_ago = ENVIRON&#91;&quot;TIME_AGO&quot;&#93;;<br/>#&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>#<br/>#&nbsp;&nbsp;&nbsp;&nbsp; ( $1 == DATE &amp;&amp; $3 &gt; time_ago )&#123; print &#125;&#039; $LOG &gt; /tmp/syn_log_tmp<br/>#&nbsp;&nbsp;&nbsp;&nbsp;cp $LOG $LOG.$DATE<br/>#&nbsp;&nbsp;&nbsp;&nbsp;mv -f /tmp/syn_log_tmp $LOG<br/>#<br/>#&nbsp;&nbsp;&nbsp;&nbsp;else<br/>#<br/>#&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;not big enough&quot;<br/>#<br/>#&nbsp;&nbsp;fi<br/>#<br/>#&nbsp;&nbsp;# 按日期轮转日志<br/>#&nbsp;&nbsp;# 如果30天前有日志，说明是该到轮转的时候了<br/>#&nbsp;&nbsp;DATE_NUM=$(grep &quot;$DATE_AGO&quot; $LOG &#124; head &#124; wc -l &#124; awk &#039;&#123;print $1&#125;&#039;)<br/>#&nbsp;&nbsp;if &#91; $DATE_NUM -ge 1 &#93;<br/>#&nbsp;&nbsp; then<br/>#&nbsp;&nbsp;&nbsp;&nbsp;awk&nbsp;&nbsp;&#039;BEGIN&#123;<br/>#&nbsp;&nbsp;&nbsp;&nbsp;DATE = ENVIRON&#91;&quot;DATE&quot;&#93;;<br/>#&nbsp;&nbsp;&nbsp;&nbsp;time_ago = ENVIRON&#91;&quot;TIME_AGO&quot;&#93;;<br/>#&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>#<br/>#&nbsp;&nbsp;&nbsp;&nbsp; ( $1 == DATE &amp;&amp; $3 &gt; time_ago )&#123; print &#125;&#039; $LOG &gt; /tmp/syn_log_tmp<br/>#&nbsp;&nbsp;&nbsp;&nbsp;cp $LOG $LOG.$DATE<br/>#&nbsp;&nbsp;&nbsp;&nbsp;mv -f /tmp/syn_log_tmp $LOG<br/>#<br/>#&nbsp;&nbsp;fi<br/>#<br/>#fi<br/>################################## 日志轮转&nbsp;&nbsp;####################################### <br/><br/></div><br/>Tags - <a href="http://www.dzhope.com/tags/syn%25E6%2594%25BB%25E5%2587%25BB/" rel="tag">syn攻击</a> , <a href="http://www.dzhope.com/tags/syn%25E9%2598%25B2%25E6%258A%25A4%25E8%2584%259A%25E6%259C%25AC/" rel="tag">syn防护脚本</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] 防止SYN洪水攻击的脚本]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>