iptables詳解加實戰

iptables 組件是一種工具,也稱爲用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。分爲四個表和五個鏈,其中表是按照對數據包的操做區分的,鏈是按照不一樣的Hook點來區分的,表和鏈其實是netfilter的兩個維度。web


4個表:filter,nat,mangle,raw,默認表是filter(沒有指定表的時候就是filter表)。表的處理優先級:raw>mangle>nat>filter。
算法

filter:通常的過濾功能,如不-t指定表,則默認filter
ruby

nat:用於nat功能(端口映射,地址映射等)
服務器

mangle:用於對特定數據包的修改
網絡

raw:優先級最高,設置raw時通常是爲了避免再讓iptables作數據包的連接跟蹤處理,提升性能
tcp


5個鏈:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。ide

PREROUTING:數據包進入路由表以前
工具

INPUT:經過路由表後目的地爲本機
性能

FORWARDING:經過路由表後,目的地不爲本機
測試

OUTPUT:由本機產生,向外轉發

POSTROUTIONG:發送到網卡接口以前


用表格表示下他們之間關係

四個表/五個鏈 PREROUTING INPUT FORWARD OUTPUT POSTROUTING
rew



mangle
nat

filter

用圖來表示他們的過濾匹配流程

wKioL1OtI8fAlmXSAAKUi0Lk04o680.jpg

ⅰ>、入站數據流向: 來自外界的數據包到達防火牆後,首先被PREROUTING規則鏈處理(是否修改數據包地址等),以後會進行路由選擇(判斷該數據包應該發往何處),若是數據包的目標地址是防火牆本機(如Internet用戶訪問防火牆主機中的Web服務的數據包),那麼內核將其傳遞給INPUT鏈進行處理(決定是否容許經過等),經過之後再交給系統上層的應用程序(如httpd服務器)進行響應。

ⅱ>、轉發數據流向:來自外界的數據包到達防火牆後,首先被PREROUTING規則處理,以後會進行路由選擇,若是數據包的目標地址是其餘外部地址(如局域網用戶經過網關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),而後再講給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。

ⅲ>、出戰數據流向:防火牆本機向外部地址發送的數據包(如在防火牆主機中測試公網DNS服務時),首先被OUTPUT規則鏈處理,以後進行路由選擇,而後傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。


規則鏈內部各條防火牆規則之間的優先順序:

在數據包經由各條規則鏈的處理過程當中,依次按第1條規則、第2條規則、第3條規則.....的順序進行匹配和處理。若是找到一條可以匹配該數據包的規則,則不會繼續檢查後面的規則(使用LOG記錄日誌的規則除外,下面iptables配置說明)。若是比對完整個規則鏈,也找不到和數據包相匹配的規則,就按照該規則鏈的默認策略進行處理。


經常使用參數:

鏈中規則:

   -A 添加一條規則

   -I 根據給出的規則序號向所選鏈中插入一條或更多規則

   -R 從選中的鏈中取代一條規則

   -D 刪除一條規則


鏈:

   -N 新建一條自定義鏈

   -X 刪除一條自定義鏈

   -E 重命名一條自定義鏈

   -F 清空指定鏈,若是不指定鏈,則清空表中的全部鏈

   -P 設定鏈的默認策略

   -Z 把全部鏈的包及字節的計數器清空


查看:

   -L 查看

   -v 詳細查看

   -vv 更詳細查看

   -x  顯示包和字節計數器的精確值,代替用K,M,G表示的約數。 這個選項僅能用於 '-L -v'命令

   -n  數字輸出。IP地址和端口會以數字的形式打印

   --line-numbers 在每一個列表前加上行號


服務腳本:/etc/rc.d/init.d/iptables

腳本配置文件:/etc/sysconfig/iptables-config

service iptables {status|start|stop|restart|save}

規則的保存位置/etc/sysconfig/iptables


匹配條件:

通用匹配

 -s 源地址匹配

 -d 目標地址匹配

(源地址和目標地址能夠是ip地址,也能夠是網絡地址,網絡地址需加上掩碼,如:192.168.1.0/24 。如需取反則加上!,如:! 192.168.1.11,即除192.168.1.11之外的ip)

 -p 協議匹配,一般有三種協議{icmp|tcp|udp}

 -i IN_INTERFACE 流入接口,注意:一般接的鏈有 PREROUTING、INPUT、FORWARD

 -o OUT_INTERFACE 流出接口,注意:一般接的鏈有 FORWARD、OUTPUT、POSTROUTING


