在Linux運維工做中,在涉及Linux安全時,咱們第一時間想到的通常都是iptables這個工具。做爲一個linux初學者來說,在剛學習linux的過程當中,有些實驗老是總不成功。這時咱們總會檢查防火牆是否關閉,selinux是否關閉。在深刻學習iptbales以後,這些之前知其然,不知其因此然的操做在心裏就很敞亮了。想深刻學習一個東西,總要問一下what is it?
linux
本節學習目標centos
防火牆分類安全
Netfilter防火牆工做原理服務器
iptables四表五鏈網絡
iptables規則設定要點併發
iptables工具使用方法(熟練使用,包括主機防火牆配置,網絡防火牆配置,以及nat配置)app
防火牆是一種隔離工具。工做於主機或者網絡的邊緣,對於進出本主機或者本地網絡的報文根據事先定義好的規則作匹配檢測,對於可以被規則所匹配到的報文作出相應處理(容許,拒絕,丟棄等)。根據其管理的範圍來分能夠將其劃分爲主機防火牆和網絡防火牆。根據其工做機制來區分又可分爲包過濾型防火牆(netfilter)和代理服務器(Proxy)。有些人把tcp_warrpers也劃分爲防火牆的一種。這種是根據服務程序軟件的名稱來控制數據包的方法。
框架
包過濾防火牆Netfilter是linux內核所支持的一個功能模塊框架。Iptables是配置管理Netfilter的一個軟件工具。因此Netfilter是工做與內核空間的。Netfilter是內核中一系列的鉤子(hook),爲內核模塊在網絡協議棧中的不一樣位置註冊回調函數(callback)。在數據包通過網絡協議棧中的不一樣位置時作相應的處理。
運維
Netfilter中的五個鉤子NF_IP_PRE_ROUTING,NF_IP_LOCAL_IN,NF_IP_FORWARD,NF_IP_POST_ROUTING,NF_IP_LOCAL_OUT。。其中網絡數據包的流向圖以下圖所示ssh
1網絡數據包從網卡進來以後進入內核空間的TCP/IP協議棧進行層層解封裝;
2 在數據包剛剛進入網絡層的數據包經過NF_IP_PRE_FORWARD,在此店以後要進行一次路由選擇,當目標地址爲本機地址時,數據進入NF_IP_LOCAL_IN,非本地的目標地址進入NF_IP_FORWARD,因此目標地址轉換一般在此點進行;
3 NF_IP_LOCAL_IN:通過路由以後送往本地的數據包通過此點,因此過濾INPUT包在此點進行。
4 NF_IP_FORWARD:通過路由選擇以後要轉發的數據包通過此點,因此網絡防火牆一般在此點配置。
5 NF_IP_LOCAL_OUT:由本地用戶空間應用進程產生的數據包過此檢測點,因此OUTPUT包過濾在此點進行。
6 NF_IP_POST_ROUTING:剛剛經過NF_IP_FORWARD和NF_IP_LOCAL_OUT檢測點的數據包要經過一次路由選擇由哪一個接口送往網絡中,通過路由以後的數據包要經過NF_IP_POST_ROUTING此檢測點,因此,源地址轉換一般在此點進行。
iptables是工做在用戶空間的一個管理netfilter的工具,該工具默認有五條鏈(chain), REROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING分別由netfilter的五個鉤子函數來觸發。Iptables設有四張表,用以實現Netfilter的不一樣功能。
filter表:iptables中使用最普遍的表,做用是進行包過濾,由此表來決定該數據包是否繼續向它的目標地址前進。
Nat表:又此表的名稱能夠看出,該表用於網絡地址轉換用的,這也就是防火牆的另一個功能,對源地址或者目標地址的修改。
mangle表:mangle表用於對ip報文的首部信息進行修改。
raw表:raw表的功能是爲防火牆提供一種禁用鏈接狀態追蹤的機制,在大流量對外業務的服務器上使用這個表能夠有效的避免鏈接追蹤帶來的性能問題,好比遊戲服務器一般經過此表或者從新編譯內核的方式禁用防火牆的鏈接追蹤機制。
除此以外,在iptable的幫助文檔中提到還有一張security表,用於在數據包總加入selinux特×××,該表不多用到,這裏再也不詳述。
Iptables的四張表有着不一樣的處理優先級,raw-->mangle-->nat -->filter,從左至右優先級依次下降。因爲數據包進入協議棧中的鉤子的位置不一樣以及表的優先級順序不一樣,因此防火牆對於數據包的處理順序特別容易混淆,這裏引用一張胥峯前輩的處理順序圖(由於該圖顯示不清晰,可到附件下載):
想要配置一個較爲安全的防火牆策略就須要瞭解其規則的組成以及設置規則時所須要思考的要點。
規則組成:報文的匹配條件,匹配到以後的處理動做
匹配條件:根據協議報文特徵指定匹配條件,基本匹配條件和擴展匹配條件
處理動做:內建處理機制由iptables自身提供的一些處理動做
自定義處理機制:可自定義鏈來對匹配到的報文作處理。
注意:報文不會通過自定義鏈,只能在內置鏈上經過規則進行引用後生效,也就是所自定義鏈爲規則的一個處理動做的集合。
設置iptables規則時須要考量的要點:
1、根據要實現哪一種功能,判斷添加在那張表上;
2、根據報文流經的路徑,判斷添加在那個鏈上
流入:PREROUTING--->INPUT
流出:OUTPUT--->POSTROUTING
轉發:PREROUTING---->FORWARD--->POSTROUTING
鏈上其規則的次序,即爲檢查的次序,排列好檢查次序能有效的提升性能,所以隱含必定的法則
一、同類規則(訪問同一應用),匹配範圍小的放上面
2、不一樣類規則(訪問不一樣應用),匹配到報文頻率大的放上面:
3、將那些可由一條規則描述的多個規則合併爲一個
4、設置默認策略
遠程鏈接主機配置防火牆時注意要點:
1,不要把鏈的默認策略修改成拒絕。由於有可能配置失敗或者清除全部策略後沒法遠程到服務器。儘可能使用規則條目配置默認策略
2,爲防止配置失誤策略把本身也拒掉,可在配置策略時設置計劃任務定時清除策略。當肯定無誤後,關閉該計劃任務。
磨刀不誤砍柴工,當以上的東西在腦海中已經有一個框架以後,再學習iptables規則管理工具纔會駕輕就熟。
Man文檔是學習工具的最好方法。這裏再也不詳述,下面把個人學習筆記粘貼出來,以供讀者參考若有錯誤敬請指正。
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,清空規則鏈:省略鏈表示清空指定表上的全部的鏈 -N:new,建立新的自定義規則鏈: -X:drop,刪除用戶自定義的空的規則鏈: -Z:zero,清零,置零規則計數器 -P:policy,爲指定鏈設置默認策略,對filter表中的鏈而言,默認策略一般有ACCEPT,DROP,REJECT; -E:rEname,重命名自定義鏈,引用計數不爲0的自定義鏈,沒法更名,也沒法刪除 規則管理: -A:append,將新的規則追加與指定鏈的尾部 -I:insert,將新規則插入至指定鏈的指定位置(需指定序號,默認爲第一條): -D:delete,刪除指定鏈上的指定規則: 兩種指定方式: 1、指定匹配條件 2、指定規則編號 -R:replace,替換指定鏈上的指定規則。
查看: -L:list,列出指定鏈上的全部規則。 -n:numberic ,以數字格式顯示地址和端口號 -v:verbose,顯示詳細信息 -vv,-vvv --line-numbers:顯示規則編號 -x:exectly,顯示計數器計數結果的精確值。
匹配條件: 基本匹配: [!] -s, --src,--source IP|Netaddr:檢查報文中的源ip地址是否符合此處指定的地址範圍 [!] -d,--dst,--destination IP|Netaddr:檢查報文中的目標ip地址是否符合此處指定的地址範圍 -p ,--protocal{tcp|udp|icmp}:檢查報文中的協議,即ip首部中的protocol所標識的協議,8bit,6標識tcp.17表示udp -i,--in-inteface IFACE :數據報文的流入接口。僅能用於PREROUTING,INPUT,FORWARD鏈 -o,--out-inteface :數據報文的流出接口。僅能用於FORWARD,OUTPUT,POSTROUTING鏈上
擴展匹配:-m macth_name --spec_options eq: -m tcp --dport 22 表示使用tcp擴展的目標端口爲22 隱式擴展:對-p protocal 指明的協議進行擴展,可省略-m選項: -p tcp --dport PORT[-PORT]:目標端口,能夠是單個端口或者連續多個端口 --sport PORT[-PORT] --tcp-flags list1 list2 :檢查list1所指明的全部標誌位,且這其中,list2所表示出的全部標記必須爲1,而餘下的必須爲0,沒有list1中指明的,不作檢查。 SYN,ACK,FIN,RST,PSH,URG, eq:--tcp-flags SYN,ACK,FIN,RST SYN ===== --syn: 檢查三次握手的第一次握手 -p udp --dport --sport -p icmp --icmp-type 可用數字表示其類型: 0 echo-reply 8 echo-request
顯示擴展:
目標: -j target:jump至指定的target ACCEPT:接收 DROP:丟棄 REJECT;拒絕 RETURN:返回調用鏈 REDIRECT:端口重定向 LOG:記錄日誌 MARK:作防火牆標記 DNAT:目標地址轉換 SNAT:源地址轉換 MASQUERADE:地址假裝 ... 自定義鏈:由自定義鏈上的規則進行匹配檢查。
顯示擴展:必須顯示指明使用的擴展模塊(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擴展 指明連續的(但通常不能擴展爲整個網絡)ip地址範圍
[!] --src-range from[-to] 匹配指明連續的源IP地址範圍 [!] --dst-range from[-to] 指明連續的目標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擴展 檢查報文中出現的字符串:
--algo {bm|kmp}:
[!] --string pattern [!] --hex-string pattern 16進制
iptables -I OUTPUT -m string --algo bm --string "movle" -j DROP
4、time擴展 根據報文到達的時間與指定的時間範圍進行匹配 --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擴展 根據每客戶端ip(也能夠是地址塊)作併發鏈接數數量匹配:
--connlimit-above n 鏈接數量大於n --connlimit-upto n 鏈接數量小於等於n # iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT # ssh鏈接大於3後連接被拒絕 6、limit擴展 基於收發報文速率作檢查: 令牌桶過濾器:
--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秒鐘一個迴應一個ping包
7、state擴展 檢查鏈接追蹤機制檢查鏈接的狀態:
調整鏈接追蹤功能所能容納的最大鏈接數量: /proc/sys/net/nf_conntrack_max 已經追蹤到並記錄下的鏈接: /proc/net/nf_conntrack
不一樣協議或者鏈接類型追蹤的時長 /proc/sys/net/netfilter/
可追蹤的鏈接狀態: NEW:新發出的請求:鏈接追蹤模板中不存在此鏈接相關的信息條目,所以,將其識別爲第一次發出的請求 ESTABLISHED:NEW狀態以後,鏈接追蹤模板中爲其創建的條目失效以前期間內所進行的通訊的狀態。 RELATED:相關的鏈接:如ftp協議中的命令鏈接與數據鏈接之間的關係 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
# 對新發起的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服務?
(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 數據鏈接: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) 放行響應報文 ESTABLISHED #iptables -A OUTPUT -d localIP -p tcp -m state --state ESTABLISHED -j ACCEPT
如何保存及重載規則: 保存規則至指定文件: iptables-save > /path/to/somefile
從指定文件重載規則: iptables-restore < /path/from/somefile
centos6: service iptables save iptable-save >/etc/sysconfig/iptables service iptables restart iptables-restore < /etc/sysconfig/iptables 網絡防火牆: 核心轉發配置:/proc/sys/net/ipv4/ip_forward /etc/sysctl.conf net.ipv4.ip_forward=1 nat: SNAT:只修改請求報文的源地址 DNAT:只修改請求報文的目標地址
nat表: PREROUTING: DNAT OUTPUT POSTROUTING: SNAT
源地址轉換 iptables -t nat -A POSTROUTING -s local_net ! -d local_net -j SNAT --to-source public_ip 公網ip固定 iptables -t nat -A POSTROUTING -s local_net ! -d local_net -j MASQUERADE 公網ip不固定
目標地址轉換 iptables -t nat -A POSTROUTING -d public_ip -p tcp|udp --dport PORT -j DNAT --to-destination local_ip:port |