Iptables原理
現(xiàn)在防火墻主要分以下三種類型:包過濾、應(yīng)用代理、狀態(tài)檢測
萌萌的IT人
包過濾防火墻:現(xiàn)在靜態(tài)包過濾防火墻市面上已經(jīng)看不到了,取而代之的是動態(tài)包過濾技術(shù)的防火墻哈~
代理防火墻:因一些特殊的報文攻擊可以輕松突破包過濾防火墻的保護(hù),比如大家知道的SYN攻擊、ICMP洪水攻擊,所以以代理服務(wù)器作為專門為用戶保密或者突破訪問限制的數(shù)據(jù)轉(zhuǎn)發(fā)通道的應(yīng)用代理防火墻出現(xiàn)了哈~其使用了一種應(yīng)用協(xié)議分析的新技術(shù)。
狀態(tài)檢測防火墻:其基于動態(tài)包過濾技術(shù)發(fā)展而來,加入了一種狀態(tài)檢測的模塊,進(jìn)一點(diǎn)發(fā)展了會話過濾功能,會話狀態(tài)的保留是有時間限制的,此防火墻還可以對包的內(nèi)容進(jìn)行分析,從而避免開放過多的端口。
netfilter/iptables IP數(shù)據(jù)包過濾系統(tǒng)實(shí)際上由netfilter和iptables兩個組件構(gòu)成。netfilter是集成在內(nèi)核中的一部分,其作用是定義、保存相應(yīng)的規(guī)則,而iptables是一種工具,用來修改信息的過濾規(guī)則及其他配置,我們可以通過iptables來設(shè)置一些適合我們企業(yè)需求環(huán)境的規(guī)則哈~,而這些規(guī)則會保存在內(nèi)核空間之中。
netfilter是Linux核心中的一個通用架構(gòu),其提供了一系列的表(tables),每個表由若干個鏈(chains)組成,而每條鏈可以由一條或若干條規(guī)則(rules)組成。實(shí)際上netfilter是表的容器,表是鏈的容器,而鏈又是規(guī)則的容器。
iptables內(nèi)置鏈
PREROUTING:數(shù)據(jù)包進(jìn)入本機(jī),進(jìn)入路由器之前
INPUT:通過路由表后目的地為本機(jī)
FORWARDING:通過路由表后,目的地不為本機(jī)
OUTPUT:由本機(jī)產(chǎn)生,向外轉(zhuǎn)發(fā)
POSTROUTIONG:通過路由表后,發(fā)送到網(wǎng)卡接口之前
以下是表和鏈的對應(yīng)關(guān)系