擴展匹配

  隱式擴展

   -p tcp

        --dport PORT

        --sport PORT 

(這裏能夠指定端口片,如:{22:67}指定22端口到67端口,{22: }指定22端口以上,{ :22}指定22端口如下,也可使用!取反{! 22:67})

        --tcp-flage SYN,ACK,RST,FIN SYN 檢查tcp標誌位,SYN爲1,其餘三個爲0(tcp標識位有6個,分別是SYN、ACK、URG、PSH、RST、FIN----創建鏈接、確認、緊急、強迫、復位、結束)

   -p udp

        --sport PORT

        --dport PORT

(這裏同上tcp)

    -p icmp

        --icmp-type typename

(typename有'8'請求、'0'應答等類型,例如配置一個不讓某網段ping本機:iptables -t filter -A INPUT -s 192.168.0.0/24 -p icmp --icmp-type 8 -j DROP )


  顯示擴展

(netfilter 擴展模塊引入的擴展,用於擴展匹配條件,一般須要額外專用選項來定義)

     -m state:用於實現鏈接的狀態檢測模塊

        --state NEW(新建鏈接),ESTABLISHED(確認鏈接),RELATED(關聯鏈接),INVALID(無效鏈接)

     -m multiport :多端口

        --source-port :源端口組

        --destination-ports :目標端口組

        --ports

例如:將同是tcp協議的2二、80端口合併一條規則

[root@david ~ ]#iptables -L INPUT -n
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            172.31.12.4         tcp dpt:22 
ACCEPT     tcp  --  0.0.0.0/0            172.31.12.4         tcp dpt:80 
[root@david ~ ]#iptables -F INPUT
[root@david ~ ]#iptables -I INPUT 1 -d 172.31.12.4 -p tcp -m multiport --destination-ports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT

    -m limit :速率限制

        --limit 速率(如:3/second 表示每秒3個數據包)

        --limit-burst 峯值速率(如100 表示不能超過100個數據包)

例如:限制其餘機子每分鐘同時Ping本機eth0網卡的速率

[root@david ~ 15:52 &1]#iptables -A INPUT -i eth0 -d 172.31.12.4 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
[root@david ~ 15:56 &2]#iptables -A INPUT -i eth0 -d 172.31.12.4 -p icmp --icmp-type 8 -j DROP

wKioL1Oyb7ihv4NgAAF3wVB760o939.jpg

    -m connlimit :鏈接上限

        --connlimit-above n  多於n個表示知足條件  取反要在選項前加!

    -m iprange :ip地址範圍

        --src-range ip-ip

        --dst-range ip-ip 

(例如:-m iprange --src-range 172.31.12.1-172.31.12.50)

     -m mac   mac地址限制

        --mac-source 

     -m string    字符串編碼特徵匹配

        --algo  [bm|kmp]  匹配算法

        --string 「Pattern」 要匹配的字符串

    -m recent   有點相似壞人名單

        --set   添加源地址的包到列表中

        --update  每次創建鏈接都更新列表

         --seconds 必須與—rcheck或—update同時使用

        --hitcount必須與—rcheck或—update同時使用

              

例: 限制ping 192.168.146.3主機的數據包數,平均2/s個,最多不能超過3個

iptables -A INPUT -i eth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT

例:限制SSH鏈接速率(默認策略是DROP)

iptables -I INPUT 1 -p tcp --dport 22 -d 192.168.146.3 -m state --state ESTABLISHED -j ACCEPT

iptables -I INPUT 2 -p tcp --dport 22 -d 192.168.146.3 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT

例:web服務器不響應內容含有yao頁面的請求

iptables –I OUTPUT 1 –s 192.168.146.3 –p tcp –-sport 80 –m string –-algo kmp --string 「yao」 –j DROP

例:利用recent模塊抵禦DOS***

iptables –I INPUT –p tcp –-dport 22 –m connlimit –-connlimit-above 3 –j DROP 單個IP最多鏈接3個會話,

iptables –I INPUT –p tcp –-dport 22 –m state –-state NEW –m recent –-set –-name SSH

只要是新的鏈接請求,就把它加入到SSH列表中

Iptables –I INPUT –p tcp –-dport 22 –m state NEW –m recent –-update –-seconds 300 –-hitcount 3 –-name SSH –j DROP

5分鐘內你的嘗試次數達到3次,就拒絕提供SSH列表中的這個IP任何服務。被限制5分鐘後便可恢復訪問。

相關文章
相關標籤/搜索