Iptables
Iptables是屬於網絡層的防火牆,但是並不正真意義上是防火牆,因爲iptables/netfilter是一個組件,iptables只是負責編寫規則並提交給netfilter做執行的規則生成器。Netfiter是在linux內核中TCP/IP協議棧中工作的一個框架,從軟件的角度來將是在TCP/IP協議棧中做了五個鉤子函數,這五個鉤子函數可非常準確的執行iptables所編寫的規則並實現規則中相關的攔截和放行。規則的功能分別爲raw,mangle,nat,filter四種,這些規則統稱爲表;而鉤子函數分爲PREROUTING、INPUT、FORWARD、OUTPUT、POSTOUTING五種,這些鉤子函數統稱爲鏈
鉤子函數是指:
PREROUTING:馬上就要到本機時,簡稱爲路由前
INPUT:到達本機內部的報文必經之路
FORWARD:由本機轉發的報文必經之路
OUTPUT:由本機發出的報文的必經之路
POSTROUTING:馬上就要離開本機,簡稱爲路由後
規則的功能是指:
filter:過濾,定義是否允許通過防火牆
nat:地址轉換,用於轉換源地址和源端口或目標地址和目標端口
mangle:用於修改報文首部某些特性但不修改IP
raw:目標是爲nat表上啓用的連接追蹤功能
表和鏈的對應關係:
filter:INPUT, FORWARD, OUTPUT
nat:PREROUTING(SNAT),POSTROUTING(DNAT),OUTPUT
mangle:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw:PREROUTING, OUTPUT
下爲圖解:
使用iptables編輯完規則後是可以直接生效的,因爲iptables編輯完成以後會自動發往netfilter內,netfilter接收到以後便立即執行
下面說下iptables編寫規則的基本使用
Iptables的基本語法
iptables[-t TABLE] COMMAND CHAIN CRETIRIA -jTARGET
-t TABLE: 表示指定規則
nat, mangle, raw, filter
默認爲filter
COMMAND: 鏈中的命令
-F:flush,清空規則鏈
-N: new,自建一條鏈
-X: delete, 刪除一條自定義的空鏈
-Z:zero, 計數器歸零
-P:policy,設置默認策略,對filter表來講,默認規則爲ACCEPT或DROP;
-E:重命名自定義鏈
鏈中的規則:
-A:增加
-I:插入
-D:刪除
-R:修改、替換
查詢:
-L:
-n:數字格式顯示主機地址和端口;
-v:詳細格式
-line--numbers: 顯示規則編號
匹配條件分爲通用匹配和擴展匹配,擴展匹配又分爲隱式匹配和顯示匹配,下面是匹配條件的具體命令
通用匹配:
-s 地址: 指定報文源IP地址的匹配的範圍,可以是IP也可以是網絡地址;可使用!取反, --src,--source和-s表達的意思一樣
-d 地址:指定報文目標IP地址匹配的範圍,--dst,--destination和-d表達的意思一樣
-p 協議:指定匹配報文的協議類型,一般有三種tcp,udp和icmp;
-i INTERFACE: 數據報文流入的接口;PREROUTING,INPUT, FORWARD
-oINTERFACE: 數據報文流出的接口;OUTPUT, FORWARD, POSTROUITING
擴展匹配:
隱式擴展:
-ptcp [-m tcp]
--sportPORT[-PORT]:指定源端口
--dport:指定目標端口
--tcp-flag要檢查標誌位列表(用逗號分隔)必須爲1的標誌位列表(逗號分隔)
-p udp [-m udp]
--sport:指定源端口
--dport:指定目標端口
-picmp [-m icmp]
--icmp-type
0: echo-reply,ping響應
8:echo-request, ping請求
顯示擴展:
-m擴展模塊名稱(模塊:是iptables,netfilter各擁有的一部分代碼;在添加模塊時可使用“,”和“:” ,表示離散的、:表示連續的)
multiport:多端口匹配(可用於匹配非連續或連續端口;最多指定15個端口;在添加模塊時可使用,和: ,表示離散的,:表示連續的)
專用選項:
--source-ports, --sportsport[,port,port:port]
--destination-ports, --dports
--ports
iprange:匹配指定範圍內的地址;匹配一段連續的地址而非整個網絡時有用;
專用選項:
[!]--src-range:源地址或地址段[!表示可以取反]
--dst-range:目標地址或地址段
string:字符串匹配,能夠檢測報文應用層中的字符串(字符匹配檢查高效算法kmp, bm)
專用選項:
--algo {kmp|bm}:比較時的算法
--string "STRING"
--hex-string "HEX_STRING":HEX_STRING爲編碼成16進制格式的字串;
(注:string和hex-string中選其一使用就可以)
time:基於時間做訪問控制
專用選項:
--datestart:起始時間 YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop :結束時間
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays:設定以星期爲單位 day[,day] Mon.Tues.Wed.Thur.Fri.Sat.Sun
connlimit:連接數限制,對每IP所能夠發起併發連接數做限制;
專用選項:
--connlimit-above [n]:大於所設定的數字就拒絕,小於就允許
limit:速率限制
專用選項:
--limit n[/second|/minute|/hour|/day]
--limit-burst n(n表示個數)
state:狀態檢查
專用選項:
--state
連接追蹤中的狀態:
NEW: 新建立一個會話
ESTABLISHED:已建立的連接
RELATED: 有關聯關係的連接
INVALID: 無法識別的連接
調整連接追蹤功能所能容納的連接的最大數目:
/proc/sys/net/nf_conntrack_max
記錄當前追蹤的所有連接
/proc/net/nf_conntrack
不同協議或連接類型追蹤時的屬性:
/proc/sys/net/netfilter目錄:
處理目標:
內置目標:
DROP:表示拒絕
REJECT:有狀態的拒絕
ACCEPT:允許
自定義鏈:爲自己根據需求所設定的鏈
Iptables的常用命令已經介紹完了,下面爲大家舉例說明命令的使用 1、設定172.16.0.0網段的無法ping通172.16.25.1主機 root@localhost~]# iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.25.1 -p icmp -j DROP 2、查看設定的情況 [root@localhost~]# iptables -L -n –v 3、刪除INPUT中設定的第一條策略 [root@localhost~]# iptables -D INPUT 1 4、再設置INPUT,OUTPUT鏈默認target爲DROP,一定要將遠程端口設定爲打開,否則也會把自己擋在防火牆之外 [root@localhost~]# iptables -A INPUT -i eth0 -s 172.16.0.0/16 -d 172.16.25.1 -p tcp --dport 22-j ACCEPT [root@localhost~]# iptables -A OUTPUT -s 172.16.25.1 -d 172.16.0.0/16 -p tcp --sport 22 -jACCEPT 5、設置INPUT, OUTPUT鏈默認target爲DROP,也就是外部與服務器不能通信 [root@localhost~]# iptables -t filter -P INPUT DROP [root@localhost~]# iptables -t filter -P OUTPUT DROP 6、修改在使用遠程訪問本機時只能通過eth0的端口訪問 [root@localhost~]# iptables -R OUTPUT 1 -s 172.16.25.1 -d 172.16.0.0/16 -o eth0 -p tcp --sport22 -j ACCEPT 7、插入一條對應規則,可以使本主機ping自己的迴環地址 [root@localhost~]# iptables -I INPUT -i lo -j ACCEPT [root@localhost~]# iptables -I OUTPUT -o lo -j ACCEPT 8、設置本機可以ping其他主機 [root@localhost~]# iptables -R INPUT 2 -d 172.16.25.1 -p icmp --icmp-type 0 -j ACCEPT [root@localhost~]# iptables -A OUTPUT -s 172.16.25.1 -p icmp --icmp-type 8 -
j ACCEPT 9、添加multiport模塊,設置只能使用訪問本機的22和80端口的服務 [root@localhost~]# iptables -I INPUT -d 172.16.25.1 -p tcp -m multiport --dports 22,80 -jACCEPT [root@localhost~]# iptables -R OUTPUT 1 -s 172.16.25.1 -p tcp -m multiport --sports 22,80 -jACCEPT 10、添加iprange模塊,設置只能某個網段使用telnet來訪問本主機 [root@localhost~]# iptables -I INPUT -d 172.16.25.1 -p tcp --dport 23 -m iprange --src-range172.16.25.1-172.16.25.210 -j ACCEPT [root@localhost~]# iptables -I OUTPUT -s 172.16.25.1 -ptcp --sport 23 -m iprange --dst-range 172.16.25.1-172.16.25.210 11、添加string模塊,設置只要出現所設定的字符就會出現拒絕訪問 [root@localhost ~]# iptables -I OUTPUT-m string --algo kmp --string "game" -j DROP 12、添加time模塊,設定在工作日的9點到17點拒絕訪問本主機的web服務 [root@localhostwordpress]# iptables -I INPUT -d 172.16.25.1 -p tcp --dport 80 -m time--timestart 09:00 --timestop 17:00 --weekdays Tue,Thur -j DROP
13、添加connlimit模塊,限制連接數 [root@localhostwordpress]# iptables -A INPUT -d 172.16.25.1 -p tcp --dport 22 -m connlimit--connlimit-above 2 -j DROP 14、添加limit模塊,限制速率 [root@localhostwordpress]# iptables -A INPUT -d 172.16.25.1 -p icmp --icmp-type 8 -m limit--limit 20/m --limit-burst 7 -j ACCEPT 15、state的使用 1)使用state模塊設置ssh和web的出入策略 [root@localhost~]# iptables –A INPUT –d 172.16.25.1 –p tcp –m multiport --dports 22,80 –mstate –state NEW –j ACCPET [root@localhost~]#iptables –I INPUT –d 172.16.25.1 –p tcp –m state –state ESTABLISHED –jACCEPT [root@localhost~]#iptables –I OUTPUT –s 172.16.25.1 –p tcp –m state –state ESTABLISHED –jACCEPT 2)設置被動連接的ftp服務 [root@localhost~]# modprobe nf_conntrack_ftp [root@localhost~]# iptables -AINPUT -d 172.16.25.1 -p tcp -m state --state RELATED -j ACCEPT [root@localhost~]#iptables-R OUTPUT 1 -s 172.16.25.1 -m state --state ESTABLISHED,RELATED -j ACCEPT