一.iptables基礎認知
二.iptables使用格式
一.iptables簡介
1.Iptabels是與Linux內核集成的包過濾防火墻系統,幾乎所有的linux發行版本都會包含Iptables的功能。如果 Linux 系統連接到因特網或LAN、服務器或連接 LAN 和因特網的代理服務器, 則Iptables有利于在 Linux 系統上更好地控制 IP 信息包過濾和防火墻配置。
2.netfilter/iptables過濾防火墻系統是一種功能強大的工具,可用于添加、編輯和除去規則,這些規則是在做信息包過濾決定時,防火墻所遵循和組成的規則。這些規則存儲在專用的信息包過濾表中,而這些表集成在 Linux 內核中。在信息包過濾表中,規則被分組放在我們所謂的鏈(chain)中。雖然netfilter/iptables包過濾系統被稱為單個實體,但它實際上由兩個組件netfilter 和 iptables 組成。
3.netfilter 組件也稱為內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。通俗的理解為防火墻框架,承載并生效規則。
4.iptables 組件是一種工具,也稱為用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。俗稱為規則管理工具。
netfilter:功能
filter(“防火”):包過濾
NAT:Network Address Translation
mangle:拆解報文,做出修改,而后重新封裝
raw:關閉nat表上啟用的連接追蹤機制
iptables:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
允許用戶自定義規則鏈;它們需要手動關聯至指定的”鉤子“;
功能(表)<–>鉤子
filter:input, forward, output
nat:prerouting, input, output, postrouting
mangle:prerouting, input, forward, output, postrouting
raw:prerouting, output
優先級(由高而低):raw –> mangle –> nat –> filter
iptables原理:
iptables的原理主要是對數據包的控制,看下圖:
(1) 一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉發出去。
(2)如果數據包就是進入本機的,它就會沿著圖向下移動,到達INPUT鏈。數據包到了INPUT鏈后,任何進程都會到 它。本機上運行的程序可以發送數據包,這些數據包會經 過OUTPUT鏈,然后到達POSTROUTING鏈輸出。
(3)如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過 FORWARD鏈,然后到達 POSTROUTING鏈輸出。
規則、表和鏈
1.規則(rules)
規則(rules)其實就是網絡管理員預定義的條件,規則一般的定義為“如果數據包頭符合這樣的條件,就這樣處 理這個數據包”。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議 (TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義 的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火墻的主要工作就是 添加、修改和刪除這些規則。
2.鏈(chains)
鏈(chains)是數據包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一條或數 條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定 義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規 則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定義的默認策略來處理數據包。
3.表(tables)
表(tables)提供特定的功能,iptables內置了4個表,即raw表、filter表、nat表和mangle表,分別用于實現包 過濾,網絡地址轉換和包重構的功能。
(1)RAW表
只使用在PREROUTING鏈和OUTPUT鏈上,因為優先級最高,從而可以對收到的數據包在連接跟蹤前進。一但使用了RAW表,在某個鏈上,RAW表處理完后,將跳過NAT表和ip_conntrack處理,即不再做地址轉換和數包的鏈接跟蹤處理了。
(2)filter表
主要用于過濾數據包,該表根據系統管理員預定義的一組規則過濾符合條件的數據包。對于防火墻而言,主要利用在filter表中指定的規則來實現對數據包的過濾。Filter表是默認的表,如果沒有指定哪個表,iptables就默認使用fileter表來執行所有命令,filter表包含了INPUT鏈(處理進入的數據包),FORWARD鏈(處理轉發的數據包),OUTPUT鏈(處理本地生成的數據包)在filter表中只能允許對數據包進行接受,丟棄的操作,而無法對數據包進行更改。(過濾,“防火墻”意義的核心所在)
(3)nat表
主要用于網絡地址轉換NAT,該表可以實現一對一,一對多,多對多等NAT工作,iptables就是使用該表實現共享上網的,NAT表包含了PREROUTING鏈(修改即將到來的數據包),POSTROUTING鏈(修改即將出去的數據包),OUTPUT(修改路由之前本地生成的數據包)
(4) mangle表
主要用于對指定數據包進行更改,在內核版本xx后的linux版本中該表包含的鏈為:INPUT(處理進入的數據包),FORWORD鏈(處理轉發的數據包),OUTPUT鏈(處理本地生成的數據包)POSTROUTING鏈(修改即將出去的數據包),(修改即將到來的數據包)
4.規則表之間的優先順序:
Raw—mangle—nat—filter
規則鏈之間的優先順序(分三種情況):
第一種情況:入站數據流向
從外界到達防火墻的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),之后會進行路由選擇(判斷該數據包應該發往何處),如果數據包 的目標主機是防火墻本機(比如說Internet用戶訪問防火墻主機中的web服務器的數據包),那么內核將其傳給INPUT鏈進行處理(決定是否允許通 過等),通過以后再交給系統上層的應用程序(比如Apache服務器)進行響應。
第二沖情況:轉發數據流向
來自外界的數據包到達防火墻后,首先被PREROUTING規則鏈處理,之后會進行路由選擇,如果數據包的目標地址是其它外部地址(比如局域網用戶通過網 關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),然后再交給POSTROUTING規則鏈(是否修改數據包的地 址等)進行處理。
第三種情況:出站數據流向
防火墻本機向外部地址發送的數據包(比如在防火墻主機中測試公網DNS服務器時),首先被OUTPUT規則鏈處理,之后進行路由選擇,然后傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
iptables是采用規則堆棧的方式來進行過濾,當一個封包進入網卡,會先檢查 Prerouting,然后檢查目的IP判斷是否需要轉送出去,接著就會跳到INPUT 或 Forward 進行過濾,如果封包需轉送處理則檢查 Postrouting,如果是來自本機封包,則檢查 OUTPUT 以及Postrouting。過程中如果符合某條規則將會進行處理,處理動作除了 ACCEPT、REJECT、DROP、REDIRECT 和MASQUERADE 以外,還多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK等,其中某些處理動作不會中斷過濾程序,某些處理動作則會中斷同一規則鏈的過濾,并依照前述流程繼續進行下一個規則鏈的過濾(注意:這一點與ipchains不同),一直到堆棧中的規則檢查完畢為止。透過這種機制所帶來的好處是,我們可以進行復雜、多重的封包過濾,簡單的說,iptables可以進行縱橫交錯式的過濾(tables)而非鏈狀過濾(chains)。ACCEPT 將封包放行,進行完此處理動作后,將不再比對其它規則,直接跳往下一個規則鏈(nat:postrouting)。
二.iptables使用格式
1.iptables命令格式
iptables [-t 表] -命令 匹配 操作
(1)-t 表
表選項用于指定命令應用于哪個iptables內置表。
(2)命令
命令選項用于指定iptables的執行方式,包括插入規則,刪除規則和添加規則,如下表所示
命令
-P –policy 《鏈名》 定義默認策略
-L –list 《鏈名》 查看iptables規則列表
-v, –verbose:詳細信息
-vv
-n, –numeric:數字格式顯示主機地址和端口號
-x: –exact:顯示計數器的精確值,而非圓整后的數據
–line-numbers:列出規則時,顯示其在鏈上的相應的編號
-S –list-rules [chain]:顯示指定鏈的所有規則
-A –append 《鏈名》 在規則列表的最后增加一條規則
-I –insert 《鏈名》 在指定的位置插入一條規則
-D –delete chain rulenum 《鏈名》 根據規則編號刪除規則
-D –delete chain rule-specification 根據規則本身刪除規則
-R –replace 《鏈名》 替換規則列表中的某條規則
-F –flush 《鏈名》 刪除表中所有規則
-Z –zero 《鏈名》 將表中數據包計數器和流量計數器歸零
注意:每個規則都有兩個計數器
packets:被本規則所匹配到的所有報文的個數
bytes: 被本規則所匹配到的所有報文的大小之和
-X –delete-chain 《鏈名》 刪除用戶自定義的引用計數為0的空鏈
-v –verbose 《鏈名》 與-L他命令一起使用顯示更多更詳細的信息
-N –new-chain chain: 《鏈名》 新建一個自定義的規則鏈:
-E –rename-chain old-chain new-chain 重命令鏈
(3)匹配規則
匹配選項指定數據包與規則匹配所具有的特征,包括源地址,目的地址,傳輸協議和端口號,如下表所示
基本匹配 說明
-i –in-interface 網絡接口名》 指定數據包從哪個網絡接口進入
-o –out-interface 網絡接口名》 指定數據包從哪個網絡接口輸出
-p –proto 協議類型 指定數據包匹配的協議,如TCP、UDP和ICMP等
-s –source 源地址或子網》 指定數據包匹配的源地址
–sport 源端口號》 指定數據包匹配的源端口號
–dport 目的端口號》 指定數據包匹配的目的端口號
-m –math 匹配的模塊 指定數據包規則所用的過濾模塊
擴展匹配條件:
隱式擴展:在使用-p選項指明了特定的協議時,無需再同時使用-m選項指明擴展模塊的擴展機制:
顯示擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制:
隱式擴展:
-p tcp:可直接使用tcp擴展模塊的專用選項:
[!] –source-port,–sport port[:port] 匹配報文源端口;可以給出多個端口,但只能是連續的端口范圍 ;
[!] –destination-port,–dport port[:port] 匹配報文目標端口;可以給出多個端口,但只能是連續的端口范圍 ;
[!] –tcp-flags mask comp 匹配報文中的tcp協議的標志位;Flags are: SYN ACK FIN RST URG PSH ALL NONE;
mask:要檢查的FLAGS list,以逗號分隔;
comp:在mask給定的諸多的FLAGS中,其值必須為1的FLAGS列表,余下的其值必須為0;
–tcp-flags SYN,ACK,FIN,RST SYN
–tcp-flags ALL ALL
–tcp-flags ALL NONE
[!] –syn: –tcp-flags SYN,ACK,FIN,RST SYN
-p udp:可直接使用udp協議擴展模塊的專用選項:
[!] –source-port,–sport port[:port]
[!] –destination-port,–dport port[:port]
[!] –icmp-type {type[/code]|typename}
0/0: echo reply
8/0: echo request
顯示擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制:
1、multiport
以離散或連續的 方式定義多端口匹配條件,最多15個;
[!] –source-ports,–sports port[,port|,port:port]…:指定多個源端口;
[!] –destination-ports,–dports port[,port|,port:port]…:指定多個目標端口;
# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -j ACCEPT
2、iprange
以連續地址塊的方式來指明多IP地址匹配條件;
[!] –src-range from[-to]
[!] –dst-range from[-to]
# iptables -I INPUT -d 172.16。0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -m iprange –src-range 172.16.0.61-172.16.0.70 -j REJECT
3、time
This matches if the packet arrival time/date is within a given range.
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
[!] –weekdays day[,day…]
[!] –monthdays day[,day…]
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–kerneltz:使用內核配置的時區而非默認的UTC;
4、string
This modules matches a given string by using some pattern matching strategy.
–algo {bm|kmp}
[!] –string pattern
[!] –hex-string pattern
–from offset
–to offset
~]# iptables -I OUTPUT -m string –algo bm –string “gay” -j REJECT
5、connlimit
Allows you to restrict the number of parallel connections to a server per client IP address (or client address block).
–connlimit-upto n
–connlimit-above n
~]# iptables -I INPUT -d 172.16.0.7 -p tcp –syn –dport 22 -m connlimit –connlimit-above 2 -j REJECT
6、limit
This module matches at a limited rate using a token bucket filter.
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
~]# iptables -I OUTPUT -s 172.16.0.7 -p icmp –icmp-type 0 -j ACCEPT
7、state
The “state” extension is a subset of the “conntrack” module. “state” allows access to the connection tracking state for this packet.
[!] –state state
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.
NEW: 新連接請求;
ESTABLISHED:已建立的連接;
INVALID:無法識別的連接;
RELATED:相關聯的連接,當前連接是一個新請求,但附屬于某個已存在的連接;
UNTRACKED:未追蹤的連接;
state擴展:
內核模塊裝載:
nf_conntrack
nf_conntrack_ipv4
手動裝載:
nf_conntrack_ftp
追蹤到的連接:
/proc/net/nf_conntrack
調整可記錄的連接數量最大值:
/proc/sys/net/nf_conntrack_max
超時時長:
/proc/sys/net/netfilter/timeout
iptables執行規則時,是從規則表中從上至下順序執行的,如果沒遇到匹配的規則,就一條一條往下執行,如果遇到匹配的規則后,那么就執行本規則,執行后根據本規則的動作(accept,reject,log,drop等),決定下一步執行的情況,后續執行一般有三種情況。
一種是繼續執行當前規則隊列內的下一條規則。比如執行過Filter隊列內的LOG后,還會執行Filter隊列內的下一條規則。
一種是中止當前規則隊列的執行,轉到下一條規則隊列。比如從執行過accept后就中斷Filter隊列內其它規則,跳到nat隊列規則去執行
一種是中止所有規則隊列的執行。
2.iptables規則的動作
iptables處理動作(跳轉目標):
-j targername [per-targer-option]
簡單target:ACCEPT(接受),DROP(丟棄)
擴展target:
REJECT
–reject-with type
LOG
–log-level
–log-perfix
用戶自定義鏈做為target:
REJECT 攔阻該數據包,并返回數據包通知對方,可以返回的數據包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(這個數據包包會要求對方關閉聯機),進行完此處理動作后,將不再比對其它規則,直接中斷過濾程序。 范例如下:
LOG 將數據包相關信息記錄在/var/log中,詳細位置請查閱/etc/syslog.conf配置文件,進行完此處理動作后,將會繼續比對其它規則。列如:
3.保存和載入規則
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE
-n,–noflush:不清除原有規則
-t,–test: 僅分析生成規則集,但不提交
CentOS 6:
保存規則:
service iptables save
保存規則于/etc/sysconfig/iptables文件,覆蓋保存:
重載規則:
service iptables restart
默認重載/etc/sysconfig/iptables文件中的規則
配置文件:/etc/sysconfig/iptables-config
CentOS 7:
(1) 自定義Unit File,進行iptables-restore
(2)firewalldfuwu
(3)自定義腳本
規則優化的思路:
使用自定義鏈管理特定應用的相關規則,模塊化管理規則
(1) 優先放行雙方向狀態為ESTABLISHED的報文;
(2) 服務于不同類別的功能的規則,匹配到報文可能性更大的放前面;
(3) 服務于同一類別的功能的規則,匹配條件較嚴格的放在前面;
(4) 設置默認策略:白名單機制
(a) iptables -P,不建議;
(b) 建議在規則的最后定義規則做為默認策略;
原創文章,作者:xialingfeng,如若轉載,請注明出處:http://www.www58058.com/74736