20171018 Linux防火墻

  • 防火墻的概念
  • iptables的簡(jiǎn)介
  • iptables命令
  • 網(wǎng)絡(luò)防火墻
  • NAT
  • firewalld服務(wù)

一、防火墻的概念

(一)安全技術(shù)簡(jiǎn)介

(1)入侵檢測(cè)與管理系統(tǒng)(Intrusion Detection System)
  • 特點(diǎn):不阻斷任何網(wǎng)絡(luò)訪問(wèn)
  • 功能:提供報(bào)告和事后監(jiān)督
  • 旁路部署
(2)入侵防御系統(tǒng)(Intrusion Prevention System)
  • 特點(diǎn):透明模式工作,分析數(shù)據(jù)包
  • 功能:判定為攻擊時(shí),立即阻斷攻擊連接
  • 在線部署
(3)防火墻(Firewall)
  • 特點(diǎn):默認(rèn)關(guān)閉所有通過(guò)訪問(wèn),只開(kāi)放允許訪問(wèn)的策略
  • 功能:基于設(shè)置的規(guī)則對(duì)進(jìn)出網(wǎng)絡(luò)或主機(jī)的數(shù)據(jù)包進(jìn)行審查,并在符合相關(guān)規(guī)則時(shí)執(zhí)行規(guī)則定義的某些行為
  • 工作在網(wǎng)絡(luò)或主機(jī)的邊緣,起到隔離的作用

(二)防火墻的分類

(1)按照服務(wù)范圍分
  • 主機(jī)防火墻:服務(wù)范圍為當(dāng)前主機(jī)
  • 網(wǎng)絡(luò)防火墻:服務(wù)范圍為防火墻一側(cè)的局域網(wǎng)
(2)按照實(shí)現(xiàn)方式分
  • 硬件防火墻:在專用硬件級(jí)別實(shí)現(xiàn)部分功能的防火墻,另一個(gè)部分功能基于軟件實(shí)現(xiàn),Checkpoint,NetScreen
  • 軟件防火墻:運(yùn)行于通用硬件平臺(tái)之上的防火墻的應(yīng)用軟件
(3)按照工作的網(wǎng)絡(luò)層次分
  • 網(wǎng)絡(luò)層防火墻:OSI下面第三層
  • 應(yīng)用層防火墻/代理服務(wù)器:代理網(wǎng)關(guān),OSI七層

(三)網(wǎng)絡(luò)層防火墻

  • 包過(guò)濾防火墻
  • 網(wǎng)絡(luò)層對(duì)數(shù)據(jù)包進(jìn)行選擇,選擇的依據(jù)是系統(tǒng)內(nèi)設(shè)置的過(guò)濾邏輯,被稱為訪問(wèn)控制列表(ACL),通過(guò)檢查數(shù)據(jù)流中每個(gè)數(shù)據(jù)的源地址,目的地址,所用端口號(hào)和協(xié)議狀態(tài)等因素,或他們的組合來(lái)確定是否允許該數(shù)據(jù)包通過(guò)
  • 優(yōu)點(diǎn):對(duì)用戶來(lái)說(shuō)透明,處理速度快且易于維護(hù)
  • 缺點(diǎn):無(wú)法檢查應(yīng)用層數(shù)據(jù),如病毒等

(四)應(yīng)用層防火墻/代理服務(wù)型防火墻

  • 將所有跨越防火墻的網(wǎng)絡(luò)通信鏈路分為兩段
  • 內(nèi)外網(wǎng)用戶的訪問(wèn)都是通過(guò)代理服務(wù)器上的“鏈接”來(lái)實(shí)現(xiàn)
  • 優(yōu)點(diǎn):在應(yīng)用層對(duì)數(shù)據(jù)進(jìn)行檢查,比較安全
  • 缺點(diǎn):增加防火墻的負(fù)載

二、iptables的簡(jiǎn)介

(一)Netfilter組件

  • 內(nèi)核空間,集成在linux內(nèi)核中
  • 擴(kuò)展各種網(wǎng)絡(luò)服務(wù)的結(jié)構(gòu)化底層框架
  • 內(nèi)核中選取五個(gè)位置放了五個(gè)hook(勾子) function(INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING),而這五個(gè)hook function向用戶開(kāi)放,用戶可以通過(guò)一個(gè)命令工具(iptables)向其寫(xiě)入規(guī)則
  • 由信息過(guò)濾表(table)組成,包含控制IP包處理的規(guī)則集(rules),規(guī)則被分組放在鏈(chain)上
  • 三種報(bào)文流向:
    流入本機(jī):PREROUTING --> INPUT-->用戶空間進(jìn)程
    流出本機(jī):用戶空間進(jìn)程-->OUTPUT--> POSTROUTING
    轉(zhuǎn)發(fā):PREROUTING --> FORWARD --> POSTROUTING

(二)防火墻工具

  • iptables
    命令行工具,工作在用戶空間
    用來(lái)編寫(xiě)規(guī)則,寫(xiě)好的規(guī)則被送往netfilter,告訴內(nèi)核如何去處理信息包
  • firewalld
    CentOS 7引入了新的前端管理工具

(三)iptables的組成

  • 主要由四個(gè)表、五個(gè)鏈以及一些規(guī)則組成

  • 四個(gè)表(table): filter, nat, mangle, raw

    • filter: 過(guò)濾規(guī)則表,根據(jù)預(yù)定義的規(guī)則過(guò)濾符合條件的數(shù)據(jù)包
    • nat: network address translation 地址轉(zhuǎn)換規(guī)則表
    • mangle: 修改數(shù)據(jù)標(biāo)記位規(guī)則表
    • raw: 關(guān)閉NAT表上啟用的連接跟蹤機(jī)制,加快封包穿越防火墻速度
    • 優(yōu)先級(jí)由高到低的順序?yàn)? raw-->mangle-->nat-->filter
  • 五個(gè)內(nèi)置鏈chain

    • INPUT
    • OUTPUT
    • FORWARD
    • PREROUTING
    • POSTROUTING

