1. 程式人生 > >iptables防火牆基本概念及用法

iptables防火牆基本概念及用法

                                  iptables防火牆基本概念及用法

-------------------------------------------------------------------------------------------------------------------------------------------


一、安全技術

◆***檢測與管理系統(Intrusion Detection Systems):特點是不阻斷任何網路訪問,量化、定位來自內外網路的威脅情況,主要以提供報告和事後監督為主,提供有針對性的指導措施和安全決策依據。一般採用旁路部署方式

◆***防禦系統(Intrusion Prevention System):以透明模式工作,分析資料包的內容如:溢位***、拒絕服務***、***、蠕蟲、系統漏洞等進行準確的分析判斷,在判定為***行為後立即予以阻斷,主動而有效的保護網路的安全,一般採用線上部署方式

◆防火牆(FireWall):隔離功能,工作在網路或主機邊緣(網路進出的邊緣),對進出網路或主機的資料包基於一定的規則檢查,並在匹配某規則時由規則定義的行為進行處理的一組功能的元件,基本上的實現都是預設情況下關閉所有的通過型訪問,只開放允許訪問的策略。防火牆是通過包過濾(packet filter)方式進行防護的

面向某些特定的ip連線,設定白名單;面向全網路訪問,只不允許某些ip訪問設定黑名單

二、防火牆的分類

◆防火牆的分類

●主機防火牆:服務範圍為當前主機

  網路防火牆:服務範圍為防火牆一側的區域網

●硬體防火牆:在專用硬體級別實現部分功能的防火牆;另一個部分功能基於軟體實現,Checkpoint,NetScreen

軟體防火牆:運行於通用硬體平臺之上的防火牆的應用軟體

●網路層防火牆:OSI模型下四層,傳輸層以下,效果好,但識別精度不高

應用層防火牆/代理伺服器:代理閘道器,OSI模型七層,識別精度高,但實現防火牆的延遲高

三、網路防火牆

◆網路層防火牆

●包過濾防火牆

●網路層對資料包進行選擇,選擇的依據是系統內設定的過濾邏輯,被稱為訪問控制列表(ACL),通過檢查資料流中每個資料的源地址,目的地址,所用埠號和協議狀態等因素,或他們的組合來確定是否允許該資料包通過

●優點:對使用者來說透明,處理速度快且易於維護

●缺點:無法檢查應用層資料,如病毒等

image.png

四、應用層防火牆

◆應用層防火牆/代理服務型防火牆(Proxy Service)

●將所有跨越防火牆的網路通訊鏈路分為兩段

●內外網使用者的訪問都是通過代理伺服器上的“連結”來實現

●優點:在應用層對資料進行檢查,比較安全

●缺點:增加防火牆的負載

image.png

◆現實生產環境中所使用的防火牆一般都是二者結合體

●即先檢查網路資料,通過之後再送到應用層去檢查

五、iptables的基本認識

◆Netfilter元件

●核心空間,整合在linux核心中

●擴充套件各種網路服務的結構化底層框架

●核心中選取五個位置放了五個hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而這五個hook function向用戶開放,使用者可以通過一個命令工具(iptables)向其寫入規則

●由資訊過濾表(table)組成,包含控制IP包處理的規則集(rules),規則被分組放在鏈(chain)上

◆三種報文流向:

●流入本機:PREROUTING --> INPUT-->使用者空間程序

●流出本機:使用者空間程序-->OUTPUT--> POSTROUTING

●轉發:PREROUTING --> FORWARD --> POSTROUTING

◆防火牆工具

◆iptables

●命令列工具,工作在使用者空間

●用來編寫規則,寫好的規則被送往netfilter,告訴核心如何去處理資訊包

●iptables規則存放在檔案/etc/sysconfig/iptables,編寫指令碼開機執行iptables-restore < /etc/sysconfig/iptables,可實現開機啟動設定好的防火牆規則

◆firewalld(目前為止只有rhel 7、centos7使用firewalld,其餘大部分linux系統使用的是iptables,所以可以不使用firewalld,解除安裝firewalld後安裝iptables,yum -y install iptables-services)

CentOS7 引入了新的前端管理工具

管理工具:

firewall-cmd命令列

firewall-config圖形

六、iptables的組成

◆iptables由五個表和五個鏈以及一些規則組成,規則放在鏈上,鏈傳送給表上

◆五個表table:filter、nat、mangle、raw、security

filter表:過濾規則表,根據預定義的規則過濾符合條件的資料包

