內容:算法
一、防火牆簡介shell
二、iptables簡介瀏覽器
三、iptables的使用說明(主機防火牆和網絡防火牆)安全
四、iptables的保存bash
1、防火牆簡介服務器
一、防火牆(Firewall),它是一種位於內部網絡與外部網絡之間的網絡安全系統。一項信息安全的防禦系統,依照特定的規則,容許或是限制傳輸的數據經過。內部網絡和外部網絡之間的全部網絡數據流都必須通過防火牆,這是防火牆所處網絡位置特性,同時也是一個前提。由於只有當防火牆是內、外部網絡之間通訊的惟一通道,才能夠全面、有效地保護企業網內部網絡不受侵害,因此防火牆通常部署在內網的最外層。網絡
二、防火牆的主要類型併發
網絡層防火牆:框架
網絡層防火牆可視爲一種 IP 封包過濾器,運做在底層的TCP/IP協議堆棧上。咱們能夠以枚舉的方式,只容許符合特定規則的封包經過,其他的一律禁止穿越防火牆(病毒除外,防火牆不能防止病毒侵入)。這些規則一般能夠經由管理員定義或修改,不過某些防火牆設備可能只能套用內置的規則。tcp
咱們也能以另外一種較寬鬆的角度來制定防火牆規則,只要封包不符合任何一項「否認規則」就予以放行。操做系統及網絡設備大多已內置防火牆功能。
較新的防火牆能利用封包的多樣屬性來進行過濾,例如:來源 IP地址、來源端口號、目的 IP 地址或端口號、服務類型(如 HTTP 或是 FTP)。也能經由通訊協議、TTL 值、來源的網域名稱或網段...等屬性來進行過濾。
應用層防火牆:
應用層防火牆是在 TCP/IP 堆棧的「應用層」上運做,您使用瀏覽器時所產生的數據流或是使用 FTP 時的數據流都是屬於這一層。應用層防火牆能夠攔截進出某應用程序的全部封包,而且封鎖其餘的封包(一般是直接將封包丟棄)。理論上,這一類的防火牆能夠徹底阻絕外部的數據流進到受保護的機器裏。
防火牆藉由監測全部的封包並找出不符規則的內容,能夠防範電腦蠕蟲或是***程序的快速蔓延。不過就實現而言,這個方法既煩且雜(軟件有千千百百種啊),因此大部分的防火牆都不會考慮以這種方法設計。
主機防火牆:每個獨立的主機都會載有防火牆的設置,主要用於請求和接受數據,主要做用在filter表的INPUT和OUTPUT鏈
網絡防火牆:部署在一個網絡的出口位置,用於保護整個內部網絡,主要用於轉發數據,主要做用在filter表的FORWORD鏈和nat表的對應鏈中
2、iptables簡介
一、iptables的前身叫ipfirewall,這是一個做者從freeBSD上移植過來的,可以工做在內核當中的,對數據包進行檢測的一款簡易訪問控制工具。可是ipfirewall工做功能極其有限(它須要將全部的規則都放進內核當中,這樣規則纔可以運行起來,而放進內核,這個作法通常是極其困難的)。當內核發展到2.x系列的時候,軟件改名爲ipchains,它能夠定義多條規則,將他們串起來,共同發揮做用,而如今,它叫作iptables,能夠將規則組成一個列表,實現絕對詳細的訪問控制功能,它是依賴許多行和列組成的規則表組成,所以叫iptables。。
二、iptables其實應該叫netfilter/iptables它實際上由兩個組件netfilter 和 iptables 組成。
netfilter 組件也稱爲內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
iptables 組件是一種規則編寫工具,也稱爲用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。
三、iptables是定義規則的工具,自己並不算是防火牆。它定義的規則,可讓在內核空間當中的netfilter來讀取,而且實現讓防火牆工做。而放入內核的地方必需要是特定的位置,必須是tcp/ip的協議棧通過的地方。而這個tcp/ip協議棧必須通過的地方,能夠實現讀取規則的地方就叫作 netfilter.(網絡過濾器)
內核空間中有5個位置能夠被設計來進行數據的過濾:
(1.進入本機的外網接口(PREROUTING)
(2.數據包從內核流入用戶空間的(INPUT)
(3.數據包從用戶空間流出的(OUTPUT)
(4.從一個網絡接口進來,到另外一個網絡接口去的(FORWORD)
(5.離開本機的內網接口(POSTROUTING)
由上圖能夠看出,一個數據包通過時,有必須通過這5個關卡的其中一個或多個,而每一個關卡均可以作相關的規則來進行限制,這個關卡的就叫作CHAIN(鏈),而每一個關卡都會經過數據包的特徵來進行判斷(IP、port等)
iptables的表有四種,顧名思義,每一個表的名字都已經高度歸納了其功能,即filter表、nat表、mangle表和raw表,分別用於實現包過濾(防火牆),網絡地址轉換、包重構(修改)和數據跟蹤處理,而每一個表又定義了不一樣的鏈組合:
表的優先級:
row--mangle--nat--filter
其中INPUT、OUTPUT鏈更多的應用在「主機防火牆」中,即主要針對服務器本機進出數據的安全控制;而FORWARD、PREROUTING、POSTROUTING鏈更多的應用在「網絡防火牆」中,特別是防火牆服務器做爲網關使用時的狀況。
3、iptables的安裝以及使用說明
一、netfilter:位於內核中的tcp/ip協議棧報文處理框架,通常只須要安裝iptables管理工具便可
二、iptables命令:
iptables的語法:
iptables [-t TABLE] COMMAND CHAIN [num] 匹配標準 -j(jump) 處理辦法
注意全部的規則都是添加上去後當即生效,但不是永久生效。
規則:根據指定的匹配條件來嘗試匹配每一個流經此處的報文,一旦匹配成功,則由規則後面指定的處理動做進行處理;
匹配條件:
基本匹配條件:源地址,目標地址,傳輸層協議
擴展匹配條件:須要藉助於擴展模塊進行指定的匹配條件
隱式擴展:已經在基本匹配條件中指明的協議相關的擴展;
顯式擴展:隱式擴展以外的其它擴展匹配條件;
處理動做:
基本動做:ACCEPT,DROP,...
擴展動做:須要藉助於擴展模塊進行,但無須顯式指定,僅需指明動做;
添加規則時須要考量的問題:
(1) 報文流經的位置:用於判斷將規則添加至哪一個鏈;
(2) 實現的功能:用於判斷將規則添加至哪一個表;
(3) 報文的方向:用於判斷哪一個爲「源」,哪一個爲「目標」;
(4) 匹配條件:用於編寫可以正確匹配目標報文的規則;
三、iptabls命令的使用格式:
table只有四個,因此無需多講,下面來看看COMMAND的用法
(1)COMMANDS:按照功能分類,大體能夠分爲一下幾類:
鏈管理類:
-P:定義鏈的默認策略;其target通常可以使用ACCEPT或DROP,accept表示全部均可以經過,只有設置的黑名單不能經過,而drop的效果相反,全部都不能經過,只有白名單的才能經過,建議使用accept白名單的模式;
-N:自定義規則鏈;僅在默認鏈經過某規則進行調用方可生效;所以,每一個自定義鏈都有其引用記數;
-X:刪除自定義的空的引用計數爲0的鏈;
-F:-F [chain [rulenum]] [options...],清空指定的鏈,或刪除指定鏈上的規則 ;
-E:-E old-chain-name new-chain-name,重命名自定義的引用計數爲0的鏈;
-Z:-Z [chain [rulenum]] [options...],置零
規則管理類:
-A:追加規則到指定的鏈尾部;
-I:插入規則到指定的鏈中的指定位置,默認爲鏈首;
-D:刪除指定的鏈上的指定規則;
-R:將指定的鏈上的指定規則替換爲新的規則;
查看規則類:
-L:list, iptables [-t table] -L [chain [rulenum]] [options...]
-n:數字格式;
-v:verbose,詳細格式信息;
-vv, -vvv
--line-numbers:顯示鏈上的規則的編號;
-x:exactly,顯示計數器的精確值;
注意,查看時 iptables -Lvn和iptables -vnL的命令效果是不同的,參數是按順序來進行匹配
iptables-save能夠在標準輸出查看全部的表的規則狀況。
計數器類:
每條規則以及鏈的默認策略分別有各自的兩個計數器:
1) 匹配到的報文的個數:pkts
2) 匹配到的全部報文的大小之積:bytes
(2)PARAMETER(匹配條件)
匹配條件能夠分爲:基本的匹配條件和擴展的匹配條件,
注意:多重條件之間的隱含邏輯爲「與」操做;
基本匹配條件:
[!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或地址範圍;
[!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或地址範圍;
[!] -p, --protocol protocol:檢查報文中傳輸層的協議類型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all";
[!] -i, --in-interface name:檢查報文進入本機時的接口是否符合本處指定的接口;INPUT, FORWARD and PREROUTING ;
[!] -o, --out-interface name:檢查報文即將離開本機時經由的接口是否符合本處指定的接口;FORWARD, OUTPUT and POSTROUTING;
-m, --match match:顯式指明要使用的擴展模塊;
-j, --jump target:跳轉目標;
擴展匹配條件:
隱式擴展:不用-m選項明確給出要使用的擴展機制的擴展;此處主要指使用-p {tcp|udp|icmp}給定協議後可直接對給定的協議所進行的擴展;
-p tcp:可直接使用tcp協議對應的擴展選項;
[!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個鏈接的端口;
[!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個鏈接的端口;
[!] --tcp-flags mask comp
tcp-flags:SYN,ACK,FIN,RST,URG,PSH;
mask:要檢查的標誌位列表,以逗號分隔,例如SYN,ACK,FIN,RST
comp:mask給定的衆標誌位中,其值必須爲1的標誌位列表,餘下的必須爲0;
--tcp-flags SYN,ACK,FIN,RST SYN
[!] --syn:至關於--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:可直接使用udp協議對應的擴展選項;
[!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個鏈接的端口;
[!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個鏈接的端口;
-p icmp:可直接使用icmp協議對應的擴展選項;
[!] --icmp-type {type[/code]|typename}
--icmp-type 0/0:匹配對ping請求的響應報文
--icmp-type 8/0:匹配ping請求報文
顯式擴展:必須使用-m選項給出matchname的擴展,並且有些擴展都還存在專用選項;
1)multiport:以離散或連續的方式定義的多端口匹配條件; Up to 15 ports can be specified.
[!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
!] --ports port[,port|,port:port]...:匹配此處指定的源或目標端口;
2)iprange:以連續的ip地址範圍指明多地址匹配條件;
[!] --src-range from[-to]
[!] --dst-range from[-to]
3)string:對報文中的應用層數據作字符串匹配檢測;
[!] --string pattern
[!] --hex-string pattern
--algo {bm|kmp}:字符串匹配檢查算法(這是必須帶上的參數,不然會報錯);
4)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...]
[!] --weekdays day[,day...]
5)connlimit :根據每客戶端IP作併發鏈接數限制,即限制單IP可同時發起鏈接請求;
--connlimit-upto n:鏈接數小於等於閾值;
--connlimit-above n:鏈接數超出閾值;
例:
~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT:表示容許SSH鏈接的最大鏈接數爲2個。
6)limit :基於收發報文的速率進行匹配;
--limit rate[/second|/minute|/hour|/day]
- -limit-burst number
例:
~]# iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT #每分鐘只能處理ping請求20個
7)state :狀態檢測:鏈接追蹤機制(conntrack)
NEW:新鏈接
ESTABLISHED:已創建的鏈接
RELATED:相關聯的鏈接
INVALID:沒法識別的鏈接
UNTRACKED:未被追蹤鏈接;
相關的內核模塊:
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp
追蹤到的鏈接保存在/proc/net/nf_conntrack文件中;
能追蹤的最大鏈接數量定義在:/proc/sys/net/nf_conntrack_max
建議調整至足夠大;
不一樣的協議的鏈接追蹤時長定義在:/proc/sys/net/netfilter/
用法:
[!] --state state
例:如何開放被動模式的ftp服務步驟:
1) 裝載追蹤ftp協議的模塊;
# modprobe nf_conntrack_ftp
2) 放行入站命令鏈接
# iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
3) 放行入站數據鏈接
# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
4) 放行出站的ESTABLISHED鏈接
# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
(3)target:要處理的動做,通常有-j來跳轉進行動做的處理
處理動做(跳轉目標):
-j tagetname [per-target-options]
簡單target:ACCEPT,DROP
擴展target:
REJECT:(拒絕服務)
--reject-with type
icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默認爲icmp-port- unreachable;
LOG:記錄日誌
Turn on kernel logging of matching packets.
--log-level level
--log-prefix prefix:日誌信息的前導信息;
(4)自定義鏈的使用:
1)新建一個自定鏈
[root@localhost ~]# iptables -N nihao [root@localhost ~]# iptables -vnL Chain INPUT (policy ACCEPT 32 packets, 2304 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 9 packets, 876 bytes) pkts bytes target prot opt in out source destination Chain nihao (0 references) pkts bytes target prot opt in out source destination
2)向自定義鏈添加規則
# iptables -A nihao -d 10.1.252.36 -p tcp --dport 21 -j DROP
3)將要處理的數據包跳轉至自定義連接
# iptables -A INPUT -d 10.1.252.36 -j nihao
4)刪除自定鏈
[root@localhost ~]# iptables -X nihao [root@localhost ~]# iptables -nvL Chain INPUT (policy ACCEPT 10 packets, 859 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 4 packets, 416 bytes) pkts bytes target prot opt in out source destination
四、iptables/netfilter網絡防火牆:
一、添加規則於FORWARD鏈,注意幾個問題:
(1) 請求和響應報文均會經由FORWARD鏈,要注意規則的方向性;
第一條:iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
(2) 若是能夠啓用conntrack機制,注意網關主機所可以追蹤的鏈接數的最大數量要符合須要
二、NAT:
NAT英文全稱是Network Address Translation,稱是網絡地址轉換,它是一個IETF標準,容許一個機構以一個地址出如今Internet上。NAT將每一個局域網節點的地址轉換成一個IP地址,反之亦然。它也能夠應用到防火牆技術裏,把個別IP地址隱藏起來不被外界發現,使外界沒法直接訪問內部網絡設備,同時,它還幫助網絡能夠超越地址的限制,合理地安排網絡中的公有Internet 地址和私有IP地址的使用。
NAT的類型
靜態NAT(Static NAT)
靜態NAT設置起來最爲簡單和最容易實現的一種,內部網絡中的每一個主機都被永久映射成外部網絡中的某個合法的地址。
動態地址NAT(Pooled NAT)
動態地址NAT是在外部網絡中定義了一系列的合法地址,採用動態分配的方法映射到內部網絡。
源地址轉換:SNAT,做用在POSTROUTING鏈上
靜態轉換:
動態轉換:
目標地址轉換:DNAT,做用在PREROUTING鏈上
(1).SNAT基於原地址的轉換
基於原地址的轉換通常用在咱們的許多內網用戶經過一個外網的口上網的時候,這時咱們將咱們內網的地址轉換爲一個外網的IP,咱們就能夠實現鏈接其餘外網IP的功能。
定義的格式:
好比咱們如今要將全部192.168.10.0網段的IP在通過的時候全都轉換成172.16.100.1這個假設出來的外網地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
這樣,只要是來自本地網絡的試圖經過網卡訪問網絡的,都會被通通轉換成172.16.100.1這個IP.
那麼,若是172.16.100.1不是固定的怎麼辦?
咱們都知道當咱們使用聯通或者電信上網的時候,通常它都會在每次你開機的時候隨機生成一個外網的IP,意思就是外網地址是動態變換的。這時咱們就要將外網地址換成 MASQUERADE(動態假裝):它能夠實現自動尋找到外網地址,而自動將其改成正確的外網地址。因此,咱們就須要這樣設置:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
(2).DNAT目標地址轉換
對於目標地址轉換,數據流向是從外向內的,外面的是客戶端,裏面的是服務器端經過目標地址轉換,咱們可讓外面的ip經過咱們對外的外網ip來訪問咱們服務器不一樣的服務器,而咱們的服務卻放在內網服務器的不一樣的服務器上。
定義的格式:
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2
目標地址轉換要作在到達網卡以前進行轉換,因此要作在PREROUTING這個位置上
4、iptables的保存
一、保存和載入規則,建議使用手動保存規則列表:
經過重定向保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE 注意:重載文件中的規則,會清除已有規則;
-n, --noflush:不清除原有規則
-t, --test:僅分析生成規則集,但不予提交;
CentOS 6:
保存規則:service iptables save:保存規則於/etc/sysconfig/iptables,保存操做會清除文件中原有的內容;
也能夠iptables-save命令重定向輸出文本保存,須要恢復時iptables-restore進行重定向輸入便可導入
CentOS 7開機自動生效規則:
(1) firewalld服務;
(2) shell腳本,直接記錄iptables命令;
(3) 自定義unit file或init script;
規則優化的思路:
(1) 優先放行雙方向狀態爲ESTABLISHED的報文;
(2) 服務於不一樣類別的功能的規則,匹配到報文可能性更大的放前面;
(3) 服務於同一類別的功能的規則,匹配條件較爲嚴格的放前面;
(4) 設置默認策略:白名單機制
(a) 可以使用iptables -P設定默認策略;
(b) 建議在規則鏈的最後定義規則作爲默認策略;
OK,更多文章請關注個人博客。