(四)內(nèi)核中數(shù)據(jù)包的傳輸過(guò)程

  • 當(dāng)一個(gè)數(shù)據(jù)包進(jìn)入網(wǎng)卡時(shí),數(shù)據(jù)包首先進(jìn)入PREROUTING鏈,內(nèi)核根據(jù)數(shù)據(jù)包目的IP判斷是否需要轉(zhuǎn)送出去

  • 如果數(shù)據(jù)包就是進(jìn)入本機(jī)的,數(shù)據(jù)包就會(huì)經(jīng)過(guò)INPUT鏈供有關(guān)進(jìn)程接收。本機(jī)上運(yùn)行的程序可以發(fā)送數(shù)據(jù)包,這些數(shù)據(jù)包經(jīng)過(guò)OUTPUT鏈,然后到達(dá)POSTROUTING鏈輸出

  • 如果數(shù)據(jù)包是要轉(zhuǎn)發(fā)出去的,且內(nèi)核允許轉(zhuǎn)發(fā),數(shù)據(jù)包就會(huì)經(jīng)過(guò)FORWARD鏈,然后到達(dá)POSTROUTING鏈輸出

(五)iptables規(guī)則

  • 規(guī)則(rule):根據(jù)規(guī)則的匹配條件嘗試匹配報(bào)文,對(duì)匹配成功的報(bào)文根據(jù)規(guī)則定義的處理動(dòng)作作出處理

  • 匹配條件:默認(rèn)為與條件,同時(shí)滿足
    基本匹配:IP,端口,TCP的Flags(SYN, ACK等)
    擴(kuò)展匹配:通過(guò)復(fù)雜高級(jí)功能匹配

  • 處理動(dòng)作(target):
    內(nèi)建處理動(dòng)作:ACCEPT, DROP, REJECT, SNAT, DNAT, MASQUERADE, MARK, LOG...
    自定義處理動(dòng)作:自定義chain,利用分類管理復(fù)雜情形

  • 鏈(chain):
    內(nèi)置鏈:每個(gè)內(nèi)置鏈對(duì)應(yīng)于一個(gè)鉤子函數(shù)
    自定義鏈:用于對(duì)內(nèi)置鏈進(jìn)行擴(kuò)展或補(bǔ)充,可實(shí)現(xiàn)更靈活的規(guī)則組織管理機(jī)制
    只有Hook鉤子調(diào)用自定義鏈時(shí),才生效

(六)iptables添加要點(diǎn)

  • iptables規(guī)則添加時(shí)考量點(diǎn)
    要實(shí)現(xiàn)哪種功能:判斷添加在哪張表上
    報(bào)文流經(jīng)的路徑:判斷添加在哪個(gè)鏈上
    報(bào)文的流向:判斷源和目的
    匹配規(guī)則:業(yè)務(wù)需要

  • 鏈上規(guī)則的次序,即為檢查的次序,因此隱含一定的法則
    同類規(guī)則(訪問(wèn)同一應(yīng)用),匹配范圍小的放上面
    不同類規(guī)則(訪問(wèn)不同應(yīng)用),匹配到報(bào)文頻率較大的放上面
    可由一條規(guī)則描述的多個(gè)規(guī)則合并為一個(gè)
    設(shè)置默認(rèn)策略

三、iptables命令

  • 實(shí)驗(yàn)環(huán)境準(zhǔn)備
// CentOS 7關(guān)閉firewalld服務(wù)
systemctl stop firewalld
systemctl disable firewalld
// CentOS 6關(guān)閉系統(tǒng)默認(rèn)iptables策略
service iptables stop
chkconfig iptables off

(一)規(guī)則格式

iptables [-t table] SUBCOMMAND chain rule-specification
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
  • -t table:raw|mangle|nat|[filter]:指定表,filter表為默認(rèn)
  • chain:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

(二)SUBCOMMAND

(1)查看
  • 選項(xiàng):

    • -L:list, 列出指定鏈上的所有規(guī)則,本選項(xiàng)須置后
    • -n:numberic,以數(shù)字格式顯示地址和端口號(hào)
    • -v:verbose,詳細(xì)信息
    • -vv:更詳細(xì)
    • -x:exactly,顯示計(jì)數(shù)器結(jié)果的精確值,而非單位轉(zhuǎn)換后的易讀值
    • --line-numbers:顯示規(guī)則的序號(hào)
    • -S:selected,以iptables-save命令格式顯示鏈上規(guī)則
  • 常用組合:
    --vnL
    --vnxL --line-numbers

  • 查看當(dāng)前的策略

  • 查看當(dāng)前的策略,并詳細(xì)顯示了策略編號(hào)以及計(jì)數(shù)器的精確值