nat表:network address translation 地址轉換規則表

mangle:修改資料標記位規則表

raw:關閉NAT表上啟用的連線跟蹤(conntrack)機制,加快封包穿越防火牆速度

security:用於強制訪問控制(MAC)網路規則,由Linux安全模組(如SELinux)實現

優先順序由高到低的順序為:security -->raw-->mangle-->nat-->filter

◆五個內建鏈chain

INPUT:到本機內部來

OUTPUT:由本機內部來

FORWARD:經由本機轉發

PREROUTING:路由前,剛到路由表未做決策

POSTROUTING:路由後

七、表與鏈的對應關係

◆filter:INPUT,FORWARD,OUTPUT

◆nat:PREROUTING,INPUT,OUTPUT,POSTROUTING

◆mangele:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING

◆raw:PREROUTING,OUTPUT

image.png

八、資料包過濾匹配流程

image.png

九、傳輸過程

◆路由功能發生的時間點

●報文進入本機後

•判斷目標主機是否為本機

是:INPUT

否:FORWARD

◆報文離開本機之前

●判斷由哪個介面送往下一跳

image.png

十、iptables規則

◆規則rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動作作出處理

●匹配條件:預設為與條件,同時滿足

基本匹配:IP,埠,TCP的Flags(SYN,ACK等)

擴充套件匹配:通過複雜高階功能匹配(埠屬於擴充套件匹配)

隱式擴充套件:支援tcp,udp,icmp協議擴充套件

顯示擴充套件:必須明確指定擴充套件模組進行的擴充套件

●處理動作:稱為target,跳轉目標

內建處理動作:ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG...

ACCEPT:允許tongue

DROP:丟棄,請求無響應後立即釋放

REJECT:拒絕,請求有響應但不能訪問

自定義處理動作:自定義chain,利用分類管理複雜情形

◆規則要新增在鏈上,才生效;新增在自定義上不會自動生效

注意:規則執行順序從上而下,第一個規則處理完後有可能不用向下繼續執行,因此把匹配條件更加精確,範圍更小的規則放到上面

◆鏈chain:

內建鏈:每個內建鏈對應於一個鉤子函式

自定義鏈:用於對內建鏈進行擴充套件或補充,可實現更靈活的規則組織管理機制;只有Hook鉤子呼叫自定義鏈時,才生效

十一、iptables新增要點

◆iptables規則新增時考量點

●要實現哪種功能:判斷新增在哪張表上

●報文流經的路徑:判斷新增在哪個鏈上

●報文的流向:判斷源和目的

●匹配規則:業務需要

◆實驗環境準備:

Centos7:systemctl stop firewalld.service

systemctl disable firewalld.service

Centos6:service iptables stop

chkconfig iptables off

十二、iptables命令

◆man 8 iptables

◆iptables [-t table] {-A|-C|-D} chain rule-specification

-A ,attend追加規則

◆iptables [-t table] -I chain [rulenum] rule-specification

-I,insert插入規則,插入第幾條規則

◆iptables [-t table] -R chain rulenum rule-specification

-R,replace替換規則

◆iptables [-t table] -D chain rulenum

-D,delete刪除規則

◆iptables [-t table] -S [chain [rulenum]]

◆iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

-F,flush清空鏈規則

-L,list列出指定規則

子命令-n,避免反解,常用-nL,不能-Ln

-v,-vv,-vvv顯示詳細資訊,常用組合-vnL

-Z,zero歸零規則,重新計數

◆iptables [-t table] -N chain

-N,new新建自定義鏈

◆iptables [-t table] -X [chain]

-X,刪除自定義空鏈或者未被引用的鏈

◆iptables [-t table] -P chain target

-P,policy指定鏈的預設規則

◆iptables [-t table] -E old-chain-name new-chain-name

-E,重新命名鏈

◆rule-specification = [matches...] [target],規則的定義規範

◆match = -m matchname [per-match-options]

◆target = -j targetname [per-target-options],j是jump的意思

image.png

注意:圖片摘自紅帽官網,格式有錯誤,圖中input應該是INPUT

◆規則格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]

◆-t table:

raw, mangle, nat, [filter]預設,其餘項不能省

◆匹配條件

基本:通用的,PARAMETERS

擴充套件:需載入模組,MATCH EXTENTIONS

◆1、基本匹配條件:無需載入模組,由iptables/netfilter自行提供

[!] -s, --source address[/mask][,...]:源IP地址或範圍

