一.iptables介紹
iptables并不是真正意義上的防火墻,我們可以理解為一個客戶端工具,用戶通過ipatbles這個客戶端,將用戶 的安全設定執行到對應的"安全框架"中,這個"安全框架"才是真正的防火墻,這個框架的名字?.NET?lter。 net?lter才是防火墻真正的安全框架,net?lter位于內核空間。
iptables是一個命令行工具,位于用戶空間,通過這個命令行工具來操作net?lter。 net?lter/iptables(簡稱為iptables)組成linux平臺下的包過濾防火墻,與大多數的Linux軟件一樣,這個包 過濾防火墻是免費的,它可以代替昂貴的商業防火墻解決方案,完成封包過濾、封包重定向和網絡地址轉換(NAT)等功能
二.iptables的四表五鏈
表 |
說明 |
filter |
過濾,防火墻 |
nat |
網絡地址轉換 ;用于修改源ip或目標ip,也可以改端口 |
mangle |
拆解報文,做出修改,并重新封裝起來 |
raw |
關閉nat表上啟用的連接追蹤機制 |
鏈(內置):
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
在實際使用中,我們通常是用表來操作,這里列出表和鏈的關系:
表 |
鏈 |
raw |
PREROUTING, OUTPUT |
mangle |
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING |
nat |
REROUTING,OUTPUT,POSTROUTING(centos7中還有INPUT, |
filter |
INPUT,FORWARD,OUTPUT |
報文流向:
流入本機:PREROUTING --> INPUT
由本機流出:OUTPUT --> POSTROUTING
轉發:PREROUTING --> FORWARD --> POSTROUTING
三.iptables基本用法
規則格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table:
raw, mangle, nat, filter(默認)
COMMAND
鏈管理:
-F:flush,清空規則鏈:省略鏈,表示清空指定表上的所有的鏈;
-N:new, 自定義一條新的規則鏈;
-X: delete,刪除自定義的規則鏈;
-Z: zero,清零,置零規則計數器;
注意:僅能刪除 用戶自定義的 引用計數為0的 空的 鏈;
-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
-E: rEname 重命名自定義鏈;引用計數不為0的自定義鏈不能夠被重命名,也不能被刪除;
規則管理
-A:Append,追加;
-I:insert, 插入,要指明位置,省略時表示第一條;
-D:delete,刪除;
(1) 指明規則序號;
(2) 指明規則本身;
-R:replace,替換指定鏈上的指定規則;
-F:flush,清空指定的規則鏈;
-Z:zero,置零;
iptables的每條規則都有兩個計數器:
(1) 匹配到的報文的個數;
(2) 匹配到的所有報文的大小之和
查看
-L:list, 列出指定鏈上的所有規則;
-n:numberic,以數字格式顯示地址和端口號; -v:verbose,詳細信息; -vv, -vvv -x:exactly,顯示計數器結果的精確值; --line-numbers:顯示規則的序號;
chain
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
-j targetname(處理動作)
常用規則匹配器
命令用法總結
四.iptables進階用法
擴展匹配條件:
隱式擴展:在使用-p選項指明了特定的協議時,無需再同時使用-m選項指明擴展模塊的擴展機制;
顯式擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制;
顯示擴展:
iprange擴展模塊
用iprange擴展模塊可以指定"一段連續的IP地址范圍",用于匹配報文的源地址或者目標地址。
–src-range:源地址范圍
–dst-range:目標地址范圍
]# iptables -t filter -I INPUT -m iprange --src-range 192.168.1.128-192.168.1.254 -j DROP
string擴展模塊
使用string擴展模塊,可以指定要匹配的字符串,如果報文中包含對應的字符串,則符合匹配條件。
-m string:表示使用string擴展模塊
–algo:用于指定匹配算法,可選的算法有bm與kmp,此選項為必須選項,我們不用糾結于選擇哪個算法,但 是我們必須指定一個。
–string:用于指定需要匹配的字符串
]# iptables -t filter -I INPUT -m string --algo bm --string “bit” -j REJECT
time擴展模塊
過time擴展模塊,根據時間段區匹配報文,如果報文到達的時間在指定的時間范圍以內,則符合匹配條件。
-m time:表示使用time擴展模塊
–timestart:選項用于指定起始時間,00:00:00格式時分秒。
–timestop:選項用于指定結束時間。
–weekdays:選項用于用數字指定星期幾,還能用縮寫表示,例如:Mon, Tue, Wed,Thu, Fri, Sat, Sun
–monthdays,–datestart,–datestop:指定日期范圍
~]# iptables -t filter -I OUTPUT -p TCP --dport 80 -m time --timestart 08:55:00 --timestop 17:00:00 -j REJECT
~]# iptables -t filter -I OUTPUT -p TCP --dport 80 -m time --weekdays 1,2,3,4,5 -j REJECT
~]# iptables -t filter -I OUTPUT -p TCP --dport 8080 -m time -monthdays 1,2 -j REJECT
~]# iptables -t filter -I OUTPUT -p TCP --dport 8080 -m time -datestart 2019-04-20 --datestop 2019-04-21 -j REJECT
connlimit擴展模塊
connlimit擴展模塊,可以限制每個IP地址同時鏈接到server端的鏈接數量,注意:我們不用指定IP,其默認就 是針對"每個客戶端IP",即對單IP的并發連接數限制。一般和協議、端口配合使用
–connlimit-above:限制連接上限
–connlimit-mask:按照網段限制連接上限
~]# iptables -t filter -I OUTPUT -p TCP --dport 22 -m connlimit -connlimit-above 2 -j REJECT
limit擴展模塊
limit模塊對"報文到達速率"進行限制,我們可以以秒為單位進行限制,也可以以分鐘、小時、天作為單位進行限
制。
–limit限制比較有意思,主要用來限制單位時間內可以流入的數據包的數量。
使用"–limit"選項時,可以選擇的時間單位有多種,如下 /second /minute /hour /day
~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/min -j REJECT
tcp-?ags模塊
tcp-?ags模塊也屬于我們之前講到過的tcp擴展模塊中的內容。 --tcp-?ags指的就是tcp頭中的標志位,看來,在使用iptables時,我們可以通過此擴展匹配條件,去匹配tcp報 文的頭部的標識位,然后根據標識位的實際情況實現訪問控制的功能。在網絡部分我們講了三次握手,四次揮手,講 了TCP的包頭,這里主要指tcp包頭中的標志位,SYN,ACK,FIN,RST,URG,PSH。
他的匹配規則是:“SYN,ACK,FIN,RST,URG,PSH SYN”,怎么來理解,我們可以把這串字符拆成兩部分去理解,第一部分為"SYN,ACK,FIN,RST,URG,PSH",第二部分為"SYN"。
第一部分表示:我們需要匹配報文tcp頭中的哪些標志位,那么上例的配置表示,我們需要匹配報文tcp頭中的6 個標志位,這6個標志位分別為為"SYN、ACK、FIN、RST、URG、PSH",我們可以把這一部分理解成需要匹配的標 志位列表。
第二部分表示:第一部分的標志位列表中,哪些標志位必須為1,上例中,第二部分為SYN,則表示,第一部分 需要匹配的標志位列表中,SYN標志位的值必須為1,其他標志位必須為0。
~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT #匹配第一次握手
~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT #匹配第二次握手
state擴展
state是一個非常重要的擴展,可以基于連接追蹤功能去查看每一報文當前所處的狀態。不論什么協議,客戶端 第一次訪問時,服務器會去內核內存中的追蹤表查看他之前是否來過,查不到就證明是第一次來,記錄入追蹤表,如 果查到以前來過就不檢查規則,直接允許訪問,這稱為連接追蹤機制。在訪問量特別大的場景下,比如負載均衡服務 器不建議開啟,追蹤表大只能記錄6萬多的條目,訪問數超過就會無法記錄出錯,導致所有的連接失敗。
報文狀態有五種:
NEW: 第一次連接時
ESTABLISHED:已建立的連接;
INVALID:無法識別的連接;
RELATED:相關聯的連接,當前連接是一個新請求,但附屬于某個已存在的連接
UNTRACKED:row表上關閉連接追蹤功能
~]# iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT