防火牆(Firewall),就是一個隔離工具,工作于<code>主機</code>或者<code>網絡</code>的邊緣,對于進出本主機或本網絡的封包,根據事先定義的檢查規則做比對檢測,對于能夠被規則比對到的封包作出相應處理的元件 , 就稱之為防火牆,即可稱為<code>主機防火牆</code>和<code>網絡防火牆</code> 其主機防火牆工作于主機的邊緣, 網絡防火牆工作于網絡的邊緣. 從防火牆實作的方法又可以劃分為<code>軟體防火牆</code>和<code>硬體防火牆</code>. 其軟體防火牆純軟體邏輯實作,而硬體防火牆能實作硬體層實作封包或者解包, 但離不開軟體的輔助. 目前市場上比較常見的三層, 四層的防火牆,叫網絡層的防火牆, 七層的防火牆, 其實就是代理層的網關.從設計上來講, 七層防火牆更加安全,但是卻帶來了效率更低.是以市場的能用方案為兩者結合,而又由于我們都需要從防火牆所控制的這個口來通路, 是以防火牆的工作效率就成了使用者能夠通路資料多少的一個最重要的控制,配置的不好甚至有可能成為流量的瓶頸.
iptables的前者叫ipfirewall(核心1.X時代),這是一個作者從freeBSD移值過來的, 能夠工作在核心當中, 對資料包進行檢測的一款簡易通路控制工具, 但是ipfirewall工作極其有限(它需要将所有的規則都放進核心中, 這樣規則才能夠運作起來,而放進核心,這個做法一般是極其困難). 當核心發展到2.X系列的時候, 軟體更名為ipchains, 它可以定義多條規則 , 将他們串進來,共同發揮作用,被稱之為iptables. 可以将規則組成一個清單,實作絕對詳細的通路控制功能.
他們都是工作在使用者空間中, 定義規則的工具本身并不算是防火牆, 它們定義的規則,可以讓在核心空間中的<code>netfilter</code>來讀取,并實作讓防火牆工作,而放進的地方必須要是特定的位置,必須是tcp/ip協定棧的地方, 而這個tcp/ip協定棧必須經過的地方, 可以實作讀取規則的功能稱之為<code>netfilter(網絡過濾器)</code>
作者一共在核心空間中選擇了5個位置
從一個網絡接口進來, 到另一個網絡接口去的
資料包從核心流入使用者空間的
資料包從使用者空間流出的
進入/離開本機的外網接口
進入/離開本機的内網接口
iptables是工作在使用者空間中的, 它可以編寫規則, 其是一個rules until工具, 通過ipfw(firewall framework)在核心中生成系統規則(其是通過系統調用完成),再由ipchains工具将規則寫入核心空間中,并寫入netfilter.
從上面知道了作者選擇的5個位置, 來作為控制的地方, 其實前三個位置已經基本上能夠将路徑徹底封鎖了, 但是為什麼已經在進出的口設定了關卡後還要在内部卡呢 ? 由于資料包尚未進行路由決策,還不知道資料要走向那裡, 是以在進出口是沒有辦法實作資料過濾的. 是以要在核心空間裡設定轉發的關卡. 進入使用者空間的關卡,從使用者空間出去的關卡, 那麼,既然他們沒什麼用,那我們為什麼還要設定他們呢? 因為我們在做NAT和DNAT的時候,目标位址轉換必須在路由之前轉換, 是以我們在外網而後内網的接口進行設定關卡.
這五個位置也被稱為五個鈎子函數(hook functions),也叫五個内置規則鍊
1 <code>PREROUTING(路由前)</code>
2 <code>INPUT(資料包流流入入)</code>
3 <code>FORWARD(轉發)</code>
4 <code>OUTPUT(資料包流出)</code>
5 <code>POSTROUTING(路由後)</code>
工作原理圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISM9knehx2X4dnJ10TbvJnZ4dnJn5Gc9QXbm9Fe39DM0YzLcFlNaZnU1QnYyRFZiNTcQplbz42YpZnYpNnNrBDWyhWe4A3dTV2Mu5GNwp3Nu5WemJ1Srp0YpVzd41ENBRFU3FmMUZTSLh3azhmaHF1VBt2YpJ0bHV2cTJWa0J3LcpXai1Wbvwlbj5yYpBXcuoXai1Wbvw1LcpDc0RHaiojIsJye.jpg)
在不同鍊可實作的不同功能,從功能劃分:
<code>filter</code> : 過濾,防火牆,做包過濾
<code>nat</code> : network address translation,網絡位址轉換,修改源或目标IP, 也可以改端口
<code>mangle</code> : 拆解封包, 做出修改,并且重新封裝起來(不修改IP或端口)
<code>raw</code> : 關閉nat表上啟用的連接配接追蹤功能
表的優先級,依次順序為:
<code>raw</code>
<code>mangel</code>
<code>nat</code>
<code>filter</code>
不同的功能應用的鍊:
<code>raw</code> : PREROUTING OUTPUT
<code>mangle</code> : PREROUTING INPUT FORWARD OUTPUT POSTROUTING
<code>nat</code> : PREROUTING (INPUT) OUTPUT POSTROUTING
Centos 7上可以在INPUT上實作nat功能
<code>filter</code> : INPUT OUTPUT FORWARD
從封包流向經過的鍊
流入 : PREROUTING—→INPUT
流出 : OUTPUT—→POSTROUTING
轉發 : PREROUTING-→FORWARD-→POSTROUTING
路由功能發生的時刻:
當封包進入本機後, 判斷目标主機是誰? 當封包離開本機前, 判斷經由那個接口送往下一站?
iptables的鍊
内置鍊: 每個對應一個勾子函數(hook function)
自定義鍊: 用于對内置鍊的擴充和補充,可實作更靈活的規則管理機制,被内置鍊關聯,必須由内置鍊調用才會生效
iptables添加規則時的考量點:
要實作那種功能,raw mangle filter, 判斷添加到那張表上
封包流經過的路徑: 判斷添加到那個鍊上
鍊上的規則次序,即是檢查的次序, 是以隐含一定的應用法則:
同類規則(通路同一應用),比對範圍小的放在上面
不同類規則(通路不同應用),比對到封包頻率較大的放在上面
将那此可由一條規則描述的多個規則合并進來
設定預設政策
iptables的規則比對法則
規則比對從上而下依次比對, 如果比對到了相關的規則, 則應用并不檢查以下的規則, 當所有的規則都未比對到時, 則應用預設政策
使用通用格式
<code>iptables [-t tables] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]</code>
<code>鍊管理</code>
<code>ACCEPT</code> : 接受
<code>DROP</code> : 丢棄
<code>REJECT</code> : 拒絕
<code>-N</code> : new,自定義一條新的規則鍊
<code>-X</code> : delete/drop, 删除自定義的規則鍊,指明名字删除一個, 不指明将删除多個
<code>-P</code> : policy, 設定預設政策, 指明是黑名單還是白名單,對于filter表中的鍊而方, 其預設政策有:
<code>-E</code> : 重命名自定義鍊, 引用計數不為0的自定義鍊, 不能被重命名或者删除
<code>規則管理</code>
比對到的封包個數
比對到的所有封包的大小之和(位元組數)
指明鍊,即清空指定鍊上的規則
不指明鍊, 即清空所有鍊上的規則
指明替換号
指明替換規則本身
指明規則号删除
指明規則本身
<code>-A</code> : append, 追加規則
<code>-I</code> : insert, 插入規則,需要指明位置,省略時表示第一條
<code>-D</code> : delete, 删除規則
<code>-R</code> : replace, 替換指定鍊上的指定規則
<code>-F</code> : flush, 清空指定的規則鍊
<code>-Z</code> : zero, 置零
<code>檢視</code>
<code>-n</code> : numberic ,以資料格式顯示位址和端口
<code>-v</code> : verbose ,詳細資訊
<code>-x</code> : exactly(精确的),顯示計數器結果的精确值
<code>--line-numbers</code> : 顯示規則的序号
vv
vvv
<code>-L</code> : list, 列出指定鍊上的所有規則
<code>PREROUTING</code>
<code>INPUT</code>
<code>FORWARD</code>
<code>OUTPUT</code>
<code>POSTROUTING</code>
基本比對條件
無需加載任何子產品,由iptables/netfilter自行提供
<code>[!]-s, --source address[/mask][,...]</code>
檢查封包中源IP位址, 是否符合此處指定的位址或範圍
<code>[!]-d, --destination address[/mask][,...]</code>
檢查封包中的目标IP位址,是否符合此處指定的位址或範圍
<code>[!]-p, --protocol protocol</code>
表明在傳輸層應用的協定,其可以有tcp,udp,udplite,icmp,icmpv6, esp,ah,sctp,mh 或者all
<code>[!]-i, --in-interface name</code>
隻能應用于資料封包流入的接口,INPUT,FORWARD and PREROUTING chains
<code>[!]-o, --out-interface name</code>
隻能應用于資料封包流出的接口,OUTPUT,FORWARD POSTROUTING
隐匿擴充
不需要手動加載擴充子產品,因為它們是對協定的擴充,是以但凡使用<code>-p</code>指明了協定,就表示已經指明了要擴充的子產品
<code>[!] --icmp {type[/code] | typename}</code>
echo-request === 8
echo-replay === 0
<code>[!] --source-port --sport port[:port]</code>
<code>[!] --destination-port --dport port[:port]</code>
比對封包的源端口,可以是端口範圍
比對封包的目标端口,可以是端口範圍
<code>[!]--source-port, --sport port[:port]</code>
<code>[!]--destination-port, --dport port[:port]</code>
<code>[!]--tcp-flags mask comp</code>
<code>--syn</code> : 比對第一次握手,相當于 —tcp-flags syn,ack,fin,rst syn
mask : 必須要檢查的辨別位,必須以,号分隔
comp : 必須為1的辨別位,必須以,号分隔
<code>tcp</code>
<code>udp</code>
<code>icmp</code>
顯示擴充
必須使用<code>-m</code>選項手動加載子產品, 其擴充子產品路徑為:/lib64/xtables,其中大寫的為目标擴充,小寫的為規則擴充
Centos 6 : man iptables
Centos 7 : man iptables-extensions
擷取擴充選項幫助
<code>multiport擴充</code> : 以離散方式定義多端口比對,但最多指定15個端口
指定多個目标及源端口
指定多個目标端口
指定多個源端口
<code>[!] --source-ports, --sports port[,port | ,port:port]</code>
<code>[!] --destination-ports, --dports port[,port | ,port:port]</code>
<code>--ports port[,port | ,port:port]</code>
<code>iprange擴充</code> : 指明連續的(不一般不能整個網絡)ip位址範圍
目标IP位址
源IP位址
<code>[!] --src-range from[-to]</code>
<code>[!] --dst-range from[-to]</code>
<code>string 擴充</code> : 對封包中的應用層資料,做字元串模式比對檢測
<code>--alog {bm | kmp}</code> : 字元串比對檢測算法
<code>[!] --string pattern</code> : 要檢測的字元串模式
<code>[!] --hex-string pattern</code> : 要檢測的字元串模式,16進制格式
<code>time 擴充</code> : 根據封包到達時間與指定的時間範圍進行比對
<code>--datestart YYYY[-MM-DD[Thh[:mm[:ss]]]]</code>
<code>--datestop YYYY[-MM-DD[Thh[:mm[:ss]]]</code>
<code>--timestart hh:mm[:ss]</code>
<code>--timestop hh:mm[:ss]</code>
<code>[!]--monthdays day,[day….]</code>
<code>[!]--weekdays day[,day…]</code>
<code>--kerneltz</code> : 使用核心的時間,而非預設的UTC時區(Centos 7)
<code>connlimit 擴充</code> : 對每用戶端IP做并發連接配接數量比對
<code>--connlimit-upto n</code> : 當現在的連接配接數量低于或等于這個數量(n),就比對
<code>--connlimit-above n</code> : 當現有的連接配接數量大于這個數量, 就比對
<code>limit擴充</code> : 基于收發封包的速率做比對
<code>--limit rate [/second | /minute | /hour]</code> : 平均速率
<code>--limit-burst NUMBER</code> : 峰值數量,預設5個
<code>state擴充</code>
需手動加載nf_conntrack_ftp : <code>modprobe nf_conntrack_ftp</code>
示例如下
修改max的核心參數 , vim /etc/sysctl.conf
降低nf_conntrack timout時間, vim /etc/sysctl.conf
<code>/proc/sys/net/netfilter</code>
<code>/porc/net/nf_conntrack</code>
<code>/proc/sys/net/nf_conntrack_max</code>
<code>NEW</code> : 新發起的請求
<code>ESTABLISHED</code> : new狀态之後,連接配接追蹤模闆中為其建立的條目失效之前期間内所有的通信狀态
<code>RELATED</code> : 相關的連接配接,如FTP協定中的指令連接配接與資料連接配接之間的關系
<code>INVALID</code> : 無效的連接配接,如tcp狀态全為1或者全為0的連接配接
<code>UNTRACKED</code> : 未進行追蹤的連接配接
根據連接配接追蹤機制,查檢連接配接的狀态, 跟TCP沒有關系,是核心中netfilter實作, 能實作tcp,udp,icmp的連接配接追蹤,核心會記錄每一個連接配接(放置在記憶體中),誰,通過什麼協定, 通路什麼服務, 通路的時間,這種機制被稱之為conntrack機制.也正是有了state擴充,iptables成為了有連接配接追蹤的防火牆,安全性是更高. 是由state擴充提供,庫檔案為ibxt_conntrack.so. 追蹤連接配接功能在核心的記憶體空間中,把出去和進來的連接配接通過模闆建立關聯關系. 追蹤本機的請求和響應之間的關系,狀态如下幾種:
調整連接配接追蹤功能所容納的最大連接配接數量:
已經追蹤到的并記錄下來的連接配接:
不同協定的連接配接追蹤狀态時長(可修改)
<code>[!] --state STATE</code> : 多個state可以使用,号分隔
iptables的連接配接追蹤表最大容量為/proc/sys/ipv4/ip_conntrack_max, 連結達到各種狀态的逾時後,會從表中删除,當模闆滿載時, 後續的連結可能會逾時,可以有如下兩種解決方法(但加大max值, 也會加大記憶體的壓力)
如何放行被動模式的ftp服務
target的分類
<code>RETURN</code> : 傳回調用鍊
<code>REDIRECT</code> : 端口重定向
<code>LOG</code> : 記錄日志
<code>--log-level LEVEL</code> : 日志的等級
<code>--log-prefix FREFIX</code> : 日志的提示語句的字首
<code>MASK</code> : 做防火牆标記
<code>DNAT</code> : 目标位址轉換
<code>SNAT</code> : 源位址轉換
<code>MASQUERADE</code> : 位址僞裝
<code>使用者自定義鍊</code>
配置管理
Centos 6
service iptables save : 将規則儲存至/etc/sysconfig/iptables檔案中, 預設儲存路徑
iptables-save > /path/to/some_rules_file(适用于Centos 7)
iptabes-restore < /etc/sysconfig/iptables(适用于Centos 7)
用規則檔案儲存各規則,至/etc/rc.d/rc.local檔案,開機可自動加載
服務管理
start : 讀取事先儲存的規則 , 并應用于netfilter上
stop : 清空netfilter的規則 , 以及還原預設政策
status : 顯示生效的規則
restart : 先清空netfilter的規則 , 再讀取規則
serivce iptables {start|stop|restart|status}
Centos 7
systemctl {start|stop|disable} firewalld.service
nat(network adress tanslate),其可以分為SANT,DNAT,PNAT.NAT的誕生是為了解決内網主機的安全, 但後期又應用于IPV4位址不夠用,發揮了很大的作用
<code>SNAT</code>
用戶端通路公網時,才需做源位址轉換,發生的位置為:POSTROUTING或者OUTPUT
<code>DNAT</code>
本地網絡中的某一主機上的某服務開放給公網的使用者通路,時,發生的位置為:PREROUTING, 也可以完成端口映射
<code>PNAT</code>
釋出服務的端口重定向,80-→8080
nat表的target
<code>--to-source [ipaddr[-ipaddr]][:port[-port]]</code>
<code>--random</code> : 随機選一個源位址
<code>MASQUERADE</code>
當源位址轉換時, 當位址為動态擷取時, MASQUERADE可自行判斷要轉換的位址(其有額外開銷,如果是靜态位址,建議不要使用)
<code>--to-destination [ipaddr[-ipaddr]][:port[-port]]</code>
常見用法:
補充:利用iptables的recent子產品來抵禦DOS攻擊: 22,建立一個清單,儲存有所有通路過指定的服務的用戶端IP
練習:INPUT和OUTPUT預設政策為DROP;
練習:判斷下述規則的意義:
# iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
本文轉自 tianya1993 51CTO部落格,原文連結:http://blog.51cto.com/dreamlinux/1837664,如需轉載請自行聯系原作者