Iptables 入门进阶
?
一、前言
?
??????? 所謂防火墻就是工作在主機(jī)或網(wǎng)絡(luò)邊緣,對進(jìn)出的豹紋根據(jù)定義的規(guī)則做檢查,進(jìn)而對匹配到的報文作為相應(yīng)處理的套件;
??????? 防火墻有軟件防火墻和硬件防火墻;根據(jù)位置可分為本機(jī)防火墻和網(wǎng)絡(luò)防火墻;根據(jù)種類可分為包過濾、應(yīng)用代理、狀態(tài)檢測。
·包過濾即檢查每一個數(shù)據(jù)包,查看包中的一些基本信息,如源地址、目的地址、端口號、協(xié)議等
·應(yīng)用代理工作在應(yīng)用層,檢查包的所有數(shù)據(jù),相對來說會更加安全,但是效率不高,如果對速度要求高,可能會成為瓶頸
·狀態(tài)檢測是從動態(tài)包過濾上演化而來的,不僅有包過濾的功能,而且可以在每個連接建立時,防火墻會為這個連接構(gòu)造一個會話狀態(tài),里面包含了這個連接數(shù)據(jù)包的所有信息,以后這個連接都會基于這個連接的信息進(jìn)行。狀態(tài)檢測可以對包的內(nèi)容進(jìn)行分析,從而擺脫了,從而擺脫了傳統(tǒng)防火墻僅局限于過濾包頭信息的弱點,而且這種防火墻可以不必開放過多的端口,從而杜絕了開放過多端口帶來的隱患。
?
?
二、iptables/netfilter
1、iptables的前身叫ipfirewall,2.20核心被ipchain所取代,Linux2.4以后叫iptables,他可以將規(guī)則組織成一張表,實現(xiàn)詳細(xì)的訪問控制功能。
iptables是一種工具,工作在用戶空間,用于修改信息的過濾規(guī)則及其他配置。
netfilter是內(nèi)核中的一部分,用于定義、保存響應(yīng)的規(guī)則。
?
2、netfilter工作原理
netfilter在內(nèi)核中提供了一系列表(table),每個表由若干鏈(chain)組成,每個鏈可以由一條或數(shù)條規(guī)則(rules)組成。在內(nèi)核空間中設(shè)置了5個鉤子函數(shù)對進(jìn)出主機(jī)的數(shù)據(jù)包進(jìn)行過濾。
1、PREROUTING (路由前)
2、INPUT (進(jìn)入本機(jī))
3、FORWARD (轉(zhuǎn)發(fā))
4、OUTPUT (本機(jī)流出)
5、POSTROUTING (路由后)
?
?
3、表、鏈、規(guī)則、動作
netfilter是表的容器,表是鏈的容器,鏈又是規(guī)則的容器。
表(Tables)
raw表 用于配置數(shù)據(jù)包,raw中的數(shù)據(jù)包不會被系統(tǒng)追蹤。
mangle表? 該表用于數(shù)據(jù)包的特殊變更操作,如TOS、TTL、MARK等特性。
nat表 能夠修改數(shù)據(jù)包,并完成網(wǎng)絡(luò)地址轉(zhuǎn)換。
filter表 用于存放所有防火墻相關(guān)的默認(rèn)表,通常使用該表進(jìn)行過濾的設(shè)置。
raw表有2個內(nèi)置鏈: PREROUTING, OUTPUT
# iptables -t raw -L
Chain PREROUTING (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain OUTPUT (policy ACCEPT)
target???? prot opt source?????????????? destination
?
mangle表有5個內(nèi)置鏈: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
# iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain INPUT (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain FORWARD (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain OUTPUT (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain POSTROUTING (policy ACCEPT)
target???? prot opt source?????????????? destination
?
nat表有3個內(nèi)置鏈:PREROUTING, FORWARD, POSTROUTING
# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain POSTROUTING (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain OUTPUT (policy ACCEPT)
target???? prot opt source?????????????? destination
?
filter表有3個內(nèi)置鏈: INPUT, FORWARD, OUTPUT
# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain FORWARD (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain OUTPUT (policy ACCEPT)
target???? prot opt source?????????????? destination
?
?
?
鏈 (Chains)
PREROUTING??? 路有前,到達(dá)的數(shù)據(jù)包
INPUT??????????????? 路由后,發(fā)往本機(jī)的數(shù)據(jù)包
FORWARD??????? 路由經(jīng)過本地的數(shù)據(jù)包,目的地不是本機(jī)
OUTPUT??????????? 路由之前,本地產(chǎn)生的數(shù)據(jù)包
POSTROUTING 路由后,發(fā)往網(wǎng)卡接口之前的數(shù)據(jù)包
?
動作(Target)
ACCEPT??? 允許數(shù)據(jù)包通過
DROP?????? 丟棄數(shù)據(jù)包
REJECT???? 丟棄數(shù)據(jù)包并返回錯誤
LOG????????? 將符合條件的數(shù)據(jù)包寫入日志
QUEUE???? 傳遞給應(yīng)用程序處理該數(shù)據(jù)包
?
?
4、數(shù)據(jù)報文的流向
?
4.1 如果是跟本機(jī)內(nèi)部進(jìn)行通信
流入:--> PREROUTING,? --> INPUT
流出:--> OUTPUT, --> POSTROUTING
?
4.2 有本機(jī)轉(zhuǎn)發(fā)
請求: --> PRETOUTING, --> FORWARD, --> POSTROUTING
響應(yīng): --> PRETOUTING, --> FORWARD, --> POSTROUTING
?
4.3 數(shù)據(jù)報文的流向
源IP和目標(biāo)IP由流向決定;
?
三、規(guī)則語法
寫規(guī)則:先確定功能(表),確定報文流向,確定要實現(xiàn)的目標(biāo),確定匹配條件
Iptables --> 語法檢查 --> netfilter???
注意:規(guī)則會立即生效,遠(yuǎn)程配置時,首先需要添加放行ssh的規(guī)則
?
格式:iptables [-t table] COMMAND chain CRETIRIA -j Target
-t table: raw,mangle,nat,filter
COMMAND:定義如何對規(guī)則進(jìn)行管理
chain:定義在哪個鏈上生效規(guī)則,當(dāng)定義策略時可以省略
CRETIRIA:指定匹配標(biāo)準(zhǔn)
-j Target:如何進(jìn)行處理
?
例如:允許192.168.56.0/24段的主機(jī)訪問本機(jī)的22端口
# iptables -A INPUT -s 192.168.56.0/24 -p tcp --dport 22 -j ACCEPT
# iptables -L -n -v --line-numbers ??# 查看定義的規(guī)則詳情并顯示行號
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num?? pkts bytes target???? prot opt ?????????in???? out???? source?????????????? destination????
行號?? 包數(shù)? 字計數(shù)? 目標(biāo)???? 協(xié)議? 選項 流入接口 ?流出接口? 源地址????? 目的地址
1?????? 36? 2620 ACCEPT???? tcp? --? *????? *?????? 192.168.56.0/24????? 0.0.0.0/0?????????? tcp dpt:22
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num?? pkts bytes target???? prot opt in???? out???? source?????????????? destination????????
Chain OUTPUT (policy ACCEPT 26 packets, 3104 bytes)
num?? pkts bytes target???? prot opt in???? out???? source?????????????? destination
?
?
四:COMMAND詳解
1、鏈管理命令:
-P:設(shè)置默認(rèn)策略
規(guī)則:iptables [-t table] -P chain target
eg:# iptables -t filter -P FORWARD DROP? //設(shè)置filter的FORWARD鏈默認(rèn)為DROP
?
-N:?? 新建一個鏈
規(guī)則:iptables [-t table] -N chain
eg:# iptables -t filter -N http_in?? // 在filter表新建一個http_in的鏈
?
-X: 刪除用戶自定義鏈
規(guī)則: iptables [-t table] -X [chain]
eg:# iptables -t filter -X http_in? //刪除用戶自定義鏈http_in ( 刪除前此引用數(shù) references 需要為0 )
?
-E: 重命名用戶自定義鏈
規(guī)則: iptables [-t table] -E old-chain-name new-chain-name
eg:# iptables -t filter -E http_in httpd_in?? //修改自定義鏈http_in 為httpd_in
?
-F: 清空規(guī)則
規(guī)則:iptables [-t table] -F [chain [rulenum]] [options...]
eg:# iptables -t filter -F? //清空filter表,鏈和規(guī)則可以省略,如果不寫則為清空所有
?
-Z:??? 計數(shù)器清零
規(guī)則:iptables [-t table] -Z [chain [rulenum]] [options...]
eg: # iptables -t filter -Z OUTPUT? //將filter表的OUTPUT鏈計數(shù)器清空,如果不寫,則為所有計數(shù)器清空
?
2、規(guī)則管理命令
-A:追加,在當(dāng)前鏈最后添加一條規(guī)則
規(guī)則: iptables [-t table] {-A|-D} chain rule-specification
eg:# iptables -t filter -A INPUT -s 192.168.56.0/24 -p tcp --dport 80 -j ACCEPT? //允許192.168.56.0/24網(wǎng)絡(luò)訪問本機(jī)80端口
?
-I NUM:???? 插入一條規(guī)則
規(guī)則: iptables [-t table] -I chain [rulenum] rule-specification
eg:# iptables -t filter -I INPUT 2 -s 192.168.56.0/24 -p tcp --dport 80 -j DROP? //第二條插入一條規(guī)則,拒絕192.168.56.0/24網(wǎng)絡(luò)訪問本機(jī)80端口(不寫第幾行默認(rèn)為第一行)
?
-D NUM: 刪除一條規(guī)則
規(guī)則:iptables [-t table] -D chain rulenum
eg:# iptables -t filter -D INPUT 2?? //刪除filter表INPUT鏈的第二條規(guī)則
?
-R NUM:修改一條規(guī)則
規(guī)則:iptables [-t table] -R chain rulenum rule-specification
eg:# iptables -t filter -R INPUT 1 -s 192.168.56.0/24 -p tcp --dport 80 -j ACCEPT? //修改filter表INPUT鏈的第一條規(guī)則
?
3、查看管理命令
-L: 查看規(guī)則
子命令:
-n:不反解析主機(jī)名,直接以數(shù)組的方式顯示ip
-v:顯示詳細(xì)信息? -vv?? -vvv
-x:在計數(shù)器上顯示精確值,不做單位換算
--line-numbers:顯示規(guī)則的行號
-t 表名: 顯示指定表的信息
eg:# iptables -t filter -L -n -v --line-numbers
Chain INPUT (policy ACCEPT 216 packets, 15244 bytes)
num?? pkts bytes target???? prot opt in???? out???? source?????????????? destination????????
1??????? 0???? 0 ACCEPT???? tcp? --? *????? *?????? 192.168.56.0/24????? 0.0.0.0/0?????????? tcp dpt:80
?
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num?? pkts bytes target???? prot opt in???? out???? source?????????????? destination????????
?
Chain OUTPUT (policy ACCEPT 196 packets, 22160 bytes)
num?? pkts bytes target???? prot opt in???? out???? source?????????????? destination????????
1??????? 0???? 0 ACCEPT???? tcp? --? *????? *?????? 192.168.56.202?????? 0.0.0.0/0?????????? tcp spt:80
?
?
五、CRETIRIA匹配條件
1、通用匹配: 源地址、目標(biāo)地址的匹配
-s IP: 指定作為源地址匹配,這里不能為主機(jī)名,必須是IP地址或網(wǎng)絡(luò)地址
IP | IP/MASK | 0.0.0.0/0.0.0.0
前面可以加!取反,表示除了哪個IP或網(wǎng)絡(luò)之外
-d IP: 表示匹配目標(biāo)地址
-p {tcp|udp|icmp}: 用于匹配協(xié)議
-I 網(wǎng)卡名稱:從這塊網(wǎng)卡流入的數(shù)據(jù)(流入一般是INPUT和PREROUTING)
?
-o 網(wǎng)卡名稱: 從這塊網(wǎng)卡流出的數(shù)據(jù) (流出一般是OUTPUT和POSTROUTING)
?
2、擴(kuò)展匹配
擴(kuò)展匹配:調(diào)用netfilter額外模塊實現(xiàn)特殊檢查機(jī)制,(使用到相關(guān)功能,要使用iptables命令的-m選項來指定調(diào)用哪個模塊)
?
2.1 隱式擴(kuò)展:對協(xié)議的擴(kuò)展
-p tcp [-m tcp]
[!] --sport PORT[-PORT]
[!] --dport PORT[-PORT]
--tcp-flags: TCP的標(biāo)志位(SYN, ACK, FIN, PSH, RST, URG)all ??none
有兩個參數(shù)
1. 要檢查標(biāo)志位列表(用逗號分隔)
2. 必須為1的標(biāo)志位列表(逗號分隔)
--tcp-flags syn,ack,fin,rst syn??此參數(shù)等于? --syn
表示檢查syn,ack,fin,rst 4個位,其中syn必須為1,其他的必須為0。用于檢測三次握手的第一次握手。
可簡寫為--syn
eg:# iptables -A INPUT -p tcp --dport 21 --tcp-flags syn,ack,rst,fin syn? -j ACCEPT? //允許tcp21端口的 syn,ack,rst,fin 其中syn為1 的數(shù)據(jù)包(即第一次握手)
# iptables -A OUTPUT -p tcp --sport 21 --tcp-flags all syn,ack? -j LOG? //檢查tcp21端口的所有數(shù)據(jù)包,其中syn,ack為1 的記錄到日志(即第二次握手)
?
-p udp [-m udp]:? UDP協(xié)議的擴(kuò)展
[!] --dport? port[:port]
[!] --sport? port[:port]
eg:
?
-p icmp [-m icmp]: icmp數(shù)據(jù)報文的擴(kuò)展
--icmp-type
0: echo-reply, ping響應(yīng)
8: echo-request,ping請求
eg:
//響應(yīng)外部ping本機(jī)
# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT?
//允許本機(jī)ping外部主機(jī)
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
?
2.2? 顯式擴(kuò)展
-m 擴(kuò)展模塊名稱
模塊: iptables,netfilter各擁有一部分代碼
?
multiport: 多端口匹配
可以用于匹配非連續(xù)或連續(xù)端口;最多指定15個端口;
選項:
[!] ?--source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dports port[,port|,port:port]…
[!] --ports port[,port|,port:port]…
eg:
# iptables -I INPUT -d 192.168.56.102 -p tcp -m multiport --dports 22,80 -j ACCEPT? //允許訪問本地22,80端口
# iptables -I OUTPUT -s 192.168.56.102 -p tcp -m multiport --sports 22,80 -j ACCEPT?? //允許本地22,80 端口響應(yīng)
?
Iprange: 用于匹配指定范圍內(nèi)的IP地址
匹配一段連續(xù)的地址而非整個網(wǎng)絡(luò)時用
選項:
[!] --src-range from[-to]?? 匹配源地址
[!] --dst-range from[-to]?? 匹配目標(biāo)地址
eg:
# iptables -A INPUT -d 192.168.56.102 -p tcp --dport 22-m iprange --src-range 192.168.56.1-192.168.56.100 -j ACCEPT ?//允許 192.168.56.1-192.168.56.100 ip段訪問本機(jī)22端口數(shù)據(jù)包
# iptables -A OUTPUT -s 192.168.56.102 -p tcp --sport 22 -m iprange --dst-range 192.168.56.1-192.168.56.100 -j ACCEPT? //允許響應(yīng) 192.168.56.1-192.168.56.100 ip段22端口數(shù)據(jù)包
?
string: 字符串匹配,能夠檢測報文應(yīng)用層中的字符串(linux? kernel >= 2.6.14)
字符匹配檢查高效算法
bm,kmp
選項:
--algo {bm|kmp}??? 指定算法
[!] --string "STRING"??? 匹配指定的字串
[!] --hex-string"HEX_STRING":? HEX_STRING為編碼成16進(jìn)制的字串;
eg:iptables -A INPUT -m string --algo kmp --string "sex" -j DROP? //使用kmp 算法拒絕字符串有sex的包訪問
?
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...]?? Possible values are 1 to 31
[!] --weekdays day[,day...]?? Possible values are Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values ?from 1 to 7, respectively.
eg:
# iptables -A FORWARD -p tcp --dport 80 -m time --timestart 9:00 --timestop 18:00 --weekday Mon,Tue,Wed,Thu,Fri -j DROP??? //周一至周五每天8:00到18:00 禁止通過本機(jī)上網(wǎng)
?
connlimit: 連接數(shù)限制,對每個IP所能夠發(fā)起并發(fā)數(shù)做限制;
選項:
[!] --connlimit-above N: 匹配大于N個限制
eg: //允許22最大連接數(shù)為2個,超過會被丟棄
# iptables -A INPUT -d 192.168.56.102 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
?
limit: 速率限制
選項:
--limit rate[/second|/minute|/hour|/day]?? 限制包的速率
--limit-burst NUMBER: 最大通過包數(shù),默認(rèn)為5
eg://限制ping往本地的請求包數(shù)量為每分鐘20個,最大通過包數(shù)為5個
# iptables -A INPUT -d 192.168.56.202 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
?
state:狀態(tài)檢查
選項:
[!] --state STATE
連接追蹤中的狀態(tài)有:
NEW:新建一個會話
ESTABLISHED:已建立的連接
RELATED:有關(guān)聯(lián)的連接
INVALID:無法識別的連接
?
注意:
1、調(diào)整連接追蹤功能所能容納的連接的最大數(shù)目:
/proc/sys/net/nf_conntrack_max
2、當(dāng)前追蹤的所有連接
/proc/net/nf_conntrack
3、不同協(xié)議或連接類型追蹤時的屬性:
/proc/sys/net/netfilter目錄:
?
例子:放行被動模式下FTP的服務(wù)
1、裝載模塊/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
eg:
# modprobe nf_conntrack_ftp
# modprobe nf_nat_ftp
# modprobe nf_conntrack
2、放行請求報文
(1)放行NEW狀態(tài)對21端口請求的報文;
eg:# iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
(2)放行ESTABLISHED以及RELATED狀態(tài)的報文
eg:# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
?
3、放行響應(yīng)報文
放行ESTABLISHED以及RELATED狀態(tài)的報文
eg:# iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
?
六、target 詳解
?
ACCEPT:???? 接受
DROP:???????? 悄悄丟棄
REJECT:?????? 明確拒絕并返回錯誤
SNAT:?????????? 源地址轉(zhuǎn)換
DNAT:????????? 目的地址轉(zhuǎn)換
MASQUERADE:?源地址偽裝
REDIRECT:???????????? 重定向;主要用于實現(xiàn)端口重定向
MARK:??????????????????? 打標(biāo)記
RETURN:???????????????? 返回,在自定義鏈執(zhí)行完畢后使用RETURN來返回原規(guī)則鏈。
?
七、SNAT和DNAT的實現(xiàn)
1、SNAT基于源地址的轉(zhuǎn)換
源地址轉(zhuǎn)換就是在進(jìn)行包的轉(zhuǎn)發(fā)時修改數(shù)據(jù)包的源地址,此方法可以實現(xiàn)多個內(nèi)網(wǎng)用戶通過外網(wǎng)地址訪問外網(wǎng)IP的功能呢個。
選項:
--to-source ipaddr[-ipaddr][:port[-port]]
?
例如:
# iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -j SNAT --to-source 192.168.100.2
?
2、MASQUERADE
然而當(dāng)外網(wǎng)IP為ADSL撥號自動獲取的IP時,外網(wǎng)IP不固定,是動態(tài)的分配的。此時可以使用MASQUERADE來實現(xiàn)動態(tài)獲取外網(wǎng)地址
?
例如:
# iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -j MASQUERADE
?
3、DNAT基于目的地址的轉(zhuǎn)換
對于目標(biāo)地址轉(zhuǎn)換,數(shù)據(jù)流向是從外到內(nèi),通過對服務(wù)器的目標(biāo)地址轉(zhuǎn)換,可以讓客戶端通過外網(wǎng)IP來訪問響應(yīng)服務(wù),而真正的服務(wù)卻在內(nèi)網(wǎng)的服務(wù)器上,增加了安全性。
?
選項:
--to-destination [ipaddr][-ipaddr][:port[-port]]
?
例如:
# iptables -t nat -A PREROUTING -d 192.168.100.2 -p tcp --dport 80 -j DNAT --to-destination 192.168.56.102
?
?
?
八、iptables的規(guī)則保存與恢復(fù)
因為定義的規(guī)則當(dāng)你重啟的時候會失效,所以我們要想永久生效就要保存起來
1、 service iptables save 命令
此命令會保存到默認(rèn)配置文件,開機(jī)自動加載 。 /etc/sysconfig/iptables
?
2、使用 iptables-save命令
# iptables-save > /tmp/iptables?? # 手動保存配置到自定義目錄
?
3、使用iptables-restore命令
# iptables-restore < /tmp/iptables?? 手動加載配置
?
注:
iptables的鏈接跟蹤表最大容量為/proc/sys/net/ipv4/if_conntrack_max,鏈接碰到各種狀態(tài)的超時后就會從表中刪除。
所以解決方法一般有兩個:
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.nf_conntrack_max = 393216
net.ipv4.netfilter.nf_conntrack_max = 393216
?
(2): 降低 nf_conntrack timeout時間
vi /etc/sysctl.conf
net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
?
?
?
?
?
轉(zhuǎn)載于:https://blog.51cto.com/wzgl08/1673352
總結(jié)
以上是生活随笔為你收集整理的Iptables 入门进阶的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序补天笔记
- 下一篇: Kinect学习笔记(五)——更专业的深