iptables
Firewalls:隔離工具,工作於主機或者網絡的邊緣,對於經由的報文根據預先定義的防火規則(識別條件)進行檢測,能夠被規則匹配到的報文實行某種預定義的處理機制的一套組件
硬件防火牆:一部分硬件實現的爲硬件防火牆,另一部分功能基於軟件
軟件防火牆:軟件處理邏輯,運行與通用硬件是實現的防火牆
主機防火牆:工作在主機邊緣的,爲當前主機提供防火功能,在內核中的tcp/ip協議棧
前的閘門
網絡防火牆:工作在網絡邊緣的,爲防火牆背後的網絡工作的防火牆
iptables/netfilter:純軟件實現的,網絡或主機防火牆
netfilter實現防火,過濾工具,防火牆框架;
iptables:規則編寫工具
默認法則:在中間規則處理完後還是沒有處理,將遵循默認法則
hook function:
prerouting:路由發生之前;特殊門(鉤子)
input:進
forward:轉發
output:出
postrouting:路由發生之後
iptables
chain:
PREROUTING:一個鉤子有多個規則
INPUT
FORWARD
OUTPUT
POSTROUTING
規則在鉤子上組成鏈,鏈組成網,一個鉤子可以有多個鏈,形成網,就是iptables
tables:根據功能劃分
filter:過濾,防火牆
nat:網絡地址轉化,用於修改報文(請求|相應)的原地址或目標地址,甚至是端口
mange:拆解報文,對目標IP地址和源IP地址意外的信息做出修改,並重新封裝
raw:關閉nat表上啓用的鏈接追蹤機制
優先級:raw-->mange-->nat-->filter
功能<-->鉤子:
raw:PRETOUTING,OUTPUT
mangle:PREROUTING INPUT FORWARD OUTPUT POSTROUTING
nat: PREROUTING INPUT OUTPUT POSTROOUTING
filter:INPUT FORWARD OUTPUT
報文流向
到本機某進程的報文:PRETOUTING--INPUT
有本機轉發 :PREROUTING--FORWARD--POSTROUTING
有本機某進程發出的:OUTPUT--POSTROUTING
規則的組成部分
匹配條件:
網絡層首部屬性值
傳輸層首部屬性值
附加的條件
處理動作
TCP/IP協議棧:
數據連接層:物理設備到物理設備之間的通信 MAC地址
網絡層:源主機到目標主機之間的通信 IP地址
傳輸層:進程到進程之間的通信 端口
netfilter:位於內核中的tcp/ip協議棧的報文處理框架
iptables:用戶空間的命令行程序
centos5,6:iptables命令編寫
centos7:firewalld
systemctl disable firewalld先關閉這個才能用iptables
iptables命令
添加規則之前需要考量的問題
報文的流經路徑,判斷添加規則到那個鏈上
確認要實現的功能,判斷添加規則到那個表上
要制定的匹配條件,以用於匹配目標報文
規則:根據指定的匹配條件嘗試匹配每個流經此處的報文,一旦匹配成功,就有後邊的指明
的動作進行處理
匹配條件:(小寫的模塊)
基本匹配條件:簡單匹配簡單減產報文首部tcp ip udp 等報文的某屬性進行匹配的
機制
擴展匹配條件:需要藉助於擴展模塊進行的匹配條件指定
處理動作:(大寫的模塊)
基本動作:ACCEPT接受, DROP拒絕 ..
擴展動作:需要藉助擴展模塊進行的動作
iptables/netfilter:包過濾型防火牆;帶狀態檢測的包過濾防火牆,鏈接追蹤,報文的來源於
請求等都能檢測(c7 systemctl status firewalld 保證他關閉,否則會自動生
成好多規則,影響我們)
規則的編寫格式
iptables -t table command chain -m matchname per-match-options -j targetname per-target-options
-t table:默認filter ,其他raw nat mangle
command:
對鏈操作的:
-P:定義默認策略,一般兩種選擇,放行或丟棄 accept和drop 辣椒水老虎凳
都不行的那個比喻
-N:新建一條自定義的規則鏈;除了5個內定的以外的,只有被內建的鏈來調
用才能用,沒辦法自己生效,被-j targetname調用,用完後還會返回內建
鏈
Tips:如何使用自定義鏈:
iptables -N icmp_rules
iptables -I forward -p -icmp -j icmp_rules
自定義鏈是被默認鏈調用生效,只要在-j後面做options就好
執行完成後,沒有繼續額規則,就返回主鏈,手動返回上級連用return ,當一條請求沒有被調用的自定義鏈匹配的時候,使用return,讓他回到主鏈再做匹配
-X:刪除自定義的空鏈;鏈內不能有規則,不能被調用,否則無法被刪除
-F:跟chain |規則|清空指定的鏈;後邊比價參數清空所有鏈
iptables -t nat -F
iptables -F chain
-E:重命名自定義引用計數0的鏈
iptables -E oldname newname
規則:
-A:追加,在制定鏈的尾部,追加一條規則,爲什麼是尾部,因爲規則是自上而下
的,次序非常重要,上邊的拒絕,下邊的再怎麼放行都沒用
-I:-I chain rulenum 插入到制定規則號碼的位置,不指定號碼插入鏈首
-D:刪除指定規則;後邊跟規則的編號就行
-R:將指定的規則替換爲新的規則,不能修改部分條件,必須是整條規則完全替換
查看:
-L:list ,列出表中的鏈上的規則,會把端口IP地址反解
-n:以數值形勢表示,不反解
-v:顯示纖細格式信息
-x:顯示計數器的精確結果
計數器:
規則,以及默認策略有專有的計數器,記錄當前規則所匹配到的
1.報文個數2.字節總數
數值過大還會自動的單位換算,但是會導致精度丟失,
重置規則計數器:
-Z:什麼都不跟表示把所有的置0
chain: 1.內建鏈2.自定義鏈
匹配條件的定義方式:多重條件之間是且的關係,都要滿足
1.基本匹配條件:
[!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的
地址或範圍;
[!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處
指定的地址或範圍;
[!] -p, --protocol protocol:
protocol:{tcp|udp|icmp}
[!] -i, --in-interface name:數據報文的流入接口;INPUT, FORWARD and
PREROUTING
[!] -o, --out-interface name:數據報文的流出接口; FORWARD, OUTPUT and
POSTROUTING接口就是網卡(?)
2.擴展匹配條件
隱式擴展:不用-m選項指出matchname即可使用此match的專用選項進行匹配;
-p tcp:隱含了-m tcp;
[!] --source-port,--sport port[:port]:匹配報文中傳輸層的源端口;
[!] --destination-port,--dport port[:port]:匹配報文中傳輸層的目標端口;
[!] --tcp-flags mask comp
SYN,ACK,FIN,RST,URG,PSH;
mask:要檢查的標誌位列表,以逗號分隔;
comp:必須爲1的標誌位,餘下的出現在mask列表中的標誌位則必須爲
0;不,明白的話想想三次握手,那個爲1表示發送了那個
--tcp-flags SYN,ACK,FIN,RST SYN
[!] --syn:相當於--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:隱含了-m udp:
[!] --source-port,--sport port[:port]:匹配報文中傳輸層的源端口;port[:port]:
值得是端口範圍
[!] --destination-port,--dport port[:port]:匹配報文中傳輸層的目標端口;
-p icmp:隱含了-m icmp:
[!] --icmp-type {type[/code]|typename}
8:echo-request回顯請求
0:echo-reply回顯應答
檢查網絡是不是通常,ping命令就是icmp報文
顯式擴展:必須使用-m選項指出matchname,有的match可能存在專用的選項;
獲取幫助:CentOS 7:man iptables-extensions
CentOS 6:man iptables
1、multiport擴展,以離散或連續的方式定義多端口匹配條件;
[!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
[!] --ports port[,port|,port:port]...:指定多個端口;
2、iprange擴展,以連續的ip地址範圍指明連續的多地址匹配條件;
[!] --src-range from[-to]:源IP地址;--src-range 172.16.100.67-172.16.100.70
[!] --dst-range from[-to]:目標IP地址;
3、string擴展,對報文中的應用層數據做字符串匹配檢測;
[!] --string "pattern":要檢測字符串模式;
[!] --hex-string pattern:要檢測的字符串模式,16進制編碼;
-algo {bm|kmp}
4、time擴展,根據報文到達的時間與指定的時間範圍進行匹配度檢測;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期時間;
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:結束日期時間;
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
~]# iptables -I INPUT -d 172.16.100.67 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Tue,Thu,Sat -j ACCEPT
5、connlimit擴展,根據每客戶端IP做併發連接數匹配;
--connlimit-upto n:連接數數量小於等於n,此時應該允許;
--connlimit-above n:連接數數量大於n,此時應該拒絕;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
6、limit擴展,基於收發報文的速率進行匹配;
--limit rate[/second|/minute|/hour|/day]:平均速率
--limit-burst number:峯值速率
7、state擴展,狀態檢測;連接追蹤機制(conntrack);
[!] --state STATE
INVALID:無法識別的狀態;
ESTABLISHED:已建立的連接;
NEW:新連接;
RELATED:相關聯的連接;
UNTRACKED:未追蹤的連接;
nf_conntrack內核模塊;
追蹤到的連接:/proc/net/nf_conntrack文件中;
能追蹤的最大連接數量定義在:/proc/sys/net/nf_conntrack_max
此值可自行定義,建議必要時調整到足夠大;
不同的協議的連接追蹤的時長:
/proc/sys/net/netfilter/
如何開放被模式的ftp服務:
(1) 裝載追蹤ftp協議的模塊;
# modprobe nf_conntrack_ftp
(2) 放行命令連接
~] # iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state ESTABLISHED -j ACCEPT
~] # iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW -j ACCEPT
(3) 放行數據連接
~] iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED -j ACCEPT
處理動作(目標) -j targetname [per-target-options]
targetname:
ACCEPT:接受;
DROP:丟棄;
REJECT:拒絕;
注意:1.PREROUTING POSTROUTING不能設置規則2.拒絕要越早越好
保存和重載規則:
iptables-save > /PATH/TO/SOME_RULE_FILE
iptables-restore < /PATH/FROM/SOME_RULE_FILE
CentOS 6:
保存規則:
service iptables save
自動保存規則至/etc/sysconfig/iptables文件中;
重載規則:
server iptables restore
從/etc/sysconfig/iptables文件中重載規則;
規則優化:
(1) 可安全放行所有入站及出站,且狀態爲ESTABLISHED的連接;
(2) 服務於同一類功能的規則,匹配條件嚴格的放前面,寬鬆放後面;
(3) 服務於不同類功能的規則,匹配報文可能性較大擴前面,較小放後面;
(4) 設置默認策略;
(a) 最後一條規則設定;
(b) 默認策略設定;