(2)規(guī)則管理
  • 選項(xiàng):

    • -A:append,追加
    • -I #:insert,插入,要指明插至的規(guī)則編號(hào),默認(rèn)為第一條
    • -D:delete,刪除,后接:
      指明規(guī)則序號(hào),或者
      指明規(guī)則本身
    • -R #:replace,替換指定鏈上的指定編號(hào)規(guī)則
    • -F:flush,清空指定的規(guī)則鏈
    • -Z:zero,置零
  • iptables的每條規(guī)則都有兩個(gè)計(jì)數(shù)器

    • 匹配到的報(bào)文的個(gè)數(shù)
    • 匹配到的所有報(bào)文的大小之和
  • 實(shí)驗(yàn):iptables規(guī)則管理

    // 添加策略:阻止來(lái)自192.168.136.130主機(jī)的訪問(wèn)
    iptables -A INPUT -s 192.168.136.130 -j REJECT
    // 插入策略:阻止來(lái)自192.168.25.0/24網(wǎng)段的訪問(wèn),并且此策略編號(hào)為1
    iptables -I INPUT 1 -s 192.168.25.0/24 -j REJECT
    // 替換策略:將策略2改為阻止來(lái)自192.168.136.129主機(jī)的訪問(wèn)
    iptables -R INPUT 2 -s 192.168.136.129 -j REJECT
    // 刪除策略:刪除策略1
    iptables -D INPUT 1
    // 清空策略,并將計(jì)數(shù)器歸零
    iptables -F
    iptables -Z
    
    • 添加策略
    • 插入策略
    • 替換策略
    • 刪除策略
    • 清空策略,并且計(jì)數(shù)器歸零

(三)匹配條件

  • 分類:
    基本:通用的,PARAMETERS
    擴(kuò)展:需加載模塊,MATCH EXTENTIONS
(1)基本匹配條件:無(wú)需加載模塊,由iptables/netfilter自行提供
  • 選項(xiàng):

    • -s, --source address[/mask][,...]:源IP地址或范圍
    • -d, --destination address[/mask][,...]:目標(biāo)IP地址或范圍
    • -p, --protocol protocol:指定協(xié)議
      protocol: tcp, udp, icmp, 參看:/etc/protocols
    • -i, --in-interface name:報(bào)文流入的接口;只能應(yīng)用于數(shù)據(jù)報(bào)文流入環(huán)節(jié),只應(yīng)用于INPUT, FORWARD, PREROUTING鏈
    • -o, --out-interface name:報(bào)文流出的接口;只能應(yīng)用于數(shù)據(jù)報(bào)文流出的環(huán)節(jié),只應(yīng)用于FORWARD, OUTPUT, POSTROUTING鏈
  • 實(shí)驗(yàn):阻止來(lái)自192.168.136.0/24網(wǎng)段主機(jī)的icmp連接

