iptables擴展功能需要配合模塊實現; 隱式擴展:在使用-p選項指明了特定的協議時,無需再用-m選項指明擴展模塊的擴展機制,不需要手動加載擴展模塊,即 有的模塊只需要指定協議名稱,不需要指定模塊名稱,這樣在定義協議時,間接的使用了模塊,如TCP、UDP、icmp協議,因為協議名與模塊名同名; 顯示擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制(手動指定引用的模塊名稱),要手動加載擴展模塊 rpm -ql iptables #查看iptables所支持的模塊
iptables -A INPUT -s 192.168.39.6 -p tcp --dport 80 -j ACCEPT #filter表input鏈添加一條規則,允許192.168.39.6通過tcp協議訪問本機的80端口;-p指定tcp協議時間接使用了tcp模塊 iptables -A INPUT -s 192.168.39.6 -p tcp --dport 80:90 -j ACCEPT #允許192.168.39.6通過tcp協議訪問本機的80-90之間的所有端口;連續的端口號只會占用一條規則 iptables -A INPUT -s 192.168.39.100 -p tcp --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT #filter表input鏈添加規則,指定192.168.39.100三次捂手的第一次握手直接拒絕;指定6個標記位,三次握手的第一次握手只有SYN標記位為1,其余都為0,所以最后的SYN表示為SYN為1;標記位只屬於TCP協議,所以需要指定協議為TCP;第二次握手為SYN,ACK為1,其余為0;第三次握手為ACK為1,其余為0;並且標記位不存在6個都為1或者都為0的報文 iptables -A INPUT -s 192.168.39.100 -p tcp --syn -j REJECT #--syn也表示三次握手的第一次握手,即只檢查6個標記位中的4個,並且syn位為1
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #filter表input鏈添加規則,允許客戶端ping的響應報文;icmp協議中,type為0的表示為響應報文,為8的表示為請求報文;間接引用了icmp模塊
iptables -A INPUT -p tcp -m multiport --dports 80,3306 -j ACCEPT #filter表input鏈添加規則,允許客戶端通過TCP協議訪問3306和80端口;multiport模塊的作用是指定多個不連續的端口,並且只會生成一條規則,不會生成多余的規則;離散端口最多能指定15個 iptables -A INPUT -p tcp -m multiport --ports 80,3306 -j ACCEPT #--ports包含了--sports及--dports
--src-range from[-to] 源IP地址范圍 --dst-range from[-to] 目標IP地址范圍 iptables -A INPUT -d 192.168.39.101 -p tcp --dport 80 -m iprange --src-range 192.168.39.5-192.168.39.10 -j REJECT #拒絕192.168.39.5至192.168.39.10通過TCP訪問本機的192.168.39.101的80端口;通過iprange模塊指定IP地址范圍
此模塊只支持源MAC,不支持目標MAC,因為目標MAC地址如果不是當前服務器的MAC地址,網卡會直接拋棄報文 iptables -A INPUT -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT #filter表input鏈添加規則,允許客戶端網卡的MAC地址為00:50:56:12:34:56的訪問
iptables雖然不是應用層防火牆,但是也可以通過string模塊分析數據報文中的特定關鍵字 --algo {bm|kmp} 字符串匹配檢測算法 --from offset 指定數據幀的開始偏移位置 --to offset 指定數據幀的結束偏移位置 --string pattern 要檢測的字符串模式 數據幀中數據鏈路層頭部中有8個字節的前導信息、6個字節的目標MAC和6個字節的源MAC、2個字節的type類型;IP頭固定20個字節;TCP頭固定20個字節,即可以跳過數據報文中的前62個字節開始檢查特定的字符串 iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT #filter表output鏈添加規則,拒絕客戶端訪問的站點頁面內容中帶有google關鍵字的頁面;此規則需要設置在output鏈上,此規則只針對站點頁面的內容,所以客戶端在訪問時,請求報文中是不帶有站點頁面內容的,只有回復報文中才包含頁面內容,並且回復報文的源端口為本機的80端口
通過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...] 星期幾,1 – 7 分別表示星期一到星期日 --kerneltz:內核時區,不建議使用,不設置此選項CentOS7系統默認為UTC,設置規則時需要+8小時;centos6不支持--kerneltz,centos6默認就是當地時間,不需要進行轉換; iptables -A INPUT -m time --timestart 1:00 --timestop 10:00 --weekdays Sat,Sun -j DROP #filter表input鏈添加規則,拒絕所有客戶端在周六、周日的早9點到晚6點訪問本機的所有地址
根據每個客戶端IP做並發連接數數量匹配限制,可防止Dos(Denial of Service,拒絕服務)攻擊 --connlimit-upto 連接的數量小於等於多少時匹配 --connlimit-above 連接的數量大於多少時匹配 iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j REJECT
#filter表input鏈添加規則,當每個客戶端IP訪問tcp80端口,並發連接超過100時,拒絕訪問
limit模塊可以限制報文收發速率 --limit #[/second|/minute|/hour|/day] #限制收發報文速率 --limit-burst number #指定前多少個報文不限制 1、iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT #filter表input鏈添加規則,指定每分鍾接收20個報文,並且前5個報文不進行限制 2、iptables -A INPUT -j REJECT
#需要配合此條規則一起使用,否則第一條規則不成立,默認會全部允許訪問
通過state狀態跟蹤模塊,判斷新舊用戶發起的請求,從而進行訪問控制; 狀態有如下幾種: NEW:新發出請求;連接追蹤信息庫中不存在此連接的相關信息條目,因此,將其識別為第一次發出的請求,即new為一次連接的第一個請求;如斷開連接后,重新建立連接,再次發送請求,此請求也為new; ESTABLISHED:NEW狀態之后,連接追蹤信息庫中為其建立的條目失效之前期間內所進行的通信狀態,即一次連接第一次請求之后的請求都為ESTABLISHED; RELATED:新發起的但與已有連接相關聯的連接,如:ftp協議中的數據連接與命令連接之間的關系; INVALID:無效的連接,如flag標記位不正確,如TCP6個標記位都為0或者都為1; UNTRACKED:未進行追蹤的連接,如raw表中關閉追蹤; 1、iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT #ESTABLISHED為已經建立連接的,RELATED為與已有連接相關的連接,這兩個狀態都代表老用戶;允許老用戶通過tcp協議訪問22端口 2、iptables -A INPUT -j REJECT #配合第一條規則使用,拒絕新用戶連接22端口 ###注意
連接跟蹤功能是通過conntrack模塊實現的,通過“lsmod | grep conntrack”查看內核中是否加載了該模塊,此模塊會因為iptables規則中調用了state模塊,則內核會自動加載conntrack模塊,否則不會加載此模塊
/proc/net/nf_conntrack #此文件為跟蹤庫,記錄了連接過本機的IP,但是記錄在內存中,終究是有極限的
/proc/sys/net/nf_conntrack_max #此文件記錄了最大跟蹤連接的數量,超過此文件數量的連接將會被拒絕;連接跟蹤會占用較多內存,加大系統負載
/proc/sys/net/netfilter/ #此目錄下的文件記錄了各個協議的連接超時時長
conntrack連接跟蹤模塊還有另外一個功能,ftp的被動模式開啟的端口不固定,這樣在防火牆策略中不方便開啟端口,跟蹤模塊可以通過分析ftp協議的21端口,通過分析命令通道獲取到被動模式所要開啟的數據通道端口號,需要讓內核加載一個能夠分析ftp協議的conntrack跟蹤模塊,具體步驟如下:
1、modprobe nf_conntrack_ftp #使內核加載能夠分析ftp協議的conntrack跟蹤模塊
2、iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允許已經建立連接或和已有連接相關的連接訪問;連通21端口,后續連接都算ESTABLISHED或RELATED;
3、iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允許客戶端訪問tcp的21端口
4、iptables -A INPUT -J REJECT #拒絕所有人訪問;第二條規則在前面會比第三條規則在前面效率更高一些