Linux iptables防火牆詳解 + 配置抗DDOS***策略實戰

inux iptables防火牆詳解 + 配置抗DDOS***策略實戰

 

Linux 內核中很早就實現了網絡防火牆功能,在不同的Linux內核版本中,使用了不同的軟件實現防火牆功能。
在2.0內核中,防火牆操作工具叫:ipfwadm
在2.2內核中,防火牆操作工具叫:ipchains
在2.4以後的內核,防火牆操作工具叫:iptables

ipfwadm 和 ipchains 比較老,已成歷史版本,本章主要介紹Iptables


一、iptable 操作命令參數詳解

-A  
APPEND,追加一條規則(放到最後)
例如: 
iptables -A INPUT -j ACCEPT  
允許所有訪問本機 IP 的數據包通過


-I 
 INSERT,插入一條規則 
例如: 
iptables -I INPUT -j DROP 
在 filter 表的 INPUT 鏈裏插入一條規則(插入成第 1 條)


-D 
DELETE,刪除一條規則 
iptables -D INPUT 3(按號碼匹配) 
刪除 filter 表 INPUT 鏈中的第三條規則(不管它的內容是什麼)


-R 
REPLACE,替換一條規則
例如: 
iptables -R INPUT 9 -j ACCEPT 
將原來編號爲 9 的規則內容替換爲“-j ACCEPT”


-P 
POLICY,設置某個鏈的默認規則
例如: 
iptables -P INPUT DROP 
設置 filter 表 INPUT 鏈的默認規則是 DROP


-F 
FLUSH,清空規則
例如
iptables -F
清空 filter 表中的所有規則

-p
protocol  比對通訊協議
例如
iptables -A INPUT -p tcp
比對通訊協議類型是否相符

-s   
src, source
例如
iptables -I INPUT -s 172.16.0.201 -j DROP
用來比對封包的來源 IP,可以比對單機或網絡,比對網絡時請用數字來表示屏蔽,例屏蔽:172.16.0.201 IP訪問,所有數據都將丟棄


--tcp-flags  比對 TCP
例如
iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
TCP狀態旗號包括:SYN(同步)、ACK(應答)、FIN(結束)、RST(重設)、URG(緊急)、PSH(強迫推送)
等均可使用於參數中,除此之外還可以使用關鍵詞 ALL 和 NONE 進行比對


--icmp-type
例如:
iptables -A INPUT -p icmp --icmp-type 8
用來比對 ICMP 的類型編號,可以使用代碼或數字編號來進行比對。 案例ICMP類型是:8


-m limit --limit
例如
iptables -A INPUT -m limit --limit 3/sec
用來比對某段時間內封包的平均流量,上面的例子是用來比對每秒平均流量是否超過一次 3 個封包。


配置文件位置:
/etc/sysconfig/iptables

iptables 管理服務命令
開啓  service iptables start
關閉  service iptables stop
重起  service iptables restart

 

二、案例講解

本例中的規則將會阻止來自某一特定IP範圍內的數據包,因爲該IP地址範圍被管理員懷疑有大量惡意***者在活動
如何判斷服務是否受***?
1.ping測試服務是否丟掉? 掉包幾鍾可能原因: 你服務受***、機房上層線路受***、互聯網上某個路由不穩定、機器服務/硬件問題(較少)
2.可以搭建流量檢查服務來監控服務網絡流量 如:Cacti 、MRTG 2種較出名的流量監控 ,但都不是實時的!一般5分鐘探測一次
3.在linux上可以用一些腳本代碼來監控網卡的實時流量、


查看實時流量腳本 
用vi創建個腳本文件,將以下代碼複製進去.賦予權限,運行腳本監測

#!/bin/bash
while [ "1" ]
do
eth=$1
RXpre=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $2}')
TXpre=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $10}')
sleep 1
RXnext=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $2}')
TXnext=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $10}')
clear
echo  -e  "\t RX `date +%k:%M:%S` TX"
RX=$((${RXnext}-${RXpre}))
TX=$((${TXnext}-${TXpre}))
if [[ $RX -lt 1024 ]];then
RX="${RX}B/s"
elif [[ $RX -gt 1048576 ]];then
RX=$(echo $RX | awk '{print $1/1048576 "MB/s"}')
else
RX=$(echo $RX | awk '{print $1/1024 "KB/s"}')
fi
if [[ $TX -lt 1024 ]];then
 TX="${TX}B/s"

 elif [[ $TX -gt 1048576 ]];then

 TX=$(echo $TX | awk '{print $1/1048576 "MB/s"}')

 else

 TX=$(echo $TX | awk '{print $1/1024 "KB/s"}')

fi

 

echo -e "$eth \t $RX   $TX "

done

 

查看網卡的流量時   rx是接收(receive)    tx是發送(transport)
目前流量正常

 

測試在另外臺虛機上嘗試用軟件不停的訪問本機站點,流量提升

 

 

假如你認爲這流量已是不正常流量,可以用以下命令查看有哪些IP在連接本機80端口,然後進行屏蔽!

netstat -ant | grep ":80" | awk '{printf "%s %s\n",$5,$6}' | sort 

 

假如你認爲0.201IP有可疑,想進行屏蔽,用以下命令

屏蔽流進ip

iptables -I INPUT -s 172.16.0.201 -j DROP

解封屏蔽
iptables -D INPUT -s 172.16.0.201 -j DROP

 

 

 

只屏蔽172.16.0 IP段訪問本機80端口,其他端口可以正常,命令如下:
iptables -I INPUT -p tcp --dport 80 -s 172.16.0.201/24 -j DROP

 

解封屏蔽
iptables -D INPUT -p tcp --dport 80 -s 172.16.0.201/24 -j DROP

 

測試:用172.16.0.2嘗試訪問服務80端口

 

在添加的規則時,REJECT(拒絕)目標和 DROP(放棄)目標這兩種行動有所不同。REJECT 會拒絕目標分組的進入,並給企圖連接服務的用戶返回一個 connection refused 的錯誤消息。DROP 會放棄分組,而對 telnet 用戶不發出任何警告.


命令添加的規則只是臨時生效,重起iptables服務後將會恢復,永久進行保存命令service iptables save或者直接修改配置文件
修改完/etc/sysconfig/iptables 防火牆配置文件,需要重起iptables服務纔會生效

 

三、抗DDOS***完整策略與講解

默認的iptables規則是無法過濾DDOS***數據的,我們需要添加過濾規則實現iptables擁有抗DDOS的能力

以下防火牆規則是本人真實linux 郵局服務器上的防火牆規則,曾受過100M的SYN DDOS流量***,本人服務器國際帶寬只有20M,
幾乎使整個服務陷於癱瘓狀態,後在iptables上增加了SYN過濾規則後,網絡基本恢復正常,不掉包延時在100左右,正常情況延時45,但服務郵局服務收發沒有任何問題!

系統:Centos 5.5

以上iptable 配置規則講解:


屏蔽 SYN_RECV 的連接
-A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT


限制IP碎片,每秒鐘只允許100個碎片,用來防止DoS***
-A FORWARD -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT


限制ping包每秒一個,10個後重新開始
-A FORWARD -p icmp -m limit --limit 1/sec --limit-burst 10 -j ACCEPT


限制ICMP包迴應請求每秒一個
-A FORWARD -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT


此處自定義一個表
-A FORWARD -j RH-Firewall-1-INPUT


完全接受 loopback interface 的封包
-A RH-Firewall-1-INPUT -i lo -j ACCEPT


允許主機接受 ping
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT


網際網路印表機服務 (可以刪除)
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT


允許連線出去後對方主機迴應進來的封包
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT


允許防火牆開啓指定端口 (本服務器規則開了常用端口 22 21 80 25 110 3306等)
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport port -j ACCEPT

 


限制SSH登陸
只允許在172.16.0.2上使用ssh遠程登錄,從其它計算機上禁止使用ssh
iptables -A INPUT -s 172.16.0.2 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j DROP

 

Iptables 防火牆是一種很強悍的防火牆,只要規則配置好,能大量提高系統安全性,要比windows下的很多防火牆都好,有興趣可以試下!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章