// 設(shè)置策略(IP: 192.168.136.230)
iptables -A INPUT -s 192.168.136.0/24 -p icmp -j REJECT
// 在其他主機(jī)測(cè)試(IP: 192.168.136.130)
ping -c 5 192.168.136.230
curl 192.168.136.230
(2) 擴(kuò)展匹配條件:需要加載擴(kuò)展模塊(/usr/lib64/xtables/*.so),方可生效
  • 查看幫助:man iptables-extensions (CentOS 7),man iptables (CentOS 6)
1)隱式擴(kuò)展:
  • 在使用-p選項(xiàng)指明了特定的協(xié)議時(shí),無(wú)需再用-m選項(xiàng)指明擴(kuò)展模塊的擴(kuò)展機(jī)制,不需要手動(dòng)加載擴(kuò)展模塊
  1. tcp協(xié)議的擴(kuò)展選項(xiàng)
    --source-port, --sport port[:port]
    匹配報(bào)文源端口,可為端口范圍
    --destination-port, --dport port[:port]
    匹配報(bào)文目標(biāo)端口,可為端口范圍
    --tcp-flags mask comp
    mask:需檢查的標(biāo)志位列表(例如SYN,ACK,FIN,RST),用","分隔
    comp:在mask列表中必須為1的標(biāo)志位列表,無(wú)指定則必須為0,用","分隔
  • 實(shí)驗(yàn):拒絕telnet和ssh服務(wù)的建立新連接,舊連接保持原狀
    分析:拒絕telnet和ssh服務(wù)可以封禁端口,只拒絕建立新連接即拒絕TCP狀態(tài)位中只有SYN=1的狀態(tài)
// 設(shè)置策略(IP: 192.168.136.230),以下兩條命令等價(jià)
iptables -A INPUT -p tcp --dport 22:23 --tcp-flags SYN,ACK,FIN,RST SYN -j REJECT
iptables -A INPUT -p tcp --dport 22:23 --syn -j REJECT
// 在其他主機(jī)測(cè)試(IP: 192.168.136.130)
ssh 192.168.136.230
telnet 192.168.136.230
  1. udp協(xié)議的擴(kuò)展選項(xiàng)
    --source-port, --sport port[:port]
    匹配報(bào)文的源端口,可以是端口范圍
    --destination-port, --dport port[:port]
    匹配報(bào)文的目標(biāo)端口,可以是端口范圍

  2. icmp協(xié)議的擴(kuò)展選項(xiàng)
    --icmp-type {type[/code]|typename}
    type/code
    0/0 echo-reply:icmp應(yīng)答
    8/0 echo-request:icmp請(qǐng)求

  • 實(shí)驗(yàn):阻止對(duì)本機(jī)的icmp請(qǐng)求
    iptables -A INPUT -p icmp --icmp-type 8 -j REJECT

設(shè)定策略前ping本機(jī)ip正常,設(shè)定策略后ping本機(jī)ip全部失敗

2)顯式擴(kuò)展:
  • 必須使用-m選項(xiàng)指明要調(diào)用的擴(kuò)展模塊的擴(kuò)展機(jī)制,需要手動(dòng)加載擴(kuò)展模塊
    [-m matchname[per-match-options]]
  1. multiport擴(kuò)展:以離散方式定義多端口匹配,最多指定15個(gè)端口
    --source-ports, --sports port[,port|,port:port]...
    指定多個(gè)源端口
    --destination-ports, --dports port[,port|,port:port]...
    指定多個(gè)目標(biāo)端口
    --ports port[,port|,port:port]...多個(gè)源或目標(biāo)端口
  • 實(shí)驗(yàn):阻止來(lái)自192.168.136.0/24網(wǎng)段主機(jī)在TCP的20-25, 80端口的訪問(wèn)請(qǐng)求
// 設(shè)置策略(IP: 192.168.136.230)
iptables -A INPUT -s 192.168.136.0/24 -p tcp -m multiport -dports 20:25,80 -j REJECT
// 在其他主機(jī)測(cè)試(IP: 192.168.136.130)
ftp 192.168.136.230
ssh 192.168.136.230
telnet 192.168.136.230
curl 192.168.136.230

設(shè)置策略前

設(shè)置策略后

  1. iprange擴(kuò)展:指明連續(xù)的(但一般不是整個(gè)網(wǎng)絡(luò))ip地址范圍
    --src-range from [-to] 源IP地址范圍
    --dst-range from [-to] 目標(biāo)IP地址范圍
  • 示例:阻止IP在192.168.136.129-192.168.136.229范圍內(nèi)的主機(jī)建立tcp連接
    iptables -A INPUT -p tcp -m iprange --src-range 192.168.136.129-192.168.136.229 -j REJECT
  1. mac擴(kuò)展:指明源MAC地址
    適用于:PREROUTING, FORWARD, INPUT chains
    --mac-source XX:XX:XX:XX:XX:XX
  • 示例:阻止來(lái)自MAC地址為00:50:56:3f:60:3c的主機(jī)建立icmp連接
    iptables -A INPUT -p icmp -m mac --mac-source 00:50:56:3f:60:3c -j REJECT
  1. string擴(kuò)展:對(duì)報(bào)文中的應(yīng)用層數(shù)據(jù)做字符串模式匹配檢測(cè)
    --algo {bm|kmp}:字符串匹配檢測(cè)算法
    bm:Boyer-Moore
    kmp:Knuth-Pratt-Morris
    --from offset:開(kāi)始偏移
    --to offset:結(jié)束偏移
    --string pattern:要檢測(cè)的字符串模式
    --hex-string pattern:要檢測(cè)字符串模式,16進(jìn)制格式
  • 實(shí)驗(yàn):阻斷http服務(wù)器返回報(bào)文中包含google字樣的連接
// 設(shè)置策略(IP: 192.168.136.230)
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT
// 在其他主機(jī)測(cè)試(IP: 192.168.136.130)
curl 192.168.136.230
curl 192.168.136.230/index2.html

前兩行為設(shè)置策略前,后兩行為設(shè)置策略后

  1. time擴(kuò)展:根據(jù)將報(bào)文到達(dá)的時(shí)間與指定的時(shí)間范圍進(jìn)行匹配
    --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:日期
    --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
    --timestart hh:mm[:ss]:時(shí)間
    --timestop hh:mm[:ss]
    --monthdays day[,day...]:每個(gè)月的幾號(hào)
    --weekdays day[,day...]:星期幾
    CentOS 7使用UTC時(shí)間,CentOS 6使用本地時(shí)區(qū)時(shí)間
  • 實(shí)驗(yàn):設(shè)置工作日指定時(shí)間段禁止http連接
// 當(dāng)前策略設(shè)置的時(shí)間段為UTC 01:00-10:00,當(dāng)前時(shí)間不在范圍中,故可以訪問(wèn)http服務(wù)
iptables -A INPUT -p tcp --dport 80 -m time --timestart 01:00 --timestop 10:00 ! --weekdays Sat,Sun -j REJECT
// 更新策略后,時(shí)間范圍改為UTC 01:00-14:00,當(dāng)前時(shí)間在范圍中,故訪問(wèn)被拒絕
iptables -R INPUT 1 -p tcp --dport 80 -m time --timestart 01:00 --timestop 14:00 ! --weekdays Sat,Sun -j REJECT
  1. connlimit擴(kuò)展:根據(jù)每客戶端IP做并發(fā)連接數(shù)數(shù)量匹配
    可防止CC(Challenge Collapsar挑戰(zhàn)黑洞)攻擊
    --connlimit-upto n:連接的數(shù)量小于等于n時(shí)匹配,與默認(rèn)的拒絕策略配合使用
    --connlimit-above n:連接的數(shù)量大于n時(shí)匹配,與默認(rèn)的允許策略配合使用
  • 示例:只允許來(lái)自192.168.136.130主機(jī)發(fā)起最多2個(gè)并發(fā)ssh連接
    iptables -A INPUT -s 192.168.136.130 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
  1. limit擴(kuò)展:基于收發(fā)報(bào)文的速率做匹配
    令牌桶過(guò)濾器
    --limit rate [/second|/minute|/hour|/day]:限速
    --limit-burst number:前多少個(gè)報(bào)文不做限速
  • 示例:對(duì)icmp發(fā)起的請(qǐng)求進(jìn)行限速,前5個(gè)請(qǐng)求不限速,之后的請(qǐng)求每10秒允許一個(gè)
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 6/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
  1. state擴(kuò)展:根據(jù)連接追蹤機(jī)制去檢查連接的狀態(tài),較耗資源
  • conntrack機(jī)制:追蹤本機(jī)上的請(qǐng)求和響應(yīng)之間的關(guān)系,狀態(tài)有如下幾種:

    • NEW:新發(fā)出請(qǐng)求;連接追蹤信息庫(kù)中不存在此連接的相關(guān)信息條目,因此,將其識(shí)別為第一次發(fā)出的請(qǐng)求
    • ESTABLISHED:NEW狀態(tài)之后,連接追蹤信息庫(kù)中為其建立的條目失效之前期間內(nèi)所進(jìn)行的通信狀態(tài)
    • RELATED:新發(fā)起的但與已有連接相關(guān)聯(lián)的連接,如:ftp協(xié)議中的數(shù)據(jù)連接與命令連接之間的關(guān)系
    • INVALID:無(wú)效的連接,如flag標(biāo)記不正確
    • UNTRACKED:未進(jìn)行追蹤的連接,如raw表中關(guān)閉追蹤
  • 查詢連接追蹤信息

    • 已經(jīng)追蹤到的并記錄下來(lái)的連接信息庫(kù)
      /proc/net/nf_conntrack
    • 調(diào)整連接追蹤功能所能夠容納的最大連接數(shù)量
      /proc/sys/net/nf_conntrack_max
    • 不同的協(xié)議的連接追蹤時(shí)長(zhǎng)
      /proc/sys/net/netfilter/
  • 實(shí)驗(yàn):開(kāi)放ftp服務(wù)的被動(dòng)模式
    分析:ftp服務(wù)的被動(dòng)模式端口不固定,一般指定端口的方法不適用,通過(guò)放行21端口的相關(guān)端口的方法設(shè)置相關(guān)策略

modprobe nf_conntrack_ftp      // 裝載ftp連接追蹤模塊
iptables -F
// 放行已經(jīng)建立的命令連接、數(shù)據(jù)連接以及新發(fā)起的數(shù)據(jù)連接
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
// 放行新發(fā)起的命令連接
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
// 阻止其他無(wú)關(guān)連接
iptables -A INPUT -j REJECT

(四)Target:處理動(dòng)作

  • 語(yǔ)法:-j targetname [per-target-options]

  • 簡(jiǎn)單:
    ACCEPT:放行
    DROP:丟棄

  • 擴(kuò)展:
    REJECT:拒絕
    RETURN:返回調(diào)用鏈
    REDIRECT:端口重定向
    LOG:記錄日志,dmesg
    MARK:做防火墻標(biāo)記
    DNAT:目標(biāo)地址轉(zhuǎn)換
    SNAT:源地址轉(zhuǎn)換
    MASQUERADE:地址偽裝

  • LOG:非中斷target,本身不拒絕和允許,放在拒絕和允許規(guī)則前并將日志記錄在/var/log/messages系統(tǒng)日志中
    --log-level level 級(jí)別:emerg, alert, crit, error, warning, notice, info or debug
    --log-prefix prefix 日志前綴,用于區(qū)別不同的日志,最多29個(gè)字符

  • 實(shí)驗(yàn):將新發(fā)起的ssh和http請(qǐng)求記錄在系統(tǒng)日志中,日志條目以"new connections: "作為前綴存儲(chǔ)
    iptables -A INPUT -p tcp -m multiport --dports 22,80 -m state --state NEW -j LOG --log-prefix "new connections: "

(五)鏈管理

  • 選項(xiàng):
    -N:new,自定義一條新的規(guī)則鏈
    -X:delete,刪除自定義的空規(guī)則鏈
    -P:Policy,設(shè)置默認(rèn)策略;對(duì)filter表中的鏈而言,其默認(rèn)策略有:
    ACCEPT:接受
    DROP:丟棄
    -E:重命名自定義鏈

  • 注意:
    引用計(jì)數(shù)不為0的自定義鏈不能夠被重命名,也不能被刪除
    不建議修改鏈默認(rèn)策略,可以設(shè)置策略兜底

  • 實(shí)驗(yàn):自定義鏈"deny_icmp_ssh",作用為拒絕icmp和ssh連接。關(guān)聯(lián)"deny_icmp_tcp"鏈至INPUT鏈,實(shí)現(xiàn)拒絕來(lái)自192.168.136.100-192.168.136.200范圍內(nèi)主機(jī)的icmp和ssh連接

// 新建自定義鏈
iptables -N deny_icmp_ssh
iptables -A deny_icmp_ssh -p icmp -j REJECT
iptables -A deny_icmp_ssh -p tcp --dport 22 -j REJECT
// 關(guān)聯(lián)自定義鏈至INPUT鏈
iptables -A INPUT -m iprange --src-range 192.168.136.100-192.168.136.200 -j deny_icmp_ssh
// 其他主機(jī)上測(cè)試
ping -c 5 192.168.136.230
ssh 192.168.136.230
// 清除自定義鏈
iptables -F deny_icmp_ssh     // 清除deny_icmp_ssh鏈的策略
iptables -F                   //清除INPUT關(guān)聯(lián)deny_icmp_ssh鏈的策略
iptables -X deny_icmp_ssh     //刪除策略為空的deny_icmp_ssh鏈

設(shè)置完畢的策略:自定義鏈下兩條策略,INPUT鏈的策略關(guān)聯(lián)了自定義鏈

在IP: 192.168.136.130主機(jī)測(cè)試ping和ssh登錄,均失敗

在IP: 192.168.136.229主機(jī)測(cè)試ping和ssh登錄,均成功

(六)iptables規(guī)則安排的基本原則

  • 任何不允許的訪問(wèn),應(yīng)該在請(qǐng)求到達(dá)時(shí)給予拒絕

  • 規(guī)則在鏈接上的次序即為其檢查時(shí)的生效次序

  • 基于上述,規(guī)則優(yōu)化

    1. 安全放行所有入站和出站的狀態(tài)為ESTABLISHED狀態(tài)連接
    2. 謹(jǐn)慎放行入站的新請(qǐng)求
    3. 有特殊目的限制訪問(wèn)功能,要在放行規(guī)則之前加以拒絕
    4. 同類規(guī)則(訪問(wèn)同一應(yīng)用),匹配范圍小的放在前面,用于特殊處理
    5. 不同類的規(guī)則(訪問(wèn)不同應(yīng)用),匹配范圍大的放在前面
    6. 應(yīng)該將那些可由一條規(guī)則能夠描述的多個(gè)規(guī)則合并為一條
    7. 設(shè)置默認(rèn)策略,建議白名單(只放行特定連接)
    8. 修改默認(rèn)策略時(shí)不建議iptables -P,建議在規(guī)則的最后定義規(guī)則做為默認(rèn)策略

(七)iptables規(guī)則的保存和生效

  • 規(guī)則有效期限:
    使用iptables命令定義的規(guī)則,手動(dòng)刪除之前,其生效期限為kernel存活期限

  • 保存規(guī)則至指定的文件:

    • CentOS 6環(huán)境
    // 將規(guī)則覆蓋保存至/etc/sysconfig/iptables文件中
    service iptables save
    // 自動(dòng)從/etc/sysconfig/iptables重新載入規(guī)則
    service iptables start
    
    • CentOS 7環(huán)境
    // 規(guī)則文件重定向至文件,以下兩條命令等效
    iptables -S > /PATH/TO/SOME_RULES_FILE
    iptables-save > /PATH/TO/SOME_RULES_FILE
    // 重新載入預(yù)存規(guī)則文件中的規(guī)則
    iptables-restore < /PATH/FROM/SOME_RULES_FILE
    
    • iptables-restore 選項(xiàng):
      -n, --noflush:不清除原有規(guī)則
      -t, --test:僅分析生成規(guī)則集,但不提交
  • 開(kāi)機(jī)自動(dòng)重載規(guī)則文件中的規(guī)則:

    • CentOS 6:設(shè)置iptables開(kāi)機(jī)啟動(dòng)
      chkconfig --list iptables

    • CentOS 7:在/etc/rc.d/rc.local文件添加規(guī)則恢復(fù)命令

    vim /etc/rc.d/rc.local
    iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
    chmod +x /etc/rc.d/rc.local
    

四、網(wǎng)絡(luò)防火墻

  • iptables/netfilter網(wǎng)絡(luò)防火墻:

    • 充當(dāng)網(wǎng)關(guān)
    • 使用filter表的FORWARD鏈
  • 注意的問(wèn)題:

    • 請(qǐng)求-響應(yīng)報(bào)文均會(huì)經(jīng)由FORWARD鏈,要注意規(guī)則的方向性
    • 如果要啟用conntrack機(jī)制,建議將雙方向的狀態(tài)為ESTABLISHED的報(bào)文直接放行
  • 允許內(nèi)網(wǎng)(192.168.136.0/24)的主機(jī)訪問(wèn)外網(wǎng)(172.18.0.0/16)的ftp, ssh服務(wù),但外網(wǎng)的主機(jī)不允許訪問(wèn)內(nèi)網(wǎng)主機(jī)的所有服務(wù)

    modprobe nf_conntrack_ftp
    iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -s 192.168.136.0/24 -p tcp --dport 21:22 -j ACCEPT
    iptables -A FORWARD -j REJECT 
    
    • 內(nèi)網(wǎng)訪問(wèn)外網(wǎng)的ftp, ssh服務(wù)均成功
    • 外網(wǎng)訪問(wèn)內(nèi)網(wǎng)的ftp, ssh服務(wù)均失敗

五、NAT

(一)NAT基本概念

  • NAT:network address translation
    鏈:PREROUTING,INPUT,OUTPUT,POSTROUTING
    請(qǐng)求報(bào)文:修改源/目標(biāo)IP,由定義如何修改
    響應(yīng)報(bào)文:修改源/目標(biāo)IP,根據(jù)跟蹤機(jī)制自動(dòng)實(shí)現(xiàn)

  • SNAT:source NAT
    鏈:POSTROUTING, INPUT
    讓本地網(wǎng)絡(luò)中的主機(jī)通過(guò)某一特定地址訪問(wèn)外部網(wǎng)絡(luò),實(shí)現(xiàn)地址偽裝
    請(qǐng)求報(bào)文:修改源IP

  • DNAT:destination NAT
    鏈:PREROUTING, OUTPUT
    把本地網(wǎng)絡(luò)中的主機(jī)上的某服務(wù)開(kāi)放給外部網(wǎng)絡(luò)訪問(wèn)(發(fā)布服務(wù)和端口映射),但隱藏真實(shí)IP
    請(qǐng)求報(bào)文:修改目標(biāo)IP

  • PNAT:port NAT,端口和IP都進(jìn)行修改,發(fā)生在多臺(tái)本地網(wǎng)絡(luò)主機(jī)的端口沖突時(shí)

(二)SNAT配置:通過(guò)net表的target配置

  • SNAT:固定IP
    --to-source [ipaddr[-ipaddr]][:port[-port]]

  • MASQUERADE:動(dòng)態(tài)IP,如撥號(hào)網(wǎng)絡(luò)

  • 實(shí)驗(yàn):通過(guò)SNAT實(shí)現(xiàn)本地網(wǎng)絡(luò)主機(jī)訪問(wèn)外網(wǎng),而不會(huì)暴露本地網(wǎng)絡(luò)主機(jī)IP

    • 當(dāng)外網(wǎng)IP為固定IP時(shí)
      iptables -t nat -A POSTROUTING -s 192.168.136.0/24 -j SNAT --to-source 172.18.251.164

    • 當(dāng)外網(wǎng)IP為動(dòng)態(tài)IP時(shí),
      iptables -t nat -A POSTROUTING -s 192.168.136.0/24 -j MASQUERADE

    • 測(cè)試:內(nèi)網(wǎng)主機(jī)訪問(wèn)外網(wǎng)服務(wù)器http服務(wù)
      curl 172.18.250.44
      外網(wǎng)服務(wù)器httpd服務(wù)日志顯示源地址為172.18.251.164,實(shí)現(xiàn)了SNAT功能

(三)DNAT配置:通過(guò)net表的target配置

  • 格式:DNAT --to-destination [ipaddr[-ipaddr]][:port[-port]]

  • 實(shí)驗(yàn):實(shí)現(xiàn)本地網(wǎng)絡(luò)主機(jī)通過(guò)外網(wǎng)的指定網(wǎng)址提供http服務(wù),具體如下:
    外網(wǎng)指定IP:172.18.251.164,內(nèi)網(wǎng)主機(jī)IP:192.168.136.230
    外網(wǎng)IP端口80指向內(nèi)網(wǎng)主機(jī)的80端口,外網(wǎng)IP端口8080指向內(nèi)網(wǎng)主機(jī)的8000端口

    iptables -t nat -A PREROUTING -d 172.18.251.164 -p tcp --dport 80 -j DNAT --to-destination 192.168.136.230:80
    iptables -t nat -A PREROUTING -d 172.18.251.164 -p tcp --dport 8080 -j DNAT --to-destination 192.168.136.230:8000
    
    • 外網(wǎng)主機(jī)通過(guò)指定外網(wǎng)IP的不同端口成功訪問(wèn)內(nèi)網(wǎng)主機(jī)不同端口提供的http服務(wù)
    • 內(nèi)網(wǎng)主機(jī)的訪問(wèn)日志,可以看到外網(wǎng)主機(jī)IP

(四)轉(zhuǎn)發(fā):通過(guò)改變目標(biāo)IP和端口,將接受的包轉(zhuǎn)發(fā)至不同地址

  • 格式:REDIRECT --to-ports port[-port]

  • 作用于NAT表,可用于:PREROUTING, OUTPUT, 自定義鏈

  • 實(shí)驗(yàn):實(shí)現(xiàn)將對(duì)主機(jī)1314,9527端口的訪問(wèn)轉(zhuǎn)發(fā)至主機(jī)的80端口
    iptables -t nat -A PREROUTING -d 192.168.136.230 -p tcp -m multiport --dports 1314,9527 -j REDIRECT --to-ports 8000

六、firewalld服務(wù)

(一)基本概念

(1)簡(jiǎn)介
  • firewalld是CentOS 7.0新推出的管理netfilter的工具
  • firewalld是配置和監(jiān)控防火墻規(guī)則的系統(tǒng)守護(hù)進(jìn)程,可以實(shí)現(xiàn)iptables,ip6tables,ebtables的功能
  • firewalld服務(wù)由firewalld包提供
(2)zone:區(qū)域
  • firewalld支持劃分區(qū)域zone,每個(gè)zone可以設(shè)置獨(dú)立的防火墻規(guī)則
  • 歸入zone順序:
    • 先根據(jù)數(shù)據(jù)包中源地址,將其納為某個(gè)zone
    • 納為網(wǎng)絡(luò)接口所屬zone
    • 納入默認(rèn)zone,默認(rèn)為public zone,管理員可以改為其它zone
  • 網(wǎng)卡默認(rèn)屬于public zone,lo網(wǎng)絡(luò)接口屬于trusted zone
  • firewalld zone分類
zone名稱 默認(rèn)配置
trusted 允許所有流量
home 拒絕除和傳出流量相關(guān)的,以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client預(yù)定義服務(wù)之外其它所有傳入流量
internal 和home相同
work 拒絕除和傳出流量相關(guān)的,以及ssh,ipp-client,dhcpv6-client預(yù)定義服務(wù)之外的其它所有傳入流量
public 拒絕除和傳出流量相關(guān)的,以及ssh,dhcpv6-client預(yù)定義服務(wù)之外的其它所有傳入流量,新加的網(wǎng)卡默認(rèn)屬于publiczone
external 拒絕除和傳出流量相關(guān)的,以及ssh預(yù)定義服務(wù)之外的其它所有傳入流量,屬于external zone的傳出ipv4流量的源地址將被偽裝為傳出網(wǎng)卡的地址。
dmz 拒絕除和傳出流量相關(guān)的,以及ssh預(yù)定義服務(wù)之外的其它所有傳入流量
block 拒絕除和傳出流量相關(guān)的所有傳入流量
drop 拒絕除和傳出流量相關(guān)的所有傳入流量(甚至不以ICMP錯(cuò)誤進(jìn)行回應(yīng))

(二)firewalld配置

  • firewall-cmd --get-services 查看預(yù)定義服務(wù)列表
  • /usr/lib/firewalld/services/*.xml預(yù)定義服務(wù)的配置
(1)三種配置方法
  • firewall-config:圖形工具(firewall-config包)
  • firewall-cmd:命令行工具(firewalld包)
  • /etc/firewalld:配置文件,一般不建議
(2)firewall-cmd 命令選項(xiàng)
  • --get-zones
    列出所有可用區(qū)域
  • --get-default-zone
    查詢默認(rèn)區(qū)域
  • --set-default-zone=<ZONE>
    設(shè)置默認(rèn)區(qū)域
  • --get-active-zones
    列出當(dāng)前正使用的區(qū)域
  • --add-source=<CIDR> [--zone=<ZONE>]
    添加源地址的流量到指定區(qū)域,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域
  • --remove-source=<CIDR> [--zone=<ZONE>]
    從指定區(qū)域中刪除源地址的流量,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域
  • --add-interface=<INTERFACE> [--zone=<ZONE>]
    添加來(lái)自于指定接口的流量到特定區(qū)域,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域
  • --change-interface=<INTERFACE> [--zone=<ZONE>]
    改變指定接口至新的區(qū)域,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域
  • --list-all [--zone=<ZONE>]
    列出指定區(qū)域的所有配置信息,包括接口、源地址、端口、服務(wù)等,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域
  • --add-service=<SERVICE> [--zone=<ZONE>]
    允許服務(wù)的流量通過(guò),如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域
  • --add-port=<PORT/PROTOCOL> [--zone=<ZONE>]
    允許指定端口和協(xié)議的流量,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域
  • --remove-service=<SERVICE> [--zone=<ZONE>]
    從區(qū)域中刪除指定服務(wù),禁止該服務(wù)流量,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域
  • --remove-port=<PORT/PROTOCOL> [--zone=<ZONE>]
    從區(qū)域中刪除指定端口和協(xié)議,禁止該端口的流量,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域
  • --reload
    刪除當(dāng)前運(yùn)行時(shí)配置,應(yīng)用加載永久配置
  • 示例:
// 查看默認(rèn)zone
firewall-cmd --get-default-zone
// 默認(rèn)zone設(shè)為dmz
firewall-cmd --set-default-zone=dmz
// 在internalzone中增加源地址192.168.0.0/24的永久規(guī)則
firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
// 在internalzone中增加協(xié)議mysql的永久規(guī)則
firewall-cmd --permanent --zone=internal --add-service=mysql
// 加載新規(guī)則以生效
firewall-cmd --reload

(三)rich規(guī)則

  • 當(dāng)基本firewalld語(yǔ)法規(guī)則不能滿足要求時(shí),可以使用以下更復(fù)雜的規(guī)則
    • rich-rules:富規(guī)則,功能強(qiáng),表達(dá)性語(yǔ)言
    • direct configuration rules:直接規(guī)則,靈活性差
      幫助:man 5 firewalld.direct
(1)rich規(guī)則簡(jiǎn)介
  • rich規(guī)則比基本的firewalld語(yǔ)法實(shí)現(xiàn)更強(qiáng)的功能,不僅實(shí)現(xiàn)允許/拒絕,還可以實(shí)現(xiàn)日志syslog和auditd,也可以實(shí)現(xiàn)端口轉(zhuǎn)發(fā),偽裝和限制速率
  • rich語(yǔ)法:
rule
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
  • man 5 firewalld.richlanguage
(2)rich規(guī)則生效順序
  • 該區(qū)域的端口轉(zhuǎn)發(fā),偽造規(guī)則
  • 該區(qū)域的日志規(guī)則
  • 該區(qū)域的允許規(guī)則
  • 該區(qū)域的拒絕規(guī)則
  • 每個(gè)匹配的規(guī)則生效,所有規(guī)則都不匹配,該區(qū)域默認(rèn)規(guī)則生效
(3)rich規(guī)則選項(xiàng)
  • --add-rich-rule='<RULE>'
    添加rich規(guī)則至指定zone,若未指明zone則為默認(rèn)zone
  • --remove-rich-rule='<RULE>'
    從指定zone刪除rich規(guī)則,若未指明zone則為默認(rèn)zone
  • --query-rich-rule='<RULE>'
    查詢指定zone中是否有RULE規(guī)則,若未指定zone則為默認(rèn)zone
    返回值0代表存在,返回值1代表不存在
  • --list-rich-rules
    列出指定zone的所有rich規(guī)則,若未指定zone則為默認(rèn)zone
  • 示例:
// 拒絕從192.168.0.11的所有流量,當(dāng)address選項(xiàng)使用source或destination時(shí),必須用family=ipv4|ipv6.
firewall-cmd --zone=classroom --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'
// 限制每分鐘只有兩個(gè)連接到ftp服務(wù)
firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'
// 拋棄esp(IPsec 體系中的一種主要協(xié)議)協(xié)議的所有數(shù)據(jù)包
firewall-cmd --add-rich-rule='rule protocol value=esp drop'
// 接受所有192.168.1.0/24子網(wǎng)端口范圍7900-7905的TCP流量
firewall-cmd --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'
(4)rich日志規(guī)則
  • log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]

    • <LOGLEVEL>
      可以是emerg, alert, crit, error, warning, notice, info, debug
    • <DURATION>
      s:秒,m:分鐘,h:小時(shí),d:天
  • audit [limit value="<RATE/DURATION>"]

  • 示例:
    接受ssh新連接,記錄日志到syslog的notice級(jí)別,每分鐘最多三條信息
    firewall-cmd --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh" level="notice" limit value="3/m" accept

(5)偽造和端口轉(zhuǎn)發(fā)
  • NAT網(wǎng)絡(luò)地址轉(zhuǎn)換,firewalld支持偽造和端口轉(zhuǎn)發(fā)兩種NAT方式

  • 偽造NAT

    • 格式:firewall-cmd --zone=<ZONE> --add-masquerade
    • 示例:將來(lái)自192.168.0.0/24網(wǎng)段的IP偽造為外網(wǎng)動(dòng)態(tài)IP
      firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'
  • 端口轉(zhuǎn)發(fā):將發(fā)往本機(jī)的特定端口的流量轉(zhuǎn)發(fā)到本機(jī)或不同機(jī)器的另一個(gè)端口。通常要配合地址偽造才能實(shí)現(xiàn)

    • 格式:firewall-cmd --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>]
      說(shuō)明:toport=和toaddr=至少要指定一個(gè)
    • 示例:
      轉(zhuǎn)發(fā)傳入的連接513/TCP,到訪火墻的132/TCP到public zone 的192.168.0.254
      firewall-cmd --zone=public --add-forward-port=port=513:proto=tcp:toport=132:toaddr= 192.168.0.254
  • rich規(guī)則語(yǔ)法:

    • 格式:forward-port port=<PORTNUM> protocol=tcp|udp [to-port=<PORTNUM>] [to-addr=<ADDRESS>]
    • 示例:
      轉(zhuǎn)發(fā)從192.168.0.0/26來(lái)的,發(fā)往80/TCP的流量到防火墻的端口8080/TCP
      firewall-cmd --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.0.0/26 forward-port port=80 protocol=tcp to-port=8080'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容