一、機制
部隊大院、高檔私人住宅區都是在一個被保護起來的范圍內,要想進入只能從各個大門進入,在進入的時候還在門口出示證件、或者是指紋識別、或者是保安身份認證等,只有通過了這些檢查才能進入到大院、住宅區內部。
Linux系統也是這么一個大院,netfilter就是這個大院的圍墻,prerouting、input、output、forward、postrouting就是南大門、北大門、西大門、東大門、西南門。要想從這幾個門進入到內部來,就得過門禁。但是每大門上的門禁制度和方法不一樣,raw(刷指紋)、mangle(打卡)、filter(出示有效證件)、nat(保安確認)。
于是便有了哪些門禁制度制用在哪些大門上的事情了。
南大門(prerouting),可以通過刷指紋(raw)、mangle(打卡)、保安確認(nat)其中的一種便可以進入。
其他大門上也各有各的門禁制度,這些大門被稱為鏈(chain)、這些門禁制度被稱為表(tables).
具體分布如下圖:
需要說明的是,這是centos6.x系列的,7.x系列的input鏈增加了nat
報文的流向可以分為以下三種情況:
到本機某進程的報文:PREROUTING –> INPUT
由本機轉發的報文:PREROUTING –> FORWARD –> POSTROUTING
由本機的某進程發出報文:OUTPUT –> POSTROUTING
二、對鏈的操作
總結起來就是:增、刪、改、查
iptables -t 表名 {-E,-F,-N,-P,-X,-Z} 鏈名
-P:定義鏈的默認策略;其target一般可使用ACCEPT或DROP;
舉例:iptables -P INPUT drop iptables -t nat -P INPUT drop
-N:自定義規則鏈;僅在默認鏈通過某規則進行調用方可生效;因此,每個自定義鏈都有其引用記數;
實例:iptables –t 表名 –N 鏈名(自己定義的鏈的鏈名)
-X:只能刪除自定義的空的引用計數為0的鏈;
實例:iptables -t 表名 -X 鏈(名)
-F:清空指定的鏈,或刪除指定鏈上的規則;
實例:iptables –t 表名 –F 鏈名或者是鏈名 規則編號
-E:重命名自定義的引用計數為0的鏈;
實例:iptables –t 表名 –E 舊的鏈名 新的鏈名
-Z:清空所有鏈或指定鏈上的計數器或者是指定鏈上的指定規則的計算器
實例:iptables –t 表名 –Z [鏈名或鏈名 規則編號]
三、對表的操作
處理動作也可以總結為:增、刪、改、查
4個參數
iptables -t 表名 {-A,-D,-I,-R} 鏈名 其他操作 –à固定格式 不加-t 表名 默認 –t filter
-A:追加規則到指定的鏈尾部;
實例:iptables -t 表名 –A 鏈名 規則定義 –à追加到鏈尾部
-I:插入規則到指定的鏈中的指定位置,默認為鏈首;
實例:iptables -t 表名 -I 鏈名 規則編號 規則定義 à指定插入到鏈的指定位置
當規則編號不寫的時候表示插入成為第一行
-D:刪除指定的鏈上的指定規則;
實例:iptables –t 表名 -D 鏈名 規則定義
實例:iptables –t 表名 -D 鏈名 規則編號
-R:將指定的鏈上的指定規則替換為新的規則;
實例:iptables –t 表名 -R 鏈名 規則編號 規則定義—>就是規則修改,但是修改太麻煩,于是直接替換
PS:一個鏈和表結合的查看的命令
查看
-L:list, iptables [-t table] -L [chain [rulenum]] [options…]
-n:數字格式;
– v:詳細格式信息; -vv, -vvv :v的個數越多顯示信息越詳細
–line-numbers:顯示鏈上的規則的編號;
-x:exactly,顯示計數器的精確值;不做取整處理
實例:iptables –t 表名 -vnL iptables –t 表名 –vnL 鏈名 規則編號
一般的 –L 要和-n組合使用的
計數器:
每條規則以及鏈的默認策略分別有各自的兩個計數器:
(1) 匹配到的報文的個數:pkts
(2) 匹配到的所有報文的大小之積:bytes
[root@localhoast ~]# iptables –nvL
Chain INPUT (policy ACCEPT 4538 packets, 454K bytes)第一個是報文個數 第二個是報文的大小
pkts bytes target prot opt in out source destination
四、對iptables規則的制定操作
固定的格式
iptables -t 表名 大寫字母的命令 鏈名 匹配標準 -j 目標(規則)
匹配條件的分類:
基本匹配條件
擴展匹配條件
隱式擴展
顯式擴展
基本匹配條件
前面的!表示取反 包括:源、目標ip、網卡名稱、協議名稱
-s指定一個源ip的范圍 不寫-s就表示所有的ip
實例:iptable -t 表名 –A 鏈名 -s 192.168.2.0/24
匹配指定主機之外的地址。
#iptables -A FORWARD -s !192.168.0.19
-d指定一個目標ip的范圍 不寫-d表示所有的ip
-p:檢查報文中傳輸層的協議類型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all";
實例:iptables –t表名 –A 鏈名 -p 協議名
iptables -t 表名 -A 鏈名 -p !協議名à除了這個協議之外的全部的協議
-i:檢查報文進入本機時的接口是否符合本處指定的接口;INPUT, FORWARD and PREROUTING ;
實例:iptables –t 表名 –A 鏈名 –i 網卡名稱
-o:檢查報文即將離開本機時經由的接口是否符合本處指定的接口;FORWARD, OUTPUT and POSTROUTING;
實例:iptables –t 表名 –A 鏈名 –o 網卡名稱
-m:顯式指明要使用的擴展模塊;
-j:跳轉目標;
擴展匹配條件
調用netfilter額外模塊實現特殊檢查機制,(使用到相關功能,要使用iptables命令的-m選項來指定調用哪個模塊)
隱式擴展:
-p tcp [-m tcp]
–sport PORT[-PORT]
–dport
–tcp-flag 要檢查標志位列表(用逗號分隔) 必須為1的標志位列表(逗號分隔)
-p icmp [-m icmp]
–icmp-type
0: echo-reply, ping響應
8: echo-request, ping請求
iptables -t filter -A INPUT -p icmp –icmp-type 8 -j DROP iptables -t filter -A INPUT -p tcp –tcp-flags syn,ack,rst,fin syn -j DROP iptables -t filter -A INPUT -p tcp –dport 80 –tcp-flags all none -j DROP |
顯式擴展:
-m 擴展模塊名稱
模塊:iptables,netfilter各擁有一部分代碼
multiport: 多端口匹配,可用于匹配非連續或連續端口;最多指定15個端口;
–source-ports, –sports port[,port,port:port]
–destination-ports, –dports
–ports
iptables -I INPUT -d 192.168.19.128 -p tcp -m multiport –dports 22,80 -j ACCEPT iptables -I OUTPUT -s 192.168.19.128 -p tcp -m multiport –ports 22,80 -j ACCEPT |
iprange: 匹配指定范圍內的地址,匹配一段連續的地址而非整個網絡時有用;
[!] –src-ragne IP[-IP]
[!] –dst-range
iptables -A INPUT -d 192.168.19.128 -p tcp –dport 23 -m iprange –src-range 192.168.19.129-192.168.19.135 -j ACCEPT iptables -A OUTPUT -s 192.168.19.128 -p tcp –sport 23 -m iprange –dst-range 192.168.19.129-192.168.19.135 -j ACCEPT |
string: 字符串匹配,能夠檢測報文應用層中的字符串
–algo {kmp|bm}
–string "STRING"
–hex-string "HEX_STRING": HEX_STRING為編碼成16進制格式的字串;
iptables -I OUTPUT -m string –algo bm –string "sex" -j DROP
time: 基于時間做訪問控制
–datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
–datestop
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
–weekdays day[,day]
iptables -I INPUT -d 192.168.19.128 -p tcp –dport 80 -m time –timestart 08:20 –timestop 18:00 –weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit: 連接數限制,對每IP所能夠發起并發連接數做限制;
[!] –connlimit-above
iptables -A INPUT -d 172.16.100.7 -p tcp –dport 22 -m connlimit –connlimit-above 2 -j DROP
limit: 速率限制
–limit n[/second|/minute|/hour|/day]
–limit-burst n
iptables -A INPUT -d 192.168.19.128 -p icmp –icmp-type 8 -m limit –limit 20/minute –limit-burst 5 -j ACCEPT
state: 狀態檢查
–state 連接追蹤中的狀態:
NEW: 新建立一個會話
ESTABLISHED:已建立的連接
RELATED: 有關聯關系的連接
INVALID: 無法識別的連接
iptables -t filter -A OUTPUT -p tcp –sport 22 -m state –state NEW -j DROP
放行被動模式下的FTP服務:
1、裝載模塊/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
模塊:nf_conntrack_ftp
modprobe nf_conntrack_ftp lsmod | grep nf_conntrack_ftp nf_conntrack_ftp 12913 0 nf_conntrack 79758 3 nf_conntrack_ftp,nf_conntrack_ipv6,xt_state |
2、放行請求報文:
(1)放行NEW狀態對21端口請求的報文;
iptables -A INPUT -p tcp –dport 21 -m –state NEW -j ACCEPT
(2) 放行ESTABLISHED以及RELATED狀態的報文
iptables -A INPUT -m –state ESTABLISHED,RELATED -j ACCEPT
3、放行響應報文:
(1) 放行ESTABLISHED以及RELATED狀態的報文
iptables -A OUTPUT -m –state ESTABLISHED,RELATED -j ACCEPT
由于系統對調整連接追蹤功能所能容納的連接有最大數目,視具體清空調整最大連接數目,或者不啟用此功能
cat /proc/sys/net/nf_conntrack_max
65536
其中當前追蹤的所有連接在/proc/net/nf_conntrack中
/proc/net/nf_conntrack
不同協議或連接類型追蹤時的屬性,/proc/sys/net/netfilter目錄:
TARGET: (-j target)
ACCEPT, REJECT, DROP, SNAT, DNAT, MASQERADE, RETURN, LOG, REDIRECT, MARK
SNAT:
–to-source SIP
DNAT
–to-destination
iptables -t nat -A POSTROUTING -p tcp –dport 23210 -j SNAT –to-source 192.168.19.129 iptables -t nat -A PREROUTING -p tcp –dport 23220 -j DNAT –to-destination 192.168.19.129 iptables -A INPUT -d 192.168.19.128 -p tcp –dport 80 -j LOG –log-prefix "from iptables: |
原創文章,作者:hanlln1,如若轉載,請注明出處:http://www.www58058.com/66533