您好,登錄后才能下訂單哦!
在Linux運(yùn)維工作中,在涉及Linux安全時(shí),我們第一時(shí)間想到的一般都是iptables這個(gè)工具。作為一個(gè)linux初學(xué)者來(lái)講,在剛學(xué)習(xí)linux的過(guò)程中,有些實(shí)驗(yàn)總是總不成功。這時(shí)我們總會(huì)檢查防火墻是否關(guān)閉,selinux是否關(guān)閉。在深入學(xué)習(xí)iptbales之后,這些以前知其然,不知其所以然的操作在內(nèi)心就很敞亮了。想深入學(xué)習(xí)一個(gè)東西,總要問(wèn)一下what is it?
本節(jié)學(xué)習(xí)目標(biāo)
防火墻分類(lèi)
Netfilter防火墻工作原理
iptables四表五鏈
iptables規(guī)則設(shè)定要點(diǎn)
iptables工具使用方法(熟練使用,包括主機(jī)防火墻配置,網(wǎng)絡(luò)防火墻配置,以及nat配置)
防火墻是一種隔離工具。工作于主機(jī)或者網(wǎng)絡(luò)的邊緣,對(duì)于進(jìn)出本主機(jī)或者本地網(wǎng)絡(luò)的報(bào)文根據(jù)事先定義好的規(guī)則做匹配檢測(cè),對(duì)于能夠被規(guī)則所匹配到的報(bào)文做出相應(yīng)處理(允許,拒絕,丟棄等)。根據(jù)其管理的范圍來(lái)分可以將其劃分為主機(jī)防火墻和網(wǎng)絡(luò)防火墻。根據(jù)其工作機(jī)制來(lái)區(qū)分又可分為包過(guò)濾型防火墻(netfilter)和代理服務(wù)器(Proxy)。有些人把tcp_warrpers也劃分為防火墻的一種。這種是根據(jù)服務(wù)程序軟件的名稱(chēng)來(lái)控制數(shù)據(jù)包的方法。
包過(guò)濾防火墻Netfilter是linux內(nèi)核所支持的一個(gè)功能模塊框架。Iptables是配置管理Netfilter的一個(gè)軟件工具。所以Netfilter是工作與內(nèi)核空間的。Netfilter是內(nèi)核中一系列的鉤子(hook),為內(nèi)核模塊在網(wǎng)絡(luò)協(xié)議棧中的不同位置注冊(cè)回調(diào)函數(shù)(callback)。在數(shù)據(jù)包經(jīng)過(guò)網(wǎng)絡(luò)協(xié)議棧中的不同位置時(shí)做相應(yīng)的處理。
Netfilter中的五個(gè)鉤子NF_IP_PRE_ROUTING,NF_IP_LOCAL_IN,NF_IP_FORWARD,NF_IP_POST_ROUTING,NF_IP_LOCAL_OUT。。其中網(wǎng)絡(luò)數(shù)據(jù)包的流向圖如下圖所示
1網(wǎng)絡(luò)數(shù)據(jù)包從網(wǎng)卡進(jìn)來(lái)之后進(jìn)入內(nèi)核空間的TCP/IP協(xié)議棧進(jìn)行層層解封裝;
2 在數(shù)據(jù)包剛剛進(jìn)入網(wǎng)絡(luò)層的數(shù)據(jù)包通過(guò)NF_IP_PRE_FORWARD,在此店之后要進(jìn)行一次路由選擇,當(dāng)目標(biāo)地址為本機(jī)地址時(shí),數(shù)據(jù)進(jìn)入NF_IP_LOCAL_IN,非本地的目標(biāo)地址進(jìn)入NF_IP_FORWARD,所以目標(biāo)地址轉(zhuǎn)換通常在此點(diǎn)進(jìn)行;
3 NF_IP_LOCAL_IN:經(jīng)過(guò)路由之后送往本地的數(shù)據(jù)包經(jīng)過(guò)此點(diǎn),所以過(guò)濾INPUT包在此點(diǎn)進(jìn)行。
4 NF_IP_FORWARD:經(jīng)過(guò)路由選擇之后要轉(zhuǎn)發(fā)的數(shù)據(jù)包經(jīng)過(guò)此點(diǎn),所以網(wǎng)絡(luò)防火墻通常在此點(diǎn)配置。
5 NF_IP_LOCAL_OUT:由本地用戶空間應(yīng)用進(jìn)程產(chǎn)生的數(shù)據(jù)包過(guò)此檢測(cè)點(diǎn),所以OUTPUT包過(guò)濾在此點(diǎn)進(jìn)行。
6 NF_IP_POST_ROUTING:剛剛通過(guò)NF_IP_FORWARD和NF_IP_LOCAL_OUT檢測(cè)點(diǎn)的數(shù)據(jù)包要通過(guò)一次路由選擇由哪個(gè)接口送往網(wǎng)絡(luò)中,經(jīng)過(guò)路由之后的數(shù)據(jù)包要通過(guò)NF_IP_POST_ROUTING此檢測(cè)點(diǎn),所以,源地址轉(zhuǎn)換通常在此點(diǎn)進(jìn)行。
iptables是工作在用戶空間的一個(gè)管理netfilter的工具,該工具默認(rèn)有五條鏈(chain), REROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING分別由netfilter的五個(gè)鉤子函數(shù)來(lái)觸發(fā)。Iptables設(shè)有四張表,用以實(shí)現(xiàn)Netfilter的不同功能。
filter表:iptables中使用最廣泛的表,作用是進(jìn)行包過(guò)濾,由此表來(lái)決定該數(shù)據(jù)包是否繼續(xù)向它的目標(biāo)地址前進(jìn)。
Nat表:又此表的名稱(chēng)可以看出,該表用于網(wǎng)絡(luò)地址轉(zhuǎn)換用的,這也就是防火墻的另外一個(gè)功能,對(duì)源地址或者目標(biāo)地址的修改。
mangle表:mangle表用于對(duì)ip報(bào)文的首部信息進(jìn)行修改。
raw表:raw表的功能是為防火墻提供一種禁用連接狀態(tài)追蹤的機(jī)制,在大流量對(duì)外業(yè)務(wù)的服務(wù)器上使用這個(gè)表可以有效的避免連接追蹤帶來(lái)的性能問(wèn)題,比如游戲服務(wù)器通常通過(guò)此表或者重新編譯內(nèi)核的方式禁用防火墻的連接追蹤機(jī)制。
除此之外,在iptable的幫助文檔中提到還有一張security表,用于在數(shù)據(jù)包總加入selinux特×××,該表很少用到,這里不再詳述。
Iptables的四張表有著不同的處理優(yōu)先級(jí),raw-->mangle-->nat -->filter,從左至右優(yōu)先級(jí)依次降低。由于數(shù)據(jù)包進(jìn)入?yún)f(xié)議棧中的鉤子的位置不同以及表的優(yōu)先級(jí)順序不同,所以防火墻對(duì)于數(shù)據(jù)包的處理順序特別容易混淆,這里引用一張胥峰前輩的處理順序圖(由于該圖顯示不清晰,可到附件下載):
想要配置一個(gè)較為安全的防火墻策略就需要了解其規(guī)則的組成以及設(shè)置規(guī)則時(shí)所需要思考的要點(diǎn)。
規(guī)則組成:報(bào)文的匹配條件,匹配到之后的處理動(dòng)作
匹配條件:根據(jù)協(xié)議報(bào)文特征指定匹配條件,基本匹配條件和擴(kuò)展匹配條件
處理動(dòng)作:內(nèi)建處理機(jī)制由iptables自身提供的一些處理動(dòng)作
自定義處理機(jī)制:可自定義鏈來(lái)對(duì)匹配到的報(bào)文做處理。
注意:報(bào)文不會(huì)經(jīng)過(guò)自定義鏈,只能在內(nèi)置鏈上通過(guò)規(guī)則進(jìn)行引用后生效,也就是所自定義鏈為規(guī)則的一個(gè)處理動(dòng)作的集合。
設(shè)置iptables規(guī)則時(shí)需要考量的要點(diǎn):
1、根據(jù)要實(shí)現(xiàn)哪種功能,判斷添加在那張表上;
2、根據(jù)報(bào)文流經(jīng)的路徑,判斷添加在那個(gè)鏈上
流入:PREROUTING--->INPUT
流出:OUTPUT--->POSTROUTING
轉(zhuǎn)發(fā):PREROUTING---->FORWARD--->POSTROUTING
鏈上其規(guī)則的次序,即為檢查的次序,排列好檢查次序能有效的提高性能,因此隱含一定的法則
1、同類(lèi)規(guī)則(訪問(wèn)同一應(yīng)用),匹配范圍小的放上面
2、不同類(lèi)規(guī)則(訪問(wèn)不同應(yīng)用),匹配到報(bào)文頻率大的放上面:
3、將那些可由一條規(guī)則描述的多個(gè)規(guī)則合并為一個(gè)
4、設(shè)置默認(rèn)策略
遠(yuǎn)程連接主機(jī)配置防火墻時(shí)注意要點(diǎn):
1,不要把鏈的默認(rèn)策略修改為拒絕。因?yàn)橛锌赡芘渲檬』蛘咔宄胁呗院鬅o(wú)法遠(yuǎn)程到服務(wù)器。盡量使用規(guī)則條目配置默認(rèn)策略
2,為防止配置失誤策略把自己也拒掉,可在配置策略時(shí)設(shè)置計(jì)劃任務(wù)定時(shí)清除策略。當(dāng)確定無(wú)誤后,關(guān)閉該計(jì)劃任務(wù)。
磨刀不誤砍柴工,當(dāng)以上的東西在腦海中已經(jīng)有一個(gè)框架之后,再學(xué)習(xí)iptables規(guī)則管理工具才會(huì)得心應(yīng)手。
Man文檔是學(xué)習(xí)工具的最好方法。這里不再詳述,下面把我的學(xué)習(xí)筆記粘貼出來(lái),以供讀者參考如有錯(cuò)誤敬請(qǐng)指正。
iptables命令: iptables [-t table] {-A|-C|-D} chain rule-specification ip6tables [-t table] {-A|-C|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specification iptables [-t table] -D chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target iptables [-t table] -E old-chain-name new-chain-name
iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET
-t table: filter ,nat,mangle,raw 默認(rèn)為filter
鏈管理: -F :flush,清空規(guī)則鏈:省略鏈表示清空指定表上的所有的鏈 -N:new,創(chuàng)建新的自定義規(guī)則鏈: -X:drop,刪除用戶自定義的空的規(guī)則鏈: -Z:zero,清零,置零規(guī)則計(jì)數(shù)器 -P:policy,為指定鏈設(shè)置默認(rèn)策略,對(duì)filter表中的鏈而言,默認(rèn)策略通常有ACCEPT,DROP,REJECT; -E:rEname,重命名自定義鏈,引用計(jì)數(shù)不為0的自定義鏈,無(wú)法改名,也無(wú)法刪除 規(guī)則管理: -A:append,將新的規(guī)則追加與指定鏈的尾部 -I:insert,將新規(guī)則插入至指定鏈的指定位置(需指定序號(hào),默認(rèn)為第一條): -D:delete,刪除指定鏈上的指定規(guī)則: 兩種指定方式: 1、指定匹配條件 2、指定規(guī)則編號(hào) -R:replace,替換指定鏈上的指定規(guī)則。
查看: -L:list,列出指定鏈上的所有規(guī)則。 -n:numberic ,以數(shù)字格式顯示地址和端口號(hào) -v:verbose,顯示詳細(xì)信息 -vv,-vvv --line-numbers:顯示規(guī)則編號(hào) -x:exectly,顯示計(jì)數(shù)器計(jì)數(shù)結(jié)果的精確值。
匹配條件: 基本匹配: [!] -s, --src,--source IP|Netaddr:檢查報(bào)文中的源ip地址是否符合此處指定的地址范圍 [!] -d,--dst,--destination IP|Netaddr:檢查報(bào)文中的目標(biāo)ip地址是否符合此處指定的地址范圍 -p ,--protocal{tcp|udp|icmp}:檢查報(bào)文中的協(xié)議,即ip首部中的protocol所標(biāo)識(shí)的協(xié)議,8bit,6標(biāo)識(shí)tcp.17表示udp -i,--in-inteface IFACE :數(shù)據(jù)報(bào)文的流入接口。僅能用于PREROUTING,INPUT,FORWARD鏈 -o,--out-inteface :數(shù)據(jù)報(bào)文的流出接口。僅能用于FORWARD,OUTPUT,POSTROUTING鏈上
擴(kuò)展匹配:-m macth_name --spec_options eq: -m tcp --dport 22 表示使用tcp擴(kuò)展的目標(biāo)端口為22 隱式擴(kuò)展:對(duì)-p protocal 指明的協(xié)議進(jìn)行擴(kuò)展,可省略-m選項(xiàng): -p tcp --dport PORT[-PORT]:目標(biāo)端口,可以是單個(gè)端口或者連續(xù)多個(gè)端口 --sport PORT[-PORT] --tcp-flags list1 list2 :檢查list1所指明的所有標(biāo)志位,且這其中,list2所表示出的所有標(biāo)記必須為1,而余下的必須為0,沒(méi)有list1中指明的,不做檢查。 SYN,ACK,FIN,RST,PSH,URG, eq:--tcp-flags SYN,ACK,FIN,RST SYN ===== --syn: 檢查三次握手的第一次握手 -p udp --dport --sport -p icmp --icmp-type 可用數(shù)字表示其類(lèi)型: 0 echo-reply 8 echo-request
顯示擴(kuò)展:
目標(biāo): -j target:jump至指定的target ACCEPT:接收 DROP:丟棄 REJECT;拒絕 RETURN:返回調(diào)用鏈 REDIRECT:端口重定向 LOG:記錄日志 MARK:做防火墻標(biāo)記 DNAT:目標(biāo)地址轉(zhuǎn)換 SNAT:源地址轉(zhuǎn)換 MASQUERADE:地址偽裝 ... 自定義鏈:由自定義鏈上的規(guī)則進(jìn)行匹配檢查。
顯示擴(kuò)展:必須顯示指明使用的擴(kuò)展模塊(rpm -ql iptables|grep "\.so") centos6 man iptables centos7 man iptbales-extensions
1、multiport擴(kuò)展 以離散方式定義多端口匹配:最多匹配15個(gè)端口 [!] --source-ports,--sports port[,port|,port:port]... 指明多個(gè)源端口 [!] --destination-ports,--dports port[,port|,port:port]... 指明多個(gè)離散的目標(biāo)端口 [!] --ports port[,port|,port:port]...
例子: # iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT # iptables -A OUTPUT -p tcp -m multiport --sports 22,80 -j ACCEPT
2、iprange擴(kuò)展 指明連續(xù)的(但一般不能擴(kuò)展為整個(gè)網(wǎng)絡(luò))ip地址范圍
[!] --src-range from[-to] 匹配指明連續(xù)的源IP地址范圍 [!] --dst-range from[-to] 指明連續(xù)的目標(biāo)IP地址范圍
# iptables -A INPUT -m iprange --src-range 172.18.11.0-172.18.11.100 -j DROP # iptables -A INPUT -p tcp -m multiport --dports 22,80 -m iprange --src-range 172.18.11.0-172.18.11.100 -j DROP
3、string擴(kuò)展 檢查報(bào)文中出現(xiàn)的字符串:
--algo {bm|kmp}:
[!] --string pattern [!] --hex-string pattern 16進(jìn)制
iptables -I OUTPUT -m string --algo bm --string "movle" -j DROP
4、time擴(kuò)展 根據(jù)報(bào)文到達(dá)的時(shí)間與指定的時(shí)間范圍進(jìn)行匹配 --datestart --datestop
--timestart --timestop
--monthdays --weekdays # iptables -I INPUT -d 172.18.11.7 -p tcp --dport 80 -m time --timestart 8:00 --timestop 10:00 -j DROP
# 注意 centos7 使用的是UTC時(shí)間
5、connlimit擴(kuò)展 根據(jù)每客戶端ip(也可以是地址塊)做并發(fā)連接數(shù)數(shù)量匹配:
--connlimit-above n 連接數(shù)量大于n --connlimit-upto n 連接數(shù)量小于等于n # iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT # ssh連接大于3后鏈接被拒絕 6、limit擴(kuò)展 基于收發(fā)報(bào)文速率做檢查: 令牌桶過(guò)濾器:
--limit rate[/second|/minute|/hour|/day] --limit-burst number # iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 6/minute -j ACCEPT # iptables -A INPUT -p icmp -j REJECT
##跳過(guò)5個(gè)包,然后沒(méi)10秒鐘一個(gè)回應(yīng)一個(gè)ping包
7、state擴(kuò)展 檢查連接追蹤機(jī)制檢查連接的狀態(tài):
調(diào)整連接追蹤功能所能容納的最大連接數(shù)量: /proc/sys/net/nf_conntrack_max 已經(jīng)追蹤到并記錄下的連接: /proc/net/nf_conntrack
不同協(xié)議或者連接類(lèi)型追蹤的時(shí)長(zhǎng) /proc/sys/net/netfilter/
可追蹤的連接狀態(tài): NEW:新發(fā)出的請(qǐng)求:連接追蹤模板中不存在此連接相關(guān)的信息條目,因此,將其識(shí)別為第一次發(fā)出的請(qǐng)求 ESTABLISHED:NEW狀態(tài)之后,連接追蹤模板中為其建立的條目失效之前期間內(nèi)所進(jìn)行的通信的狀態(tài)。 RELATED:相關(guān)的連接:如ftp協(xié)議中的命令連接與數(shù)據(jù)連接之間的關(guān)系 INVALIED:無(wú)法識(shí)別的連接
--state state1 state2... 例子: # iptables -I INPUT -d 172.18.11.7 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -I OUTPUT -s 172.18.11.7 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 對(duì)新發(fā)起的http和ssh訪問(wèn)請(qǐng)求做控制, # iptables -A INPUT -d 172.16.100.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -s 172.16.100.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
如何開(kāi)放被動(dòng)模式的FTP服務(wù)?
(1) 裝載ftp追蹤時(shí)專(zhuān)用的模塊 #modprobe nf_conntrack_ftp
路徑 /lib/modules/3.10.0-514.el7.x86_64/kernel/net/netfilternf_conntrack_ftp.ko 模塊信息 modinfo nf_conntrack_ftp.ko (2) 放行請(qǐng)求報(bào)文: 命令連接:NEW,ESTABLISHED 數(shù)據(jù)連接:RELATED,ESTABLISHED
#iptables -A INPUT -d localIP -p tcp -dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A INPUT -d localIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT (3) 放行響應(yīng)報(bào)文 ESTABLISHED #iptables -A OUTPUT -d localIP -p tcp -m state --state ESTABLISHED -j ACCEPT
如何保存及重載規(guī)則: 保存規(guī)則至指定文件: iptables-save > /path/to/somefile
從指定文件重載規(guī)則: iptables-restore < /path/from/somefile
centos6: service iptables save iptable-save >/etc/sysconfig/iptables service iptables restart iptables-restore < /etc/sysconfig/iptables 網(wǎng)絡(luò)防火墻: 核心轉(zhuǎn)發(fā)配置:/proc/sys/net/ipv4/ip_forward /etc/sysctl.conf net.ipv4.ip_forward=1 nat: SNAT:只修改請(qǐng)求報(bào)文的源地址 DNAT:只修改請(qǐng)求報(bào)文的目標(biāo)地址
nat表: PREROUTING: DNAT OUTPUT POSTROUTING: SNAT
源地址轉(zhuǎn)換 iptables -t nat -A POSTROUTING -s local_net ! -d local_net -j SNAT --to-source public_ip 公網(wǎng)ip固定 iptables -t nat -A POSTROUTING -s local_net ! -d local_net -j MASQUERADE 公網(wǎng)ip不固定
目標(biāo)地址轉(zhuǎn)換 iptables -t nat -A POSTROUTING -d public_ip -p tcp|udp --dport PORT -j DNAT --to-destination local_ip:port |
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。