二、iptables的基本用法
基本語法:
iptables [-t table] COMMAND CHAIN CRETIRIA -j TARGET
-t table:
net,mangle,raw,filter
默認(rèn)為filter
COMMAND:
鏈:
-F:(flush)清空規(guī)則鏈
-N:(new)自建一條鏈
-X:(delete)刪除一條自定義的空鏈
-Z:(zero)計數(shù)器歸零
-P:(policy)設(shè)置默認(rèn)策略,對filter表來講,默認(rèn)規(guī)則為ACCEPT或DROP
-E:重命名自定義鏈
CHAIN:指定你接下來的規(guī)則到底是在哪個鏈上操作的
CRETIRIA:指定匹配標(biāo)準(zhǔn)
ACTION :指定如何進(jìn)行處理
常用指令
DROP:悄悄丟棄;一般我們多用DROP來隱藏我們的身份,以及隱藏我們的鏈表
REJECT:明示拒絕
ACCEPT:接受
DNAT:明確申明要做的是目的地地址轉(zhuǎn)換操作
SNAT:明確申明要做的是源地址轉(zhuǎn)換操作
MASQUERADE:源地址偽裝
REDIRECT:重定向:主要用于實(shí)現(xiàn)端口重定向
MARK:打防火墻標(biāo)記的
RETURN:返回在自定義鏈執(zhí)行完畢后使用返回,來返回原規(guī)則鏈
鏈中的規(guī)則
-A:(append)在所選擇的鏈末添加一條或更多規(guī)則
-I: (insert) 根據(jù)給出的規(guī)則序號向所選鏈中插入一條或更多規(guī)則
-D:(delete)從所選鏈中刪除一條或更多規(guī)則
-R:(replace)從選中的鏈中取代一條規(guī)則
常用查詢命令
-L
-n :數(shù)字格式顯示主機(jī)地址端口
-v:顯示詳細(xì)格式信息
-vv
-vvv:越多顯示的越詳細(xì)
--line-numbers:顯示規(guī)則編號
-x: exactly,不要對計數(shù)器的計數(shù)結(jié)果做單位換算,而顯示其精確值
pkts bytes target prot opt in out source destination
pkts: packets, 被本規(guī)則所匹配到的報文的個數(shù)
bytes: 被本規(guī)則所匹配到的所有報文的大小之和,會執(zhí)行單位換算
target: 目標(biāo),即處理機(jī)制
prot: 協(xié)議,一般為{TCP|UDP|ICMP}
opt: 可選項(xiàng)
in: 數(shù)據(jù)包的流入接口
out: 數(shù)據(jù)包的流出接口
source: 源地址
destination: 目標(biāo)地址
三、 匹配標(biāo)準(zhǔn)
通用匹配
-s 地址:指定報文源IP地址的匹配的范圍;可以是IP,也可以是網(wǎng)絡(luò)地址;可使用!取反
--src, --source
-d 地址:指定報文目標(biāo)IP地址匹配的范圍
--dst, --destination
-p 協(xié)議:指定匹配報文的協(xié)議類型,一般有三種tcp,udp,icmp
-i ethX :數(shù)據(jù)報文流入的接口:PREROUTING,INPUT,FORWARD
-o ethX :數(shù)據(jù)報文流入的接口:OUTPUT,FORWARD,POSTROUTING
擴(kuò)展匹配
隱式匹配: 當(dāng)使用-p{tcp|udp|icmp}中的一種時,可以直接使用擴(kuò)展專用選項(xiàng)
-p tcp
--sport PORT[-PORT]:指定源端口,可以是多個端口
--dport PORT[-PORT]:指定目標(biāo)端口,可以是連續(xù)的多個端口
--tcp-flag:TCP的標(biāo)志位列表(用逗號分隔)
必須為1 的標(biāo)志位列表
eg:--tcp-flags syn,ack,rst,fin syn
-p udp
--sport PORT[-PORT]:指定源端口,可以是多個端口
--dport PORT[-PORT]:指定目標(biāo)端口,可以是連續(xù)的多個端口
-p icmp
--icmp-type:
echo-request(請求回顯),一般用8 來表示
echo-reply (響應(yīng)的數(shù)據(jù)包)一般用0來表示
顯示擴(kuò)展 -m 必須要指定要擴(kuò)展的擴(kuò)展模塊名稱
multiport: 多端口匹配
可用于匹配非連續(xù)或連續(xù)端口;最多指定15個端口;用冒號分隔
eg:
iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange: 匹配指定范圍內(nèi)的地址
匹配一段連續(xù)的地址而非整個網(wǎng)絡(luò)時有用;
專用選項(xiàng):
[!] --src-ragne IP[-IP]
[!] --dst-range
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
string: 字符串匹配,能夠檢測報文應(yīng)用層中的字符串
字符匹配檢查高效算法
kmp, bm
專用選項(xiàng):
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING": HEX_STRING為編碼成16進(jìn)制格式的字串;
eg:
iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP
time: 基于時間做訪問控制
專用選項(xiàng):
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]Mon, Tue,
eg:
iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit: 連接數(shù)限制,對每IP所能夠發(fā)起并發(fā)連接數(shù)做限制;
專用選項(xiàng):
[!] --connlimit-above [n]
eg:
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
limit: 速率限制
專用選項(xiàng):
--limit n[/second|/minute|/hour|/day]
--limit-burst n
eg:
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
state: 狀態(tài)檢查
專用選項(xiàng):
--state
連接追蹤中的狀態(tài):
NEW: 新建立一個會話
ESTABLISHED:已建立的連接
RELATED: 有關(guān)聯(lián)關(guān)系的連接
INVALID: 無法識別的連接
調(diào)整連接追蹤功能所能容納的連接的最大數(shù)目:
/proc/sys/net/nf_conntrack_max
當(dāng)前追蹤的所有連接
/proc/net/nf_conntrack
不同協(xié)議或連接類型追蹤時的屬性:
/proc/sys/net/netfilter目錄:
放行被動模式下的FTP服務(wù):
1、裝載模塊/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
模塊:nf_conntrack_ftp
2、放行請求報文:
(1)放行NEW狀態(tài)對21端口請求的報文;
(2) 放行ESTABLISHED以及RELATED狀態(tài)的報文
3、旅行響應(yīng)報文:
(1) 放行ESTABLISHED以及RELATED狀態(tài)的報文
四、寫規(guī)則
先確定功能(表),確定報文流向,確定要實(shí)現(xiàn)的目標(biāo),確定匹配條件
流向
與本機(jī)進(jìn)程通信:
流入:-->PREROUTING-->INPUT
流出:-->OUTPUT-->POSTROUTING
經(jīng)由本機(jī)轉(zhuǎn)發(fā):
請求:-->PREROUTING-->FORWARD-->POSTROUTING
響應(yīng):-->PREROUTING-->FORWARD-->POSTROUTING
寫規(guī)則時要注意:
服務(wù)端:先進(jìn)后出
客戶端:先出后進(jìn)
客戶端端口是隨機(jī)的,因此大多數(shù)場景下無須限定
規(guī)則文件:/etc/sysconfig/iptables
保存啟用中的規(guī)則于規(guī)則文件中:
1、iptables-save > /etc/sysconfig/iptables
2、service iptables save
生效規(guī)則文件中的規(guī)則:
1、iptables-restore < /etc/sysconfig/iptables
2、service iptables restart
執(zhí)行的操作:清空現(xiàn)有規(guī)則,讀取并生效規(guī)則文件中的規(guī)則
常用語法
刪除規(guī)則:
iptables [-t table] -D chain rulenum
設(shè)置策略:
iptables [-t table] -P chain target
修改規(guī)則:
iptables [-t table] -R chain rulenum rule-specification
插入規(guī)則:
iptables [-t table] -I chain [rulenum] rule-specification
創(chuàng)建自定義鏈:
iptables [-t table] -N chain
刪除自定義且0引用的空鏈
iptables [-t table] -X chain
重命名自定義鏈:
iptables [-t table] -E old_name new_name
五、例子
1、SNAT基于原地址的轉(zhuǎn)換
基于原地址的轉(zhuǎn)換一般用在我們的許多內(nèi)網(wǎng)用戶通過一個外網(wǎng)的口上網(wǎng)的時候,這時我們將我們內(nèi)網(wǎng)的地址轉(zhuǎn)換為一個外網(wǎng)的IP,我們就可以實(shí)現(xiàn)連接其他外網(wǎng)IP的功能。
比如我們現(xiàn)在要將所有192.168.10.0網(wǎng)段的IP在經(jīng)過的時候全都轉(zhuǎn)換成172.16.100.1這個假設(shè)出來的外網(wǎng)地址:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.200.1
這樣,只要是來自本地網(wǎng)絡(luò)的試圖通過網(wǎng)卡訪問網(wǎng)絡(luò)的,都會被統(tǒng)統(tǒng)轉(zhuǎn)換成172.16.100.1這個IP.
我們都知道當(dāng)我們使用聯(lián)通或者電信上網(wǎng)的時候,一般它都會在每次你開機(jī)的時候隨機(jī)生成一個外網(wǎng)的IP,意思就是外網(wǎng)地址是動態(tài)變換的。這時我們就要將外網(wǎng) 地址換成 MASQUERADE(動態(tài)偽裝):它可以實(shí)現(xiàn)自動尋找到外網(wǎng)地址,而自動將其改為正確的外網(wǎng)地址。所以,我們就需要這樣設(shè)置:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
這里要注意:地址偽裝并不適用于所有的地方。
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
2、DNAT目標(biāo)地址轉(zhuǎn)換
對于目標(biāo)地址轉(zhuǎn)換,數(shù)據(jù)流向是從外向內(nèi)的,外面的是客戶端,里面的是服務(wù)器端
通過目標(biāo)地址轉(zhuǎn)換,我們可以讓外面的ip通過我們對外的外網(wǎng)ip來訪問我們服務(wù)器不同的服務(wù)器,而我們的服務(wù)卻放在內(nèi)網(wǎng)服務(wù)器的不同的服務(wù)器上。
iptables -t nat -A PREROUTING -d 192.168.1.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.200.7
目標(biāo)地址轉(zhuǎn)換要做在到達(dá)網(wǎng)卡之前進(jìn)行轉(zhuǎn)換,所以要做在PREROUTING這個位置上
3、只允許192.168.1.3訪問服務(wù)器的SSH
iptables -A INPUT -s 192.168.1.3 -p tcp --dport 22 -j ACCEPT
4、屏蔽IP即從192.168.1.0到192.168.1.1254
iptables -I INPUT -s 192.168.1.0/24 -j DROP
5、丟棄非法連接
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables-A FORWARD -m state --state INVALID -j DROP
6、允許ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
7、預(yù)防DOS攻擊
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT