防火牆iptables如何做匹配
防火牆iptables如何做匹配
iptables如何做匹配
通用匹配:iptables內建功能模組就可以實現的匹配方式
擴充套件匹配:需要依賴額外的模組才能實現匹配
一.通用匹配
-s:指定源ip
-d:指定目標ip
-i:指定進入資料包所經過網絡卡名稱
-o:指定發出資料包所經過網絡卡名稱
案例:允許10.220.5.254所傳送過來的資料包 # iptables -t filter -A INPUT -s 10.220.5.254 -j ACCEPT 案例:禁止10.220.5.254所傳送過來的任意資料包 # iptables -t filter -A INPUT -s 10.220.5.254 -j DROP 案例:禁止當前主機給10.220.5.3傳送資料包 # iptables -A OUTPUT -d 10.220.5.3 -j DROP 案例:允許從eth0進入的資料包,且資料包的源ip 是10.220.5.3 目標ip是10.220.5.191 # iptables -A INPUT -s 10.220.5.3 -d 10.220.5.191 -i eth0 -j ACCEPT
二.擴充套件匹配:在匹配的時候需要用到額外的功能模組
隱式擴充套件:不需要手動指定呼叫的模組,系統會自動載入模組
顯式擴充套件:必須手動指定模組名稱才可以
1.隱式匹配
-p 協議
-p tcp
-p udp
-p icmp
1)對於icmp協議的隱式匹配
副檔名稱:
icmp
格式:
-p icmp --icmp-type
ping的資料包協議是icmp協議
type
0:應答包
8:請求包
案例:單向ping(點到點) 可以從10.220.5.1 ping 10.220.5.182 禁止從10.220.5.182 ping 10.220.5.1 實現: iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -A OUTPUT -p icmp --icmp-type 8 -s 10.220.5.1 -d 10.220.5.182 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 0 -s 10.220.5.182 -d 10.220.5.1 -j ACCEPT 案例:單向ping(一對多) 可以從10.220.5.1 ping 其他主機 禁止其他主機ping 10.220.5.1 實現 iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -A OUTPUT -p icmp --icmp-type 8 -s 10.220.5.1 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 0 -d 10.220.5.1 -j ACCEPT 基本思路: 禁止所有、允許個別 允許所有、禁止個別
2)對於tcp協議的隱式擴充套件
副檔名稱
tcp
用法:
-p tcp 選項
選項:
–sport:源埠
–dport:目標埠
–tcp-flags list1 list2:根據tcp包中的標誌位進行匹配
–syn:等同[–tcp-flags syn,ack,fin syn 匹配syn=1 ack=0 fin=0的包]
案例:讓所有主機可以訪問10.220.5.1上的網站,但是禁止10.220.5.191訪問網站 iptables -A INPUT -p tcp --dport 80 -d 10.220.5.1 -j ACCEPT iptables -A OUTPUT -p tcp --sport 80 -s 10.220.5.1 -j ACCEPT ipatbles -I INPUT -p tcp --dport 80 -s 10.220.5.191 -j DROP iptables -I OUTPUT -p tcp --sport 80 -d 10.220.5.191 -j DROP
–tcp-flags list1 list2:
作用:根據tcp包中的標誌位進行匹配
說明:
list1:指定對哪幾個標誌位做匹配
list2:指定在list1中哪幾個標誌位必須為1,在list2中沒有出現的哪個標誌為必須為0
–tcp-flags syn,ack,fin syn 匹配syn=1 ack=0 fin=0的包
–tcp-flags syn,ack,fin syn,ack 匹配syn=1 ack=1 fin=0的包
–tcp-flags syn,ack,fin ack 匹配ack=1 syn=0 fin=0的包
案例:只執行從10.220.5.182傳送連線httpd請求
# iptables -A INPUT -s 10.220.5.182 -p tcp --dport 80 --tcp-flags ack,fin,syn syn -j ACCEPT
3.)對於udp協議的隱式擴充套件
-p udp --sport|–dport
iptables的連線狀態追蹤模組
作用:記錄當前每個客戶端(ip)連線情況(請求連線、成功連線、等待斷開…)
名稱:nf_conntrack
記錄的資訊儲存在:/proc/net/nf_conntrack,事實上儲存在記憶體中,因此會佔用額外的記憶體空間
啟用基於nf_conntrack的狀態追蹤:檢視nat表的規則即可
狀態追蹤表被填滿報錯:nf_conntrack: table full, dropping packet.
解決狀態追蹤表被填滿導致使用者無法請求
1. 直接關閉防火牆
2. 關閉追蹤功能
3. 調大狀態追蹤表的條目數:/proc/sys/net/nf_conntrack_max
4. 縮短連線斷開超時時間:/proc/sys/net/netfilter/.timeout.
5. 設定對於一些特定請求不做狀態追蹤(raw)
iptables -t raw -I PREROUTING -p tcp --dport 80 -j NOTRACK
iptables -t raw -I OUTPUT -p tcp --sport 80 -j NOTRACK
設定的過大:
導致記憶體空間浪費
設定的太小:
每個連線的使用者資訊都會記錄在這個檔案中,如果該檔案空間滿了,會導致新使用者無法建立連線
通常被植入的木馬程式(後門)會開啟一個隨機埠,等待黑客來連線
對於80埠
正常進入資料
建立連線
syn=1 ack=0
正常傳輸
syn=0 ack=1
正常出去的資料
連線連線
syn=1 ack=1
正常傳輸
syn=0 ack=1
反彈式木馬
建立連線–向外發
syn=1 ack=0
修改核心引數
1. echo “num” > /proc* /sys*
立刻生效,但是臨時有效
2. vim /etc/sysctl.conf
寫法格式:
將偽檔案系統中的 /proc/sys/省略、後面內容中的/替換為.即可
比如:/proc/sys/net/nf_conntrack_max 設定為 6553500
寫法:net.nf_conntrack_max = 6553500
啟用:sysctl -p
2.顯示擴充套件
注意:用顯式擴充套件的時候,必須指定擴充套件功能所依賴模組的名稱
指定:
-m 副檔名稱 --options-xxx
顯示擴充套件1:state
作用:根據nv_conntrack的記錄來對連線進行規則匹配,是根據連線記錄中的狀態資訊做匹配
狀態:
NEW:表示新的連線請求(syn=1 ack=0 fin=0)
三次握手的第一次
ping請求的第一包
udp通訊的第一個包
ESTABLISHED:連線建立完成狀態下所傳遞的資料包(syn=0 ack=1 fin=0)
INVALID:非法連線
RELATED:相關聯的連線
-m state --state NEW -j ACCEPT
-m state --state NEW,ESTABLISHED -j ACCEPT
案例:對主機做安全加固
# 1. 將預設規則改為DROP
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# 2. 限制只有從10.220.5.182可以登入ssh
# iptables -A INPUT -p tcp --dport 22 -s 10.220.5.182 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 22 -d 10.220.5.182 -j ACCEPT
# 3. 實現單向可ping
# iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# 4. 讓所有人都可以訪問web站點
# iptables -A INPUT -m state --state NEW,ESTABLISHED -p tcp --dport 80 -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT
顯示擴充套件2:multiport
作用:對連續或者離散的埠做匹配
選型:
–sports port[,port|,port:port]…
–dports port[,port|,port:port]…
–ports port[,port|,port:port]…
例子:
--sport 80,22,3306
--sport 80:1024
--sport 80,22,23:1024
例子:
允許讓10.220.5.182訪問本機的80 22 443 3389 3306埠
iptables -A INPUT -s 10.220.5.182 -p tcp -m multiport --dports 22,80,443,3389,3306 -m state --state NEW,ESTABLISHED -j ACCEPT
顯示擴充套件3:iprange
作用:用於對ip地址的範圍做匹配
選項
–src-range from[-to]
–dst-range from[-to]
案例:5.1~5.100無法訪問web
iptables -I INPUT -p tcp --dport 80 -m iprange --src-range 10.220.5.1-10.220.5.100 -j DROP
iptables -I INPUT -p tcp --dport 80 -m iprange ! --src-range 10.220.5.1-10.220.5.100 -j ACCEPT
顯示擴充套件4:mac
[!] --mac-source address
顯示擴充套件5:limit
作用:限速
–limit rate[/second|/minute|/hour|/day]:給保安發新的門禁卡的時間間隔()
–limit-burst number:指定保安手裡初始狀態下有幾張門禁卡(設定的是峰值、最大併發值)
例子:
每20分鐘可以通過一個數據包
-m limit --limit 3/hour --limit-burst 5
案例:實現每分鐘可以傳送10個ping包,峰值是7
# iptables -A INPUT -p icmp -m limit --limit-burst 7 --limit 10/minute -j ACCEPT
案例:防暴力破解。限制登入22埠的請求的頻率(限制1小時只能嘗試登入ssh5次)
# iptables -A INPUT -s 10.220.5.182 -p tcp --dport 22 -m state --state NEW -m limit --limit 5/hour --limit-burst 5 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -s 10.220.5.182 -j ACCEPT
案例:限制每個客戶端在1分鐘之內只能向80埠傳送10次syn請求
# iptables -A INPUT -p tcp --dport 80 -m limit --limit 10/minute --limit-burst 3 -m state --state NEW -j ACCEPT
顯示擴充套件6:string
作用:對資料包中的字元型別的內容做檢查
選項
–algo {bm|kmp}:指定匹配字串所用的演算法
–string “xxxx”:指定所檢查的字串
例子:限制只能從10.220.5.182登入後臺頁面(admin.php)
iptables -A INPUT -s 10.220.5.182 -m string --algo bm --string "admin.php" -j ACCEPT
顯示擴充套件7:connlimit
作用:限制一個客戶端可以同時與當前主機建立幾個連結
[!] --connlimit-above n
案例:限制每個IP可以同時登入5個ssh
方案1:
# iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 5 -j DROP <<< 匹配併發連線在5個以上的情況
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
方案2:
#iptables -A INPUT -p tcp --dport 22 -m connlimit ! --connlimit-above 5 -j ACCEPT
案例:限制每個客戶端只能與80埠併發建立10個連線
# iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -m connlimit !--connlimit-above 10 -j ACCEPT
拒絕服務攻擊(Dos)
分散式拒絕服務工具(DDOS)
顯示擴充套件8:recent
作用:
–name name:指定一個用於記錄用登入次數等資訊的檔名(記錄sip、幾個包、時間戳)
–set:將客戶端的地址加入到name所指定的哪個檔案中
–remove:將ip地址等資訊從name指定的哪個檔案中刪除
–seconds seconds:指定限制的時間,單位是秒
比如:限制使用者在1小時只能登入5次,當在連續的1小時之內登入第六次的時候,那麼該使用者就會被禁止登入,持續1h
–hitcount hits:指定一個主機在一定時間只能可以傳送的資料包的數量
–update:檢查name做指定的哪個檔案中是否有當前這個資料包的源地址資訊,如果有,就將計時重試開始,還會將計數器加1
–rcheck:檢查name做指定的哪個檔案中是否有當前這個資料包的源地址資訊,如果有,會將計數器加1
案例:限制客戶端在1h之內只能登入 ssh 5次
# 指定在1h只能當登入此時達到5次之上的,該次連結請求會被丟棄
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name loginSSH --update --seconds 3600 --hitcount 5 -j DROP
# 當用戶請求的埠是22,並且狀態是new的情況下,會將該資料包中的源IP地址等資訊寫入到檔案 loginSSH
# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name loginSSH --set -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT
動作
ACCEPT
DROP
REJECT
DNAT
SNAT
LOG
-j LOG 引數
–log-level level:指定記錄哪個級別的日誌資訊
–log-prefix prefix:指定日誌系想你中的字首
日誌的級別:數字越小,級別越高、事件越嚴重
7:除錯級別 DEBUG
6:通知 INFO
5:注意 NOTICE
4:警告 WARNING
3:錯誤 ERR
2:臨界 CRIT
1:警戒 ALERT
0:致命 EMEGR
建議:每個服務用自己單獨的一個日誌檔案
iptables預設日誌: /var/log/messages
修改iptables的日誌檔案位置:
# echo "kern.warning /var/log/kernel.log ">>/etc/rsyslog.conf
# service rsyslog restart