一、iptables的4表-5鏈
4表:
filter : 對報文做過濾
nat : 網絡地址轉換; 一般爲源地址轉換,目標地址轉換
mangle : 拆解報文,做出修改後,封裝報文
raw : 可以通過啓用連接追蹤機制,來確認哪些訪問的報文之前來過;如果啓用連接追蹤,要儘量使用大內存
優先級從低到高: filter ---> nat --->mangle ---> raw
5鏈
PREROUTING :第一次路由決策做出處理
INPUT: 進入本機內部的
FORWARD: 從本機轉發出去的,需要開啓路由轉發功能;可實現網絡防火牆的功能
OUTPUT:從本機內部發出的
POSTROUTING:第二次路由決策做出處理
路由發生的位置:
報文進入本機後,判斷目標主機
報文離開本機之前,判斷從哪個網卡接口送往下一跳
規則和鏈有計數器 --- 可以通過 #iptables -L -n -v 查看
pkts:由規則或鏈所匹配到的報文的個數
bytes:由規則或鏈匹配到的
二、添加規則時的考量點:
(1)要實現哪種功能:判斷添加在哪張表上
(2)報文流經的路徑:判斷添加在哪個鏈上
鏈:鏈上規則的次序,即爲檢查的次序,因此隱含一定的法則
(1)同類規則(反問同一應用),匹配範圍小的放上面,檢查規則更嚴格,可提高效率
(2)不同類規則(反問不同應用),匹配到報文頻率大的放上面
(3)將那些可由一條規則描述的多個規則合併爲一個規則
(4) 設置默認策略 (白名單--默認爲拒絕)
三、iptables常用選項總結
-t {filter,nat,mangle,raw} : 指定表
-A {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING } :指定向哪個鏈中追加規則
-I {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING } [rulenum] : 指定向哪個鏈中插入規則,可以指定規則的編號,不加編號表示插入到該表的第一行
-D {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING } rulenum :指定刪除哪個鏈中的哪條規則
-R {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING } rulenum :指定替換哪個鏈中的哪條規則
-N 自定義鏈名: 創建一條新的自定義鏈
-Z {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING,自定義鏈} : 將某個或全部鏈ptks和bytes置0;
-X [自定義鏈名] :刪除用戶自定義的規則鏈,必須爲空的規則鏈
-P {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING } target :設置某個鏈的處理策略
-E:rename,重命名自定義鏈;引用計數不爲0的自定義鏈(-j TARGET),無法改名,無法刪除
-F {PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING,自定義鏈}:清空規則鏈; 省略鏈,表示清空指定表上的所有鏈
-L:list,列出指定鏈上的所有規則
-n:以數字格式顯示地址和端口號,不反解
-v:verbose,顯示詳細信息
--line-numbers:顯示規則編號
-x:顯示計數器計數結果的精確值(不自動取整)
四、iptables的規則
組成部分:報文的匹配條件,匹配到之後的處理動作
4.1匹配條件:
①基本匹配
-s : 源ip地址
-d : 目標ip地址
-p {tcp,udp,icmp} : 要匹配的協議,一般使用列出的3種
-i interface : 報文流入的接口
-o interface : 報文流出的接口
②擴展匹配
額外檢查/usr/lib64/xtables/*.so ; 大寫的爲target,小寫爲匹配條件
格式: -m match_name --spec_options
例如: -m tcp --dport 22
隱式擴展:對-p protocol指明的協議進行的擴展,可省略-m選項
-p tcp --dport PORT[-PORT] : 目標端口,可以是單個端口或連續多個端口 --sport PORT[-PORT] : 源端口,可以是單個端口或連續多個端口 --tcp-flags LIST1 LIST2 : 檢查LIST1所指明的所有標誌位,且這其中,LIST2所表示出的所有標記爲必須爲1,而餘下的必須爲0,沒有LIST1中指明的,不作檢查 SYN,ACK,FIN,RST,PSH,URG //tcp協議常用的標誌位 --tcp-flags SYN,ACK,FIN,RST SYN --syn:檢查tcp3次握手的第一次 |
-p udp --dport PORT[-PORT] : 目標端口,可以是單個端口或連續多個端口 --sport PORT[-PORT] : 源端口,可以是單個端口或連續多個端口 |
-p icmp --icmp-type 類型 :可用數字表示; 使用的時候要注意好報文的流向,目標地址和源地址的問題 0 ===> 表示ping應答 ; 8 ===> 表示ping請求 ; |
③顯示擴展:必須使用-m選項指定使用的擴展模塊(# rpm -ql iptables | egrep "[[:lower:]]+.so$")
1、multiport擴展 :以離散方式定義多端口的擴展,最多指定15個
[!] --sports port[,port|,port:port]...:指明多個離散的源端口;
[!] --dports port[,port|,port:port]...:指明多個離散的目標端口;
2、iprange擴展 :指定連續的ip地址範圍
[!] --src-range from[-to]:指明連續的源IP地址範圍;
[!] --dst-range from[-to]:指明連續的目標IP地址範圍;
3、string擴展 :檢查報文中出現的字符串
--algo {bm|kmp} ;指定2種算法之一
--string ‘###’: 指定要匹配的字符串,使用單引號
4、time擴展: 根據報文到達的時間與指定的時間範圍進行匹配
--datestart : 開始日期
--datestop : 結束日期
--timestart hh:mm[:ss] :開始時間
--timestop hh:mm[:ss] : 結束時間
--monthdays [1-31] :一個月中的某天;取值爲1-31
--weekdays day[,day] :一週中的某天;取值爲1-7
5、connlimit擴展: 單ip併發連接數的數量匹配限制
--connlimit-above n : 連接數量大於n;一般要拒絕(默認處理策略爲允許時候使用)
--connlimit-upto n :連接的數據小於等於n;一般要允許 (默認處理策略爲拒絕時使用)
6、limit擴展 : 基於收發報文的速率做檢測的
基於令牌桶過濾器來作速率檢測的
--limit rate[/second | /minute | /hour | /day] :速率
--limit-burst n : 峯值
7、state擴展: 根據連接追蹤機制檢查連接的狀態;記錄連接是否曾經訪問過,無關什麼協議;
--state STATE1, STATE2,... :指定下列4種狀態即可
調整連接追蹤功能所能夠容納的最大連接數量;
/proc/sys/net/nf_conntrack_max //注:這個數值在不得不啓用連接追蹤的情況,一定要調大些
已經追蹤到並記錄下的連接
/proc/net/nf_conntrack (連接追蹤模板)
注:#modprobe nf_conntrack ==>讓內核加載模塊纔可以使用連接追蹤的功能
不同協議或連接類型追蹤的時長
/proc/sys/net/netfilter/
追蹤的連接狀態有4種
NEW : 新發出的請求,連接追蹤模板中不存在此連接相關的信息條目
ESTABLISHD :NEW狀態之後,連接追蹤模板中爲其建立的條目在其建立的條目失效之前的連接狀態
RELATED :有關聯的連接; 有ftp協議的命令連接和數據連接這類有關係的連接
INVALIED : 無法識別的連接
注: 這種狀態追蹤的防火牆機制,能夠防禦反彈式***(只允許出去的報文狀態是ESTABLISHED或RELATED,不允許爲NEW)可以在一定程度上增強安全性,需要打開連接追蹤的功能,而這種功能又在一定程度上會消耗資源並降低效率的;如果不得不使用的話,建議使用大的物理內存。
4.2處理動作:-j target
target:
ACCEPT :允許
DROP :丟棄
REJECT :拒絕
MARK : 防火牆標記
RETURN : 返回調用鏈
REDIRECT : 端口重定向
DNAT : 目標地址轉換
SNAT : 源地址轉換
LOG : 記錄日誌
MASQUERADE :僞裝(主要用於地址轉換)
示例1:允許tcp的22端口;
[root@puppetmaster ~]# iptables -t filter -A INPUT -d 172.16.116.250 -p tcp --dport 22 -j ACCEPT [root@puppetmaster ~]# iptables -t filter -A OUTPUT -s 172.16.116.250 -p tcp --sport 22 -j ACCEPT [root@puppetmaster ~]# iptables -L -n -v Chain INPUT (policy ACCEPT 6 packets, 1838 bytes) pkts bytes target prot opt in out source destination 145 10584 ACCEPT tcp -- * * 0.0.0.0/0 172.16.116.250 tcp dpt:22 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 23 2644 ACCEPT tcp -- * * 172.16.116.250 0.0.0.0/0 tcp spt:22
示例2、修改所有filter表的鏈處理策略爲DROP
[root@puppetmaster ~]# iptables -P INPUT DROP [root@puppetmaster ~]# iptables -P FORWARD DROP [root@puppetmaster ~]# iptables -P OUTPUT DROP
示例3、允許本機ping外部的主機
[root@puppetmaster ~]# iptables -A OUTPUT -s 172.16.116.250 -p icmp --icmp-type 8 -j ACCEPT [root@puppetmaster ~]# iptables -A INPUT -d 172.16.116.250 -p icmp --icmp-type 0 -j ACCEPT [root@puppetmaster ~]# ping 172.16.0.1 PING 172.16.0.1 (172.16.0.1) 56(84) bytes of data. 64 bytes from 172.16.0.1: icmp_seq=53 ttl=64 time=2.57 ms 64 bytes from 172.16.0.1: icmp_seq=54 ttl=64 time=1.98 ms
示例4、顯示擴展multiport應用:放行22、80端口;並刪除上面示例1定義的規則
[root@puppetmaster ~]# iptables -t filter -I INPUT -s 172.16.0.0/16 -d 172.16.116.250 -p tcp -m multiport --dports 22,80 -j ACCEPT [root@puppetmaster ~]# iptables -t filter -I OUTPUT -d 172.16.0.0/16 -s 172.16.116.250 -p tcp -m multiport --sports 22,80 -j ACCEPT [root@puppetmaster ~]# iptables -D INPUT 2 [root@puppetmaster ~]# iptables -D OUTPUT 2 [root@puppetmaster ~]# iptables -L -n -v Chain INPUT (policy DROP 17 packets, 2696 bytes) pkts bytes target prot opt in out source destination 394 28088 ACCEPT tcp -- * * 172.16.0.0/16 172.16.116.250 multiport dports 22,80 5 420 ACCEPT icmp -- * * 0.0.0.0/0 172.16.116.250 icmptype 0 Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 138 15120 ACCEPT tcp -- * * 172.16.116.250 172.16.0.0/16 multiport sports 22,80 70 5880 ACCEPT icmp -- * * 172.16.116.250 0.0.0.0/0 icmptype 8
示例5、修改示例4的規則,只允許172.16.116.1-172.16.116.250地址範圍的主機訪問;放行22,23,80端口
# iptables -R INPUT 1 -d 172.16.116.250 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.116.1-172.16.116.250 -j ACCEPT # iptables -R OUTPUT 1-s 172.16.116.250 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.116.1-172.16.116.250 -j ACCEPT
示例6:禁止訪問含有指定字符串‘bad’的網頁
# vim /var/www/html/test.html <h1>this is a bad test.</h1> [root@puppetmaster ~]# iptables -I OUTPUT -m string --algo kmp --string 'bad' -j REJECT [root@puppetmaster ~]# iptables -L -n -v Chain INPUT (policy DROP 30 packets, 6450 bytes) pkts bytes target prot opt in out source destination 1632 149K ACCEPT tcp -- * * 172.16.0.0/16 172.16.116.250 multiport dports 22,23,80 5 420 ACCEPT icmp -- * * 0.0.0.0/0 172.16.116.250 icmptype 0 Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 40 15464 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "bad" ALGO name kmp TO 65535 reject-with icmp-port-unreachable 1063 179K ACCEPT tcp -- * * 172.16.116.250 172.16.0.0/16 multiport sports 22,23,80 70 5880 ACCEPT icmp -- * * 172.16.116.250 0.0.0.0/0 icmptype 8
示例7 :禁止用戶訪問80端口的web服務,處於測試,全天都不允許
[root@puppetmaster ~]# iptables -I INPUT -d 172.16.116.250 -p tcp --dport 80 -m time --timestart 00:00 --timestop 23:59 -j REJECT
示例8 : 限制22端口的訪問;即同一ip地址最多連接爲3個
[root@puppetmaster ~]# iptables -I INPUT -d 172.16.116.250 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT [root@puppetmaster ~]# iptables -L -n -v Chain INPUT (policy DROP 69 packets, 11013 bytes) pkts bytes target prot opt in out source destination 3 152 REJECT tcp -- * * 0.0.0.0/0 172.16.116.250 tcp dpt:22 #conn src/32 > 3 reject-with icmp-port-unreachable
示例9:使用state狀態追蹤機制進行iptables的相關配置;簡單配置
[root@puppetmaster ~]# iptables -A INPUT -p tcp -m multiport --dports 21:23,80 -m state --state NEW -j ACCEPT [root@puppetmaster ~]# iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT [root@puppetmaster ~]# iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT [root@puppetmaster ~]# iptables -L -n -v Chain INPUT (policy DROP 119 packets, 19174 bytes) pkts bytes target prot opt in out source destination 578 41931 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED 2 104 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 21:23,80 state NEW 1 60 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 state NEW Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 961 102K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
五、如何開放被動模式的ftp服務??實現過程
5.1、 裝載ftp追蹤時的專用模塊
手動裝載模塊 modprobe nf_conntrack_ftp
注:centos6上,如果想啓動iptables服務的時候自動裝載ftp模塊,
需修改 /etc/sysconfig/iptables-config文件中的IPTABLES_MODULES="nf_conntrack_ftp" ;
如果有多個模塊需要裝載,模塊之間用空格分開即可
5.2、 放行請求報文
命令連接: 狀態:NEW, ESTABLISHED
[root@puppetmaster ~]# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT [root@puppetmaster ~]# iptables -A INPUT -p tcp -m multiport --dports 21:23,80 -m state --state NEW -j ACCEPT
數據連接: 狀態: RELATED
[root@puppetmaster ~]# iptables -A INPUT -m state --state RELATED -j ACCEPT
5.3、放行響應報文
狀態:ESTABLISHED
[root@puppetmaster ~]# iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
到此,iptables防火牆的基礎介紹完畢~~ O(∩_∩)O!!!