一.iptables介紹
iptables并不是真正意義上的防火墻,我們可以理解為一個(gè)客戶端工具,用戶通過(guò)ipatbles這個(gè)客戶端,將用戶 的安全設(shè)定執(zhí)行到對(duì)應(yīng)的"安全框架"中,這個(gè)"安全框架"才是真正的防火墻,這個(gè)框架的名字?.NET?lter。 net?lter才是防火墻真正的安全框架,net?lter位于內(nèi)核空間。
iptables是一個(gè)命令行工具,位于用戶空間,通過(guò)這個(gè)命令行工具來(lái)操作net?lter。 net?lter/iptables(簡(jiǎn)稱為iptables)組成linux平臺(tái)下的包過(guò)濾防火墻,與大多數(shù)的Linux軟件一樣,這個(gè)包 過(guò)濾防火墻是免費(fèi)的,它可以代替昂貴的商業(yè)防火墻解決方案,完成封包過(guò)濾、封包重定向和網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)等功能
二.iptables的四表五鏈
表 |
說(shuō)明 |
filter |
過(guò)濾,防火墻 |
nat |
網(wǎng)絡(luò)地址轉(zhuǎn)換 ;用于修改源ip或目標(biāo)ip,也可以改端口 |
mangle |
拆解報(bào)文,做出修改,并重新封裝起來(lái) |
raw |
關(guān)閉nat表上啟用的連接追蹤機(jī)制 |
鏈(內(nèi)置):
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
在實(shí)際使用中,我們通常是用表來(lái)操作,這里列出表和鏈的關(guān)系:
表 |
鏈 |
raw |
PREROUTING, OUTPUT |
mangle |
PREROUTING,INPUT,F(xiàn)ORWARD,OUTPUT,POSTROUTING |
nat |
REROUTING,OUTPUT,POSTROUTING(centos7中還有INPUT, |
filter |
INPUT,F(xiàn)ORWARD,OUTPUT |

報(bào)文流向:
流入本機(jī):PREROUTING --> INPUT
由本機(jī)流出:OUTPUT --> POSTROUTING
轉(zhuǎn)發(fā):PREROUTING --> FORWARD --> POSTROUTING
三.iptables基本用法
規(guī)則格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table:
raw, mangle, nat, filter(默認(rèn))
COMMAND
鏈管理:
-F:flush,清空規(guī)則鏈:省略鏈,表示清空指定表上的所有的鏈;
-N:new, 自定義一條新的規(guī)則鏈;
-X: delete,刪除自定義的規(guī)則鏈;
-Z: zero,清零,置零規(guī)則計(jì)數(shù)器;
注意:僅能刪除 用戶自定義的 引用計(jì)數(shù)為0的 空的 鏈;
-P:Policy,設(shè)置默認(rèn)策略;對(duì)filter表中的鏈而言,其默認(rèn)策略有:
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
-E: rEname 重命名自定義鏈;引用計(jì)數(shù)不為0的自定義鏈不能夠被重命名,也不能被刪除;
規(guī)則管理
-A:Append,追加;
-I:insert, 插入,要指明位置,省略時(shí)表示第一條;
-D:delete,刪除;
(1) 指明規(guī)則序號(hào);
(2) 指明規(guī)則本身;
-R:replace,替換指定鏈上的指定規(guī)則;
-F:flush,清空指定的規(guī)則鏈;
-Z:zero,置零;
iptables的每條規(guī)則都有兩個(gè)計(jì)數(shù)器:
(1) 匹配到的報(bào)文的個(gè)數(shù);
(2) 匹配到的所有報(bào)文的大小之和
查看
-L:list, 列出指定鏈上的所有規(guī)則;
-n:numberic,以數(shù)字格式顯示地址和端口號(hào); -v:verbose,詳細(xì)信息; -vv, -vvv -x:exactly,顯示計(jì)數(shù)器結(jié)果的精確值; --line-numbers:顯示規(guī)則的序號(hào);
chain
PREROUTING,INPUT,F(xiàn)ORWARD,OUTPUT,POSTROUTING
-j targetname(處理動(dòng)作)

常用規(guī)則匹配器

命令用法總結(jié)

四.iptables進(jìn)階用法
擴(kuò)展匹配條件:
隱式擴(kuò)展:在使用-p選項(xiàng)指明了特定的協(xié)議時(shí),無(wú)需再同時(shí)使用-m選項(xiàng)指明擴(kuò)展模塊的擴(kuò)展機(jī)制;
顯式擴(kuò)展:必須使用-m選項(xiàng)指明要調(diào)用的擴(kuò)展模塊的擴(kuò)展機(jī)制;
顯示擴(kuò)展:
iprange擴(kuò)展模塊
用iprange擴(kuò)展模塊可以指定"一段連續(xù)的IP地址范圍",用于匹配報(bào)文的源地址或者目標(biāo)地址。
–src-range:源地址范圍
–dst-range:目標(biāo)地址范圍
]# iptables -t filter -I INPUT -m iprange --src-range 192.168.1.128-192.168.1.254 -j DROP
string擴(kuò)展模塊
使用string擴(kuò)展模塊,可以指定要匹配的字符串,如果報(bào)文中包含對(duì)應(yīng)的字符串,則符合匹配條件。
-m string:表示使用string擴(kuò)展模塊
–algo:用于指定匹配算法,可選的算法有bm與kmp,此選項(xiàng)為必須選項(xiàng),我們不用糾結(jié)于選擇哪個(gè)算法,但 是我們必須指定一個(gè)。
–string:用于指定需要匹配的字符串
]# iptables -t filter -I INPUT -m string --algo bm --string “bit” -j REJECT
time擴(kuò)展模塊
過(guò)time擴(kuò)展模塊,根據(jù)時(shí)間段區(qū)匹配報(bào)文,如果報(bào)文到達(dá)的時(shí)間在指定的時(shí)間范圍以內(nèi),則符合匹配條件。
-m time:表示使用time擴(kuò)展模塊
–timestart:選項(xiàng)用于指定起始時(shí)間,00:00:00格式時(shí)分秒。
–timestop:選項(xiàng)用于指定結(jié)束時(shí)間。
–weekdays:選項(xiàng)用于用數(shù)字指定星期幾,還能用縮寫表示,例如: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擴(kuò)展模塊
connlimit擴(kuò)展模塊,可以限制每個(gè)IP地址同時(shí)鏈接到server端的鏈接數(shù)量,注意:我們不用指定IP,其默認(rèn)就 是針對(duì)"每個(gè)客戶端IP",即對(duì)單IP的并發(fā)連接數(shù)限制。一般和協(xié)議、端口配合使用
–connlimit-above:限制連接上限
–connlimit-mask:按照網(wǎng)段限制連接上限
~]# iptables -t filter -I OUTPUT -p TCP --dport 22 -m connlimit -connlimit-above 2 -j REJECT
limit擴(kuò)展模塊
limit模塊對(duì)"報(bào)文到達(dá)速率"進(jìn)行限制,我們可以以秒為單位進(jìn)行限制,也可以以分鐘、小時(shí)、天作為單位進(jìn)行限
制。
–limit限制比較有意思,主要用來(lái)限制單位時(shí)間內(nèi)可以流入的數(shù)據(jù)包的數(shù)量。
使用"–limit"選項(xiàng)時(shí),可以選擇的時(shí)間單位有多種,如下 /second /minute /hour /day
~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/min -j REJECT
tcp-?ags模塊
tcp-?ags模塊也屬于我們之前講到過(guò)的tcp擴(kuò)展模塊中的內(nèi)容。 --tcp-?ags指的就是tcp頭中的標(biāo)志位,看來(lái),在使用iptables時(shí),我們可以通過(guò)此擴(kuò)展匹配條件,去匹配tcp報(bào) 文的頭部的標(biāo)識(shí)位,然后根據(jù)標(biāo)識(shí)位的實(shí)際情況實(shí)現(xiàn)訪問(wèn)控制的功能。在網(wǎng)絡(luò)部分我們講了三次握手,四次揮手,講 了TCP的包頭,這里主要指tcp包頭中的標(biāo)志位,SYN,ACK,FIN,RST,URG,PSH。
他的匹配規(guī)則是:“SYN,ACK,FIN,RST,URG,PSH SYN”,怎么來(lái)理解,我們可以把這串字符拆成兩部分去理解,第一部分為"SYN,ACK,FIN,RST,URG,PSH",第二部分為"SYN"。
第一部分表示:我們需要匹配報(bào)文tcp頭中的哪些標(biāo)志位,那么上例的配置表示,我們需要匹配報(bào)文tcp頭中的6 個(gè)標(biāo)志位,這6個(gè)標(biāo)志位分別為為"SYN、ACK、FIN、RST、URG、PSH",我們可以把這一部分理解成需要匹配的標(biāo) 志位列表。
第二部分表示:第一部分的標(biāo)志位列表中,哪些標(biāo)志位必須為1,上例中,第二部分為SYN,則表示,第一部分 需要匹配的標(biāo)志位列表中,SYN標(biāo)志位的值必須為1,其他標(biāo)志位必須為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擴(kuò)展
state是一個(gè)非常重要的擴(kuò)展,可以基于連接追蹤功能去查看每一報(bào)文當(dāng)前所處的狀態(tài)。不論什么協(xié)議,客戶端 第一次訪問(wèn)時(shí),服務(wù)器會(huì)去內(nèi)核內(nèi)存中的追蹤表查看他之前是否來(lái)過(guò),查不到就證明是第一次來(lái),記錄入追蹤表,如 果查到以前來(lái)過(guò)就不檢查規(guī)則,直接允許訪問(wèn),這稱為連接追蹤機(jī)制。在訪問(wèn)量特別大的場(chǎng)景下,比如負(fù)載均衡服務(wù) 器不建議開(kāi)啟,追蹤表大只能記錄6萬(wàn)多的條目,訪問(wèn)數(shù)超過(guò)就會(huì)無(wú)法記錄出錯(cuò),導(dǎo)致所有的連接失敗。
報(bào)文狀態(tài)有五種:
NEW: 第一次連接時(shí)
ESTABLISHED:已建立的連接;
INVALID:無(wú)法識(shí)別的連接;
RELATED:相關(guān)聯(lián)的連接,當(dāng)前連接是一個(gè)新請(qǐng)求,但附屬于某個(gè)已存在的連接
UNTRACKED:row表上關(guān)閉連接追蹤功能
~]# iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT