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