[!] -d, --destination address[/mask][,...]:目標IP地址或範圍

[!] -p, --protocol protocol:指定協議,可使用數字如0(all)

protocol: tcp, udp, icmp, icmpv6,udplite,esp, ah, sctp, mhor“all“

參看:/etc/protocols

[!] -i, --in-interface name:報文流入的介面;只能應用於資料報文流入環節,只應用於INPUT、FORWARD、PREROUTING鏈,只匹配報文前半段

[!] -o, --out-interface name:報文流出的介面;只能應用於資料報文流出的環節,只應用於FORWARD、OUTPUT、POSTROUTING鏈,只匹配報文後半段

◆2 、擴充套件匹配條件:需要載入擴充套件模組(/usr/lib64/xtables/*.so),方可生效

◆檢視幫助man iptables-extensions

●(1)隱式擴充套件:在使用-p選項指明瞭特定的協議時,無需再用-m選項指明擴充套件模組的擴充套件機制,不需要手動載入擴充套件模組

•tcp協議的擴充套件選項

[!] --source-port, --sport port[:port]:匹配報文源埠,可為埠範圍

[!] --destination-port,--dportport[:port]:匹配報文目標埠,可為範圍

[!] --tcp-flags mask comp

mask 需檢查的標誌位列表,用,分隔,例如SYN,ACK,FIN,RST

comp 在mask列表中必須為1的標誌位列表,無指定則必須為0,用,分隔

[!] --syn:用於匹配第一次握手

相當於:--tcp-flags SYN,ACK,FIN,RST SYN

iptables -t filter -I INPUT -p --syn --deport 21 -j ACCEPT

注:--tcp-flags SYN表示第一次握手

--tcp-flags SYN,ACK表示第二次握手

--tcp-flasg ACK表示第三次握手

用處:維護系統之前可以設定iptables -A INPUT -tcp-flags SYN -j REJECT,這麼設定使得已經處於連線的使用者不會被踢下線,而且新使用者也連線不了,等待所有使用者(who檢視連線的主機)都不連線了再維護系統

•udp

[!] --source-port, --sport port[:port]:匹配報文的源埠或埠範圍

[!] --destination-port,--dportport[:port]:匹配報文的目標埠或埠範圍

•icmp:網路通訊探測協議,icmp和ip都屬於第三層網路層,但在該層的子層中,icmp位於ip層的上面

[!] --icmp-type {type[/code]|typename}

type/code

0/0 echo-replyicmp應答

8/0 echo-request icmp請求

●(2)顯式擴充套件:必須使用-m選項指明要呼叫的擴充套件模組的擴充套件機制,要手動載入擴充套件模組

[-m matchname[per-match-options]]

•處理動作:

•-j targetname[per-target-options]

簡單:ACCEPT,DROP

擴充套件:REJECT:--reject-with:icmp-port-unreachable預設

RETURN:返回呼叫鏈

REDIRECT:埠重定向

LOG:記錄日誌,dmesg

MARK:做防火牆標記

DNAT:目標地址轉換

SNAT:源地址轉換

MASQUERADE:地址偽裝

...

自定義鏈:

•顯式擴充套件:必須顯式地指明使用的擴充套件模組進行的擴充套件

•使用幫助:

CentOS 6: man iptables

CentOS 7: man iptables-extensions

十三、顯示擴充套件的擴充套件模組

◆1、multiport擴充套件

以離散方式定義多埠匹配,最多指定15個埠,一個,隔開的算一個埠,但是比如20:23此樣的算一個埠

[!] --source-ports,--sports port[,port|,port:port]...

指定多個源埠

[!] --destination-ports,--dportsport[,port|,port:port]...

指定多個目標埠

[!] --ports port[,port|,port:port]...多個源或目標埠

示例:iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT

埠號20到22,81埠

◆2、iprange擴充套件

指明連續的(但一般不是整個網路)ip地址範圍

[!] --src-range from[-to]源IP地址範圍

[!] --dst-range from[-to]目標IP地址範圍

示例:iptables -A INPUT -d 172.16.1.100 -p tcp --dport80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP

◆3、mac擴充套件

指明源MAC地址

適用於:PREROUTING, FORWARD,INPUT chains

[!] --mac-source XX:XX:XX:XX:XX:XX

示例:iptables-A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT

iptables-A INPUT -s 172.16.0.100 -j REJECT

◆4、string擴充套件

對報文中的應用層資料做字串模式匹配檢測

--algo {bm|kmp}字串匹配檢測演算法

bm:Boyer-Moore

kmp:Knuth-Pratt-Morris

--from offset 開始偏移

--to offset 結束偏移

[!] --string pattern要檢測的字串模式

[!] --hex-string pattern要檢測字串模式,16進位制格式

示例:iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT

◆5、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...] 星期幾,1 –7 分別表示星期一到星期日

--kerneltz:核心時區,不建議使用,CentOS7系統預設為UTC

注意:centos6 不支援kerneltz,--localtz指定本地時區(預設)

示例:

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP

◆6、connlimit擴充套件

根據每客戶端IP做併發連線數數量匹配

可防止CC(Challenge Collapsar挑戰黑洞)***--connlimit-upto#:連線的數量小於等於#時匹配

--connlimit-above #:連線的數量大於#時匹配

通常分別與預設的拒絕或允許策略配合使用

示例:

iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

◆7、limit擴充套件

基於收發報文的速率做匹配,記錄每秒鐘記錄多少個報文

令牌桶過濾器:勻速放行,每個時間段存放固定數量的報文,以至於傳送報文是勻速放行

--limit #[/second|/minute|/hour|/day]

--limit-burst number 峰值速率

示例:

iptables-I INPUT -d 172.16.100.10 -p icmp--icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT

iptables-I INPUT 2 -p icmp-j REJECT

◆8、state擴充套件

根據”連線追蹤機制“去檢查連線的狀態,較耗資源

●conntrack機制:追蹤本機上的請求和響應之間的關係

●狀態有如下幾種:

NEW:新發出請求;連線追蹤資訊庫中不存在此連線的相關資訊條目,因此,將其識別為第一次發出的請求,三次握手第一次

ESTABLISHED:NEW狀態之後,連線追蹤資訊庫中為其建立的條目失效之前期間內所進行的通訊狀態

RELATED:新發起的但與已有連線相關聯的連線,如:ftp協議中的資料連線與命令連線之間的關係

INVALID:無效的連線,如flag標記不正確

UNTRACKED:未進行追蹤的連線,如raw表中關閉追蹤

●[!] --state state

示例:

iptables-A INPUT -d 172.16.1.10 -p tcp-m multiport --dports22,80 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables-A OUTPUT -s 172.16.1.10 -p tcp-m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

●已經追蹤到的並記錄下來的連線資訊庫

/proc/net/nf_conntrack

●調整連線追蹤功能所能夠容納的最大連線數量,此值可以修改,建議必要時調整到足夠大

/proc/sys/net/nf_conntrack_max

●不同的協議的連線追蹤時長

/proc/sys/net/netfilter/

●注意:CentOS7 需要載入模組:modprobenf_conntrack

舉例:iptables的連結跟蹤表最大容量為/proc/sys/net/nf_conntrack_max,各種狀態的超時連結會從表中刪除;當模板滿載時,後續連線可能會超時,解決方法兩個:

(1) 加大nf_conntrack_max值

vi /etc/sysctl.conf

net.nf_conntrack_max= 393216

net.netfilter.nf_conntrack_max= 393216

(2) 降低nf_conntracktimeout時間

vi /etc/sysctl.conf

net.netfilter.nf_conntrack_tcp_timeout_established= 300

net.netfilter.nf_conntrack_tcp_timeout_time_wait= 120

net.netfilter.nf_conntrack_tcp_timeout_close_wait= 60

net.netfilter.nf_conntrack_tcp_timeout_fin_wait= 120

iptables-t nat-L -n

十四、開放被動模式的ftp服務

◆裝載ftp連線追蹤的專用模組:

跟蹤模組路徑:/lib/modules/kernelversion/kernel/net/netfilter

vim /etc/sysconfig/iptables-config配置檔案

IPTABLES_MODULES=“nf_conntrack_ftp"

modproblenf_conntrack_ftp

◆放行請求報文:

命令連線:NEW, ESTABLISHED

資料連線:RELATED, ESTABLISHED

iptables–I INPUT -d LocalIP-p tcp-m state --state ESTABLISHED,RELATED -j ACCEPT

iptables-A INPUT -d LocalIP-p tcp--dport21 -m state --state NEW -j ACCEPT

◆放行響應報文:

iptables-I OUTPUT -s LocalIP-p tcp-m state --state ESTABLISHED -j ACCEPT

◆舉例:

yum install vsftpd

systemctlstart vsftpd

modprobenf_conntrack_ftp

iptables-F

iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables-A INPUT -p tcp--dport21 -m state --state NEW -j ACCEPT

iptables-A OUTPUT -m state --state ESTABLISHED -j ACCEPT

iptables-P INPUT DROP

iptables-P OUTPUT DROP

iptables-vnL

十五、iptables命令的target

◆Target:

●ACCEPT,DROP,REJECT,RETURN

●LOG,SNAT,DNAT,REDIRECT,MASQUERADE,..

●LOG:非中斷target,本身不拒絕和允許,放在拒絕和允許規則前,並將日誌記錄在/var/log/messages系統日誌中

--log-level level 級別:debug,info,notice, warning, error, crit, alert,emerg

--log-prefix prefix 日誌字首,用於區別不同的日誌,最多29個字元

●示例:

iptables-I INPUT -s 10.0.1.0/24 -p tcp-m multiport --dports80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections: "

◆任何不允許的訪問,應該在請求到達時給予拒絕

◆規則在連結上的次序即為其檢查時的生效次序

◆基於上述,規則優化

● 安全放行所有入站和出站的狀態為ESTABLISHED狀態連線

●謹慎放行入站的新請求

● 有特殊目的限制訪問功能,要在放行規則之前加以拒絕

同類規則(訪問同一應用),匹配範圍小的放在前面,用於特殊處理

不同類的規則(訪問不同應用),匹配範圍大的放在前面

●應該將那些可由一條規則能夠描述的多個規則合併為一條

●設定預設策略,建議白名單(只放行特定連線)

1)iptables-P,不建議

2)建議在規則的最後定義規則做為預設策略

◆規則有效期限:

使用iptables命令定義的規則,手動刪除之前,其生效期限為kernel存活期限

◆儲存規則:

儲存規則至指定的檔案

◆CentOS 6

service iptables save

將規則覆蓋儲存至/etc/sysconfig/iptables檔案中

◆CentOS7

iptables-save > /etc/sysconfig/iptables

◆CentOS 6:

service iptables restart

會自動從/etc/sysconfig/iptables重新載入規則

◆CentOS 7重新載入預存規則檔案中規則:

iptables-restore < /PATH/FROM/SOME_RULES_FILE

-n, --noflush:不清除原有規則

-t, --test:僅分析生成規則集,但不提交

十六、開機自動過載規則

◆開機自動過載規則檔案中的規則:

◆(1) 用指令碼儲存各iptables命令;讓此指令碼開機後自動執行

/etc/rc.d/rc.local檔案中新增指令碼路徑

/PATH/TO/SOME_SCRIPT_FILE

◆(2) 用規則檔案儲存各規則,開機時自動載入此規則檔案中的規則

/etc/rc.d/rc.local檔案新增

iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE

◆(3)自定義Unit File,進行iptables-restore

十七、網路防火牆

◆iptables/netfilter網路防火牆:

(1) 充當閘道器

(2) 使用filter表的FORWARD鏈

◆注意的問題:

(1) 請求-響應報文均會經由FORWARD鏈,要注意規則的方向性

(2) 如果要啟用conntrack機制,建議將雙方向的狀態為ESTABLISHED的報文直接放行

十八、NAT,只支援單個埠的目標對映

NAT:network address translation

PREROUTING,INPUT,OUTPUT,POSTROUTING

請求報文:修改源/目標IP,由定義如何修改

響應報文:修改源/目標IP,根據跟蹤機制自動實現

SNAT:source NAT POSTROUTING,INPUT

讓本地網路的主機通過某一特定地址訪問外部網路,實現地址偽裝,比如說在公司內部訪問外部網站,使用的ip是經過SNAT轉換過的公司外網IP

請求報文:修改源IP

DNAT:destination NAT PREROUTING,OUTPUT

把本地網路中的主機上的某服務開放給外部網路訪問(釋出服務和埠對映),但隱藏真實IP,比如說內部伺服器開放了80埠,外網訪問公司的httpd服務是訪問開放80埠的伺服器

請求報文:修改目標IP

PNAT:port nat,埠和IP都進行修改,一般我們說的NAT就是指PNAT

私網規劃地址時候不要將地址規劃為公網地址

十九、SNAT的規則

1、nat表的target:

2、SNAT:固定IP

--to-source [ipaddr[-ipaddr]][:port[-port]]

--random

3、iptables -t nat -A POSTROUTING -s LocalNET! -d LocalNet -j SNAT --to-source ExtIP

4、iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24-j SNAT --to-source 172.18.1.6-172.18.1.9