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 | √ | √ | √ |
用圖來表示他們的過濾匹配流程
ⅰ>、入站數據流向: 來自外界的數據包到達防火牆後,首先被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
-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分鐘後便可恢復訪問。