Linux高級篇--Linux防火牆


本章概要

    防火牆的概念
    iptables的基本認識
    iptables的組成
    iptables的基本語法
    iptables之地址轉換法則
    SNAT源地址轉換的具體實現
    DNAT目標地址轉換的具體實現
    firewalld介紹
    firewalld配置命令
    rich規則

1、防火牆的概念

安全技術

    入侵檢測與管理系統(Intrusion Detection Systems):特點是不阻斷任何網絡訪問,量化、定位來自內外網絡的威脅情況,主要以提供報告和事后監督為主,提供有針對性的指導措施和安全決策依據。一般采用旁路部署方式
    入侵防御系統(Intrusion Prevention System):以透明模式工作,分析數據包的內容如:溢出攻擊、拒絕服務攻擊、木馬、蠕蟲、系統漏洞等進行准確的分析判斷,在判定為攻擊行為后立即予以阻斷,主動而有效的保護網絡的安全,一般采用在線部署方式
    防火牆(FireWall):隔離功能,工作在網絡或主機邊緣,對進出網絡或主機的數據包基於一定的規則檢查,並在匹配某規則時由規則定義的行為進行處理的一組功能的組件,基本上的實現都是默認情況下關閉所有的通過型訪問,只開放允許訪問的策略

知識擴展:

針對AMP模式下,防火牆如何設置: 
AMP模式:
客戶端-->apache服務器-->FPM服務器(fastcgi)-->數據庫服務器
防火牆設置規則:
    apache服務器為互聯網提供服務,針對客戶端設置黑名單
    FPM服務器只允許apache服務器把動態資源請求發送給自己,此時apache服務器相對於FPM服務器相當於客戶端,針對apache服務器設置白名單,僅允許apache服務器訪問,不允許其他服務器訪問
    FPM服務器運行時需要訪問數據庫服務器,此時FPM服務器相對於數據庫服務器相當於客戶端針對FPM服務器設置白名單,僅允許FPM服務器訪問,不允許其他服務器訪問
    
服務器面向的對象是明確的,既定的,需要使用白名單;如果面向互聯網,需要使用黑名單

使用場景:  
針對遠端托管服務器或公有雲的服務器
    設置堡壘機或跳板機在內網中,管理員可通過堡壘機直接連接至內網,直接訪問內網服務器,因此對堡壘機上的SSH連接做白名單機制

針對實際中的環境:
    本地局域網開發環境
    遠程托管機房生產環境和測試環境


防火牆的分類

    防火牆的分類
    分類1:
      主機防火牆:服務范圍為當前主機
      網絡防火牆:服務范圍為防火牆一側的局域網
    分類2:
      硬件防火牆:在專用硬件級別實現部分功能的防火牆;另一個部分功能基於軟件實現,Checkpoint,NetScreen
      軟件防火牆:運行於通用硬件平台之上的防火牆的應用軟件
    分類3:
      網絡層防火牆:OSI模型下四層
      應用層防火牆/代理服務器:代理網關,OSI模型七層

    網絡層防火牆
      包過濾防火牆
      網絡層對數據包進行選擇,選擇的依據是系統內設置的過濾邏輯,被稱為訪問控制列表(ACL),通過檢查數據流中每個數據的源地址,目的地址,所用端口號和協議狀態等因素,或他們的組合來確定是否允許該數據包通過
      優點:對用戶來說透明,處理速度快且易於維護
      缺點:無法檢查應用層數據,如病毒等

    應用層防火牆/代理服務型防火牆(Proxy Service)
      將所有跨越防火牆的網絡通信鏈路分為兩段
      內外網用戶的訪問都是通過代理服務器上的“鏈接”來實現
      優點:在應用層對數據進行檢查,比較安全
      缺點:增加防火牆的負載

    現實生產環境中所使用的防火牆一般都是二者結合體
      即先檢查網絡數據,通過之后再送到應用層去檢查

2、iptables的基本知識

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,告訴內核如何去處理信息包
    firewalld
      CentOS7 引入了新的前端管理工具
      管理工具:
        firewall-cmd命令行
        firewall-config圖形

知識延伸:

報文轉發過程:
以TCP/IP協議為例,主要為以下基層
    應用層、傳輸層、網絡層、鏈路層
    
源主機hostA與目標主機hostB通信
應用層 封裝應用層首部信息
傳輸層 封裝傳輸層首部信息,主要信息是源端口,目標端口
網絡層 封裝網絡層包首部信息,主要信息是源ip地址,目的ip地址
鏈路層 封裝鏈路層幀首部信息,主要信息是MAC地址信息

HostA與hostB通信,首先在應用對數據進行封裝並添加請求報文首部,然后在經過傳輸層封裝源端口、目標端口,網絡層封裝源ip地址、目標ip地址,鏈路層封裝源MAC、目標MAC地址
HostA把數據發送給本機的網關RTA,網關設備RTA接收報文發現目標MAC地址是自己的MAC地址,解封裝鏈路層首部信息查看目標ip地址,發現目標ip不是自己,於是根據路由表查找下一跳轉發該報文,重新封裝報文信息,把鏈路層首部信息中源MAC地址換為自己的MAC地址,目標MAC地址換為路由表中下一跳設備的MAC地址。其中報文中的網絡層源ip地址、目標ip地址不變
同理,最后到達HostB主機(目標主機),解封裝鏈路層首部信息,查看ip地址發現目標ip地址是自己的地址,查看傳輸層首部信息中的端口號,根據端口號找到運行的對應進程和應用程序(協議),解除傳輸層首部信息,獲取應用層首部請求報文。
注意:TCP/IP協議下三層在內核空間進行,應用層在用戶空間進行

在報文傳輸過程中,報文有三種流向:自己發出的報文,接收別人傳過來的報文,轉發接收到的不是自己的報文
轉發報文不會到達用戶文件,這是因為轉發報文在網絡層發現目標ip不是自己就會轉發出去,並不會轉發到用戶空間
自己發出的報文需要應用層封裝,接收別人的報文需要到達應用層解封裝,因此都會涉及到用戶空間
這說明了iptables防火牆中的FORWARD轉發和導入INPUT、導出OUTPUT在做策略時並不相關,相互獨立

如果是轉發報文,該報文不會到達用戶空間
這是因為報文在到達網絡層發現目標ip地址不是自己就會被重新封裝轉發出去
如果是源主機發送報文或目標主機接收報文,報文會從用戶空間發送或到達用戶空間接收報文
這是因為,發送報文時用戶空間的應用程序發出,需要封裝應用層首部;而目標主機解封報文發現目標ip是自己則會解除傳輸層封裝獲取端口號,並根據端口號查找進程,如果找到該進程就會把報文中的數據發送到用戶空間的應用程序
由此得出,iptables根據路由表把數據流轉發FORWARD鏈和設備本機的數據流導入INPUT、導出OUTPUT鏈做策略時兩個並不相關,相互獨立 

 

3、iptables的組成

    iptables由五個表和五個鏈以及一些規則組成
    五個表table:filter、nat、mangle、raw、security
      filter表:過濾規則表,根據預定義的規則過濾符合條件的數據包
      nat表:network address translation 地址轉換規則表
      mangle:修改數據標記位規則表
      raw:關閉NAT表上啟用的連接跟蹤機制,加快封包穿越防火牆速度
      security:用於強制訪問控制(MAC)網絡規則,由Linux安全模塊(如SELinux)實現
      優先級由高到低的順序為:security -->raw–>mangle–>nat–>filter
    五個內置鏈chain
      PREROUTING:路由前,剛進入本機還沒進去INPUT,還未檢查路由表進行轉發的
      INPUT:到本機內部來的
      FORWARD:由本機轉發
      OUTPUT:由本機內部來的(出去的)
      POSTROUTING:路由后,由本機發出來要離開本機的

Netfilter表和鏈對應關系

    對應關系如下:
    filter表:INPUT,FORWARD,OUTPUT
    nat表:PREROUTING,INPUT,OUTPUT,POSTROUTING
    mangle表:PREROUTING,INPUT,FORWARD,OUPUT,POSTROUTING
    raw表:PREROUTING,OUTPUT

數據包過濾匹配流程

iptables和路由

    路由功能發生的時間點
      報文進入本機后
        判斷目標主機是否為本機
          是:INPUT
          否:FORWARD
      報文離開本機之前
        判斷由哪個接口送往下一跳

內核中數據包的傳輸過程

    內核中數據包的傳輸過程
      當一個數據包進入網卡時,數據包首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去
      如果數據包就是進入本機的,數據包就會沿着圖向下移動,到達INPUT鏈。數據包到達INPUT鏈后,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包經過OUTPUT鏈,然后到達POSTROUTING鏈輸出
      如果數據包是要轉發出去的,且內核允許轉發,數據包就會向右移動,經過FORWARD鏈,然后到達POSTROUTING鏈輸出

iptables規則

    規則rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動作作出處理
      匹配條件:默認為與條件,同時滿足
        基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
        擴展匹配:通過復雜高級功能匹配
      處理動作:稱為target,跳轉目標
        內建處理動作:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG…
          ACCEPT:通過
          DROP:丟棄請求報文,不回復結果;連接斷開需要一定的時間,浪費資源
          REJECT:不讓別人訪問,直接回復結果;快速失敗,連接直接斷開
        自定義處理動作:自定義chain,利用分類管理復雜情形
    規則要添加在鏈上,才生效;添加在自定義上不會自動生效
    鏈chain:
      內置鏈:每個內置鏈對應於一個鈎子函數
      自定義鏈:用於對內置鏈進行擴展或補充,可實現更靈活的規則組織管理機制;只有Hook鈎子調用自定義鏈時,才生效

iptables添加要點

    iptables規則添加時考量點
      要實現哪種功能:判斷添加在哪張表上
      報文流經的路徑:判斷添加在哪個鏈上
      報文的流向:判斷源和目的
      匹配規則:業務需要
    實驗環境准備:
      Centos7:systemctl stop firewalld.service
        systemctl disable firewalld.service
      Centos6:service iptables stop
        chkconfig iptables off

知識延伸:

其他主機訪問本機某服務的請求,報文方向:請求報文先進入本機,本機在發送響應報文,如果要拒絕該請求:
INPUT方向拒絕最合理
OUTPUT方向拒絕,請求會在計算機內核經過處理后才會被拒絕,這樣會消耗大量的計算機資源
本機客戶端訪問其他主機,報文方向:本機先發送請求報文,再接收其他主機的響應報文,如果要拒絕此類請求報文:
則OUTPUT方向拒絕最合理。
因此,在指定規則時要在請求階段設置,需要根據報文流向來設置
對於轉發的報文,同樣有兩個方向:一去一回
但對於filer表過濾功能來說,不支持PREROUTING鏈和POSTROUTING鏈,因此針對轉發報文的規則,只能在FOREWARD鏈上設置

    1
    2
    3
    4
    5
    6
    7
    8

4、iptables的基本語法

iptables命令

    查看幫助:man 8 iptables

    語法:
    iptables [-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
    rule-specification = [matches…] [target]
    match = -m matchname [per-match-options]
    target = -j targetname [per-target-options]

    Filter表中INPUT規則

    規則格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
    -t table:
      raw, mangle, nat, [filter]默認
    SUBCOMMAND:
      1、鏈管理:
        -N:new, 自定義一條新的規則鏈
        -X:delete,刪除自定義的空的規則鏈
        -P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:
          ACCEPT:接受
          DROP:丟棄
        -E:重命名自定義鏈;引用計數不為0的自定義鏈不能夠被重命名,也不能被刪除
      2、查看:
        -L:list, 列出指定鏈上的所有規則,本選項須置后
        -n:numberic,以數字格式顯示地址和端口號
        -v:verbose,詳細信息
        -vv 更詳細
        -x:exactly,顯示計數器結果的精確值,而非單位轉換后的易讀值
        --line-numbers:顯示規則的序號
        常用組合:
          -vnL
          -vvnxL–line-numbers
        -S selected,以iptables-save 命令格式顯示鏈上規則
      3、規則管理:
        -A:append,追加
        -I:insert, 插入,要指明插入至的規則編號,默認為第一條
        -D:delete,刪除
          (1) 指明規則序號
          (2) 指明規則本身
        -R:replace,替換指定鏈上的指定規則編號
        -F:flush,清空指定的規則鏈
        -Z:zero,置零
          iptables的每條規則都有兩個計數器
            (1) 匹配到的報文的個數
            (2) 匹配到的所有報文的大小之和

    chain:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

    匹配條件
    基本:通用的,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, mh or “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選項指明擴展模塊的擴展機制,不需要手動加載擴展模塊
        -p tcp:隱含了-m tcp;
          [!] --source-port, --sport port[:port]:匹配報文源端口,可為端口范圍
          [!] --destination-port,–dportport[:port]:匹配報文目標端口,可為范圍
          [!] --tcp-flags mask comp
            mask 需檢查的標志位列表,用,分隔
              例如SYN,ACK,FIN,RST
            comp 在mask列表中必須為1的標志位列表,無指定則必須為0,用,分隔
    示例:

--tcp-flags SYN,ACK,FIN,RST SYN 表示要檢查的標志位為SYN,ACK,FIN,RST四個,其中SYN必須為1,余下的必須為0
--tcp-flags SYN,ACK,FIN,RST SYN,ACK
--tcp-flags ALL ALL
--tcp_flagsALL NONE

    1
    2
    3
    4

[!] --syn:用於匹配第一次握手
        相當於:–tcp-flags SYN,ACK,FIN,RST SYN
    -p udp:隱含了-m udp;
      [!] --source-port, --sport port[:port]:匹配報文的源端口或端口范圍
      [!] --destination-port,–dportport[:port]:匹配報文的目標端口或端口范圍
    -p icmp:隱含了-m icmp;
      [!] --icmp-type {type[/code]|typename}
        type/code
          0/0 echo-replyicmp應答
          8/0 echo-request icmp請求
隱式擴展示例:

允許192.168.32.0網段訪問本機網絡的445、139、138、137端口
iptables -t filter -A INPUT -s 192.168.32.0/24 -p tcp -m tcp --dport 445 -j ACCEPT
iptables -t filter -A INPUT -s 192.168.32.0/24 -p tcp -m tcp --dport 139 -j ACCEPT
iptables -t filter -A INPUT -s 192.168.32.0/24 -p udp -m udp --dport 137 -j ACCEPT
iptables -t filter -A INPUT -s 192.168.32.0/24 -p udp -m udp --dport 138 -j ACCEPT

    1
    2
    3
    4
    5

(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:地址偽裝
      …
      自定義鏈:

iptables規則"顯示擴展"詳解

    顯式擴展:必須顯式地指明使用的擴展模塊進行的擴展
      同一種服務,不同檢查條件的規則,把條件苛刻的放在上面
      不同的服務,哪種服務訪問量大,哪個放上面,如:80和22端口,一般情況下80端口訪問量比22端口要大,因此基於80端口的服務放在上面
    使用幫助:
      CentOS 6: man iptables
      CentOS 7: man iptables-extensions
    1、multiport擴展
    檢查條件一樣時,支持多個離散或連續的端口用一條規則實現,最多支持15個端口
    [!] --source-ports,–sports port[,port|,port:port]… 指定多個源端口
    [!] --destination-ports,–dports port[,port|,port:port]… 指定多個目標端口
    [!] --ports port[,port|,port:port]… 指定多個源或目標端口
    示例:

添加對本機的多端口設置
iptables -I INPUT -d 192.168.32.129 -i ens33 -p tcp -m multiport --dports 21:22,80,443,139,445
iptables -I OUTPUT -s 192.168.32.129 -o ens33 -p tcp -m multiport --sports 21,22,80,443,139,445 

    1
    2
    3

    2、iprange擴展
    指明連續的(但一般不是整個網絡)ip地址范圍
    注意:指定的ip地址不是一個網絡,也不是單個地址,而是指定某網絡的某段網址
    [!] --src-range from[-to]源IP地址范圍
    [!] --dst-range from[-to]目標IP地址范圍
    示例:

允許192.168.32.0網段中192.168.32.191-192.168.32.200范圍內的ip地址訪問本機的23端口 
iptables -I INPUT 2 -d 192.168.32.0/24 -i ens33 -p tcp --dport 23 -m iprange --src-range 192.168.32.191-192.168.32.200 -j ACCEPT
iptables -I OUTPUT 2 -s 192.168.32.0/24 -o ens33 -p tcp --sport 23 -m iprange --dst-range 192.168.32.191-192.168.32.200

    1
    2
    3

    3、ipset 離散地址集合
    依賴於ipset命令行工具
      man iptables-extensions
    先自定義地址集合,在設置規則時,匹配到該集合
      hash:ip 是指單個ip;ip模式只能寫單個ip地址
      hash:net 是指多個ip地址;net模式既可以寫單個ip地址也可以寫多個ip地址
    示例:

定義地址集合
    ipset create mysqlsrc hash:net maxelem 1000
在地址集合添加地址
    ipset add mysqlsrc 192.168.32.130
    ipset add mysqlsrc 192.168.32.131
    match-set  使用該模塊調用地址集合
允許地址集合中的離散ip地址訪問本機的3306端口
    iptables -I INPUT 3 -d 192.168.32.129 -i ens33 -p tcp --dport 3306 -m set --match-set mysqlsrc src -j ACCEPT
    iptables -I OUTPUT 3 -s 192.168.32.129 -o ens33 -p tcp --sport 3306 -m set --match-set mysqlsrc dst -j ACCEPT

    1
    2
    3
    4
    5
    6
    7
    8
    9

    4、string擴展
    對報文中的應用層數據做字符串模式匹配檢測
    允許訪問某服務,在訪問該服務時對用戶發送的報文進行字符串檢測,不允許敏感數據的上傳或下載
    –algo{bm|kmp} 字符串匹配檢測算法
      bm:Boyer-Moore
      kmp:Knuth-Pratt-Morris
    –from offset 開始偏移
    –to offset 結束偏移
    [!] --string pattern要檢測的字符串模式
    [!] --hex-string pattern要檢測字符串模式,16進制格式
    示例:

過濾訪問本機web服務中包含1024的報文,拒絕其訪問
    iptables -I OUTPUT -m string --string "1024" --algo bm -j REJECT
    echo this is 1024 > /var/www/html/test.html
在其他主機測試:
    curl http://192.168.32.129/test.html
注意:該模塊的控制在出的方向(OUTPUT)進行控制,因為需要對內容進行檢測后才能進行控制

    1
    2
    3
    4
    5
    6

    5、time擴展
    根據報文到達時間與指定時間范圍進行匹配度檢測
    要注意時區問題
    語法格式:
    –datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]即年月日時分秒 表示開始日期時間
    –datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]即年月日時分秒 表示結束日期時間
    –timestart hh:mm[:ss]即時分秒 表示開始時間
    –timestop hh:mm[:ss]即時分秒 表示結束時間
    如果不指定日期,只指定時間,表示每一天在該時間段受控制
    –weekdays 每周的周幾受控
    –monthdays 每月的幾號受控
    注意:一般情況下,這兩者不同時使用
    –kerneltz 使用內核中配置的時區,因此只需使用此選項,並把時區設置為本地時區即可
    示例:

iptables -I INPUT -d 192.168.32.129 -p tcp --dport 80 -m time --timestart 14:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri -j REJECT
注意:此時定義的時間所在的時區為UTC
[root@centos7 ~]# iptables -vnL
Chain INPUT (policy DROP 11 packets, 2234 bytes)
 pkts bytes target   prot opt in   out   source       destination         
    0     0 REJECT   tcp  --  *     *   0.0.0.0/0    192.168.32.129    tcp dpt:80 TIME from 14:00:00 to 18:00:00 on Mon,Tue,Wed,Thu,Fri UTC reject-with icmp-port-unreachabl

    1
    2
    3
    4
    5
    6

    6、connlimit擴展
    單ip的並發連接數限制
    如果最大限制數為5,來了10個並發請求,並不會全部拒絕,而是放行5個請求,拒絕5個請求
    –connlimit-upto n:連接數數量小於等於n,此時應該允許;默認規則為拒絕時使用
    –connlimit-above n:連接數數量大於n,此時應該拒絕;默認規則為允許時使用
    通常分別與默認的拒絕或允許策略配合使用
    示例:

訪問本機的22端口的連接大於2個就拒絕
iptables -I  INPUT 2 -d 192.168.32.129 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
注意:測試時會話窗口不能使用復制窗口,要新建會話窗口才能生效

    1
    2
    3

    7、limit擴展
    速率限制,每秒單位時間內記錄多少個報文
    –limit rate[/second|/minute|/hour|/day]:平均速率
    –limit-burst number:峰值速率
    令牌桶算法:令牌桶,即存放令牌的容器
    峰值:即把空閑的令牌集中起來,等到並發訪問較高時,全部發出集中的多個令牌,但需要限制可存放令牌的數量,多余的令牌會被直接扔掉,防止容器被全部占用
    入站類型為8,即echo-request,該命令要加在其他icmp規則之前
    示例:

允許入站訪問,限制每秒接收2個報文,峰值速率為20  
iptables -I INPUT 5 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 20 -j ACCEPT
注意:要刪除之前編寫的默認規則,該規則才能生效
測試命令:hping3  以指定速度發送ping請求,
-i 支持微秒級
--fast 每秒10個請求
-1 工作在icmp模式下
hping3 -1 --fast 192.168.32.129

    1
    2
    3
    4
    5
    6
    7
    8

    8、state擴展
      根據”連接追蹤機制“去檢查連接的狀態,較耗資源
    conntrack機制:追蹤本機上的請求和響應之間的關系
    狀態有如下幾種:
      NEW:新發出請求;連接追蹤信息庫中不存在此連接的相關信息條目,因此,將其識別為第一次發出的請求
      ESTABLISHED:NEW狀態之后,連接追蹤信息庫中為其建立的條目失效之前期間內所進行的通信狀態
      RELATED:新發起的但與已有連接相關聯的連接,如:ftp協議中的數據連接與命令連接之間的關系
      INVALID:無效的連接,如flag標記不正確
      UNTRACKED:未進行追蹤的連接,如raw表中關閉追蹤
    [!] --state state
      已經追蹤到的並記錄下來的連接信息庫
        /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
    示例:

開啟連接追蹤功能后,開啟記憶功能,只有第一次訪問(三次握手中的第一次握手)時狀態為NEW,只要沒有超出記憶時間,后續訪問均為ESTABLISTIED狀態
開啟連接追蹤功能,只需對進入本機的報文進行規則設置,流出本機的報文會根據進入本機報文的狀態自動判斷是否讓其出去
iptables -A INPUT -d 192.168.32.129 -i ens33 -p tcp -m multiport --dports 80,443,139,445,22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.32.129 -o ens33 -p tcp -m multiport --sports 80,443,139,445,22 -m state --state NEW,ESTABLISHED -j ACCEPT
設置通用規則開啟白名單
iptables -A INPUT -j REJECT
iptables -A OUTPUT -j REJECT

開啟連接追蹤功能,只需對進入本機的報文進行規則設置
iptables -I INPUT 2 -d 192.168.32.129 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 10 -j ACCEPT
[root@centos7 ~]# iptables -I OUTPUT 2 -s 192.168.32.129 -p icmp --icmp-type 0 -j ACCEPT
由於設置連接追蹤機制,因此只需允許ESTABLISHED狀態的報文流出即可
iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
注意:設置防火牆規則時,如果只對本機ip地址設置規則,會拒絕本機lo環回網卡的請求報文,造成無法訪問自己,因此,在定義入出站規則時排除本機lo接口
在原有通用拒絕規則之上排除本機lo接口
iptables -R INPUT 3 ! -i lo -j REJECT
iptables -R OUTPUT 2 ! -o lo -j REJECT



iptables連接追蹤機制

    開放被動模式的ftp服務
    (1) 裝載ftp連接追蹤的專用模塊:
      跟蹤模塊路徑:/lib/modules/kernelversion/kernel/net/netfilter
      vim /etc/sysconfig/iptables-config配置文件
      IPTABLES_MODULES=“nf_conntrack_ftp”
      modproble nf_conntrack_ftp
    (2) 放行請求報文:
      命令連接: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 --dport 21 -m state --state NEW -j ACCEPT
    (3) 放行響應報文:
      iptables -I OUTPUT -s LocalI P-p tcp -m state --state ESTABLISHED -j ACCEPT
    示例:

安全開放ftp服務
安裝並啟動ftp:
    yum install vsftpd
    systemctlstart vsftpd
ftp服務有兩種連接:
    命令連接:客戶端訪問服務端,只需開放21端口
    數據連接:服務端通過命令連接通知客戶端傳送數據,端口為隨機
針對21端口開啟連接追蹤機制,放行數據連接
    iptables -I INPUT -d 192.168.32.129 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT  開啟RELATED功能,放行數據連接。
通過命令連接傳輸數據,即與已建立連接相關的連接
    iptables -I  INPUT 2 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
注意:此時無需對放行規則進行設置,因為只要開啟連接追蹤功能,只需放行ESTABLISHED狀態的報文即可,而改規則在上面實驗中已經設置過,如果是第一次設置則需要再次寫入此規則:iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
此時,ftp服務仍然無法通過本地訪問,這是因為RELATED是一個獨特的模塊,必須手動裝入內核模塊才能使用該功能
手動裝載模塊:modprobe nf_conntrack_ftp

如何實現開機自啟動該模塊:編寫腳本放入/etc/sysconfig/modules目錄
vim /etc/sysconfig/modules/conntrack.sh
#/bin/bash
#
modprobe nf_conntrack_ftp
chmod +x /etc/sysconfig/modules/conntrack.sh 
下次開機即可自啟動

規則優化:
配置iptables規則如下:
[root@centos7 ~]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      100  6664 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.32.129       tcp dpt:21 state NEW,ESTABLISHED
3      269 18752 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
4     2138  151K ACCEPT     tcp  --  ens33  *       0.0.0.0/0            192.168.32.129       multiport dports 80,443,139,445,22 state NEW,ESTABLISHED
5       19   532 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.32.129       icmptype 8 limit: avg 2/sec burst 10
6      919  120K REJECT     all  --  !lo    *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1126  172K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
2       26  2430 REJECT     all  --  *      !lo     0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

規則優化:
INPUT鏈中,可以刪除第3條,第2條、4條可以合並
iptables -D INPUT 3
iptables -R INPUT 2 -d 192.167.32.129 -p tcp -m multiport --dports 21:22,80,443,139,445 -m state --state NEW -j ACCEPT
刪除合並后的第三條
iptables -D INPUT 3

優化后的規則:
[root@centos7 ~]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      235 15972 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.167.32.129       multiport dports 21:22,80,443,139,445 state NEW
3       19   532 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.32.129       icmptype 8 limit: avg 2/sec burst 10
4     1028  137K REJECT     all  --  !lo    *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1211  184K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
2       33  3064 REJECT     all  --  *      !lo     0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable



    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: "

iptables規則優化

    任何不允許的訪問,應該在請求到達時給予拒絕
    規則在鏈接上的次序即為其檢查時的生效次序
    基於上述,規則優化
    1 安全放行所有入站和出站的狀態為ESTABLISHED狀態連接
    2 謹慎放行入站的新請求
    3 有特殊目的限制訪問功能,要在放行規則之前加以拒絕
    4 同類規則(訪問同一應用),匹配范圍小的放在前面,用於特殊處理
    5 不同類的規則(訪問不同應用),匹配范圍大的放在前面
    6 應該將那些可由一條規則能夠描述的多個規則合並為一條
    7 設置默認策略,建議白名單(只放行特定連接)
      1)iptables-P,不建議
      2)建議在規則的最后定義規則做為默認策略
    規則有效期限:
    使用iptables命令定義的規則,手動刪除之前,其生效期限為kernel存活期限
    保存規則:
    保存規則至指定的文件
    CentOS 6
      service iptables save
      將規則覆蓋保存至/etc/sysconfig/iptables文件中
    CentOS7
      iptables-save > /PATH/TO/SOME_RULES_FILE
    規則重載
    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

5、iptables之地址轉換法則

網絡防火牆

    iptables/netfilter網絡防火牆:
      (1) 充當網關
      (2) 使用filter表的FORWARD鏈
    注意的問題:
      (1) 請求-響應報文均會經由FORWARD鏈,要注意規則的方向性
      (2) 如果要啟用conntrack機制,建議將雙方向的狀態為ESTABLISHED的報文直接放行

模擬實驗1:

實驗環境:
客戶端 ----  轉發服務器 ---- 服務器端
客戶端:192.168.32.129
轉發服務器網卡1:192.168.32.130 
         網卡2:172.45.0.129
服務器端:172.45.0.128
客戶端網關添加路由指向轉發服務器的網卡1
服務器端網關添加路由指向轉發服務器的網卡2
轉發服務器開啟轉發功能,模擬路由器;

配置:
三台主機分別關閉firewalld服務以及selinux
systemctl stop firewalld
客戶端:route add -net 172.45.0.0/16 gw 192.168.32.130
服務器端:route add -net 192.168.32.0/24 gw 172.45.0.129
轉發服務器臨時打開路由轉發功能,模擬路由器
  sysctl -w net.ipv4.ip_forward=1
  或者echo 1 > /proc/sys/net/ipv4/ip_forward

轉發服務器使用通用規則設置白名單
    iptables -A FORWARD -j REJECT
此時,由於通過ssh連接轉發服務器並不會收到影響,因為ssh請求並不通過FORWARD鏈
但是客戶端ping服務器端時,則無法ping通

在轉發服務器上FOREWARD鏈開啟連接追蹤機制,對於響應報文只允許ESTABLISHED狀態報文通過即可
    iptables -I FOREWARD -m state --state ESTABLISHED -j ACCEPT
對於請求報文來說,只有dport能夠確認,因為源端口是隨機的
對於響應報文來說,只有sport能夠確認,響應報文是服務器發送的,服務器只知道自己服務的端口號
此時只需放行從客戶端到服務器端的NEW狀態的請求報文即可,而響應報文已經放行過
因此在轉發服務器上
    iptables -I FORWARD 2 -d 172.20.0.66 -p tcp -m multiport --dports 21:22,80,139,445 -m state --state NEW -j ACCEPT
對於ftp服務,轉發服務器還需要允許RELATED狀態報文通過
    iptables -I FOREWARD 3 -d 172.20.0.66 -p tcp -m state --state RELATED-j ACCEPT
需要在服務器端手動轉載ftp專用的連接追蹤模塊
    modprobe nf_conntrack_ftp
注意:在服務器端加載ftp模塊,而不是轉發服務器

總結來說:
對於請求報文來說只需要在轉發服務器放行NEW狀態的請求報文
    iptables -I FORWARD 2 -d 172.20.0.66 -p tcp -m multiport --dports 21:22,80,139,445 -m state --state NEW -j ACCEPT
對於響應報文來說只需要在轉發服務器放行ESTABLISHED狀態的響應報文
    iptables -I FOREWARD -m state --state ESTABLISHED -j ACCEPT
對於ftp服務器還需添加RELATED狀態報文
    iptables -I FOREWARD 3 -d 172.20.0.66 -p tcp -m state --state RELATED -j ACCEPT
還需要在服務器端加載ftp模塊
    modprobe nf_conntrack_ftp
查看防火牆規則:
[root@centos7 data]# iptables -vnL
Chain INPUT (policy ACCEPT 46 packets, 4282 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         
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            172.45.0.128         state RELATED
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.45.0.128         multiport dports 21:22,80,443,445,139 state NEW
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 26 packets, 5424 bytes)
 pkts bytes target     prot opt in     out     source               destination 

    

模擬實驗2:

自定義鏈
模擬實驗:允許客戶端ping服務器端
自定義鏈為:icmp_rules
    iptables -N icmp_rules
為自定義鏈添加規則允許別人ping通自己並回應報文
    iptables -A icmp_rules -p icmp --icmp-type 8 -j ACCEPT
    iptables -A icmp_rules -p icmp --icmp-type 0 -j ACCEPT
如果自定義鏈規則都不匹配,則返回主鏈繼續后續規則匹配
    iptables -A icmp_rules -j RETURN
在FORWARD主鏈調用自定義鏈
    iptables -I FORWARD 3 -j icmp_rules
注意:自定義鏈只能通過主鏈調用才能使用
測試:在客戶端 ping 172.45.0.128
查看定義的防火牆規則
[root@centos7 ~]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 89 packets, 8794 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  *      *       0.0.0.0/0            172.45.0.128         state RELATED
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.45.0.128         multiport dports 21:22,80,443,445,139 state NEW
3        6   504 icmp_rules  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
5        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 57 packets, 15892 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain icmp_rules (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        3   252 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8
2        3   252 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 0
3        0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0 

刪除自定義鏈
步驟:必須先刪除主鏈,然后清空自定義鏈規則,最后才能刪除主鏈
    iptables -D FORWARD 3   刪除FORWARD主鏈調用
    iptables -F icmp_rules  清空自定義鏈規則
    iptables -X icmp_rules  刪除自定義鏈

    

NAT

    NAT: network address translation
      PREROUTING,INPUT,OUTPUT,POSTROUTING
      請求報文:修改源/目標IP,由定義如何修改
      響應報文:修改源/目標IP,根據跟蹤機制自動實現
    SNAT:source NAT POSTROUTING, INPUT
      讓本地網絡中的主機通過某一特定地址訪問外部網絡,實現地址偽裝
      請求報文:修改源IP
    DNAT:destination NAT PREROUTING, OUTPUT
      把本地網絡中的主機上的某服務開放給外部網絡訪問(發布服務和端口映射),但隱藏真實IP
      請求報文:修改目標IP
    PNAT: port nat,端口和IP都進行修改

SANT

    nat表的target:
    SNAT:固定IP
      --to-source [ipaddr[-ipaddr]][:port[-port]]
      --random
    iptables-t nat-A POSTROUTING -s LocalNET! -d LocalNet-j SNAT --to-source ExtIP
    示例:
    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
    MASQUERADE:動態IP,如撥號網絡
      --to-ports port[-port]
      --random
    iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
    示例:
    iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE
    知識延伸:

SNAT轉換過程說明:
內網(私網):192.168.32.129
轉發服務器內網網卡1:192.168.32.130 
         外網網卡2:172.45.0.129
外網(公網):172.45.0.128

源地址轉換SNAT:
私網客戶端向公網服務器端發送請求,經過網關服務器時,通過源地址轉換(SNAT),把請求報文中源地址(即私網地址)192.168.32.129轉換為網關服務器的公網地址172.45.0.129,而報文中的目的地址為172.45.0.128不變,進而訪問公網服務器
公網服務器端向私網客戶端回復響應報文,到達網關服務器時,通過目的地址轉換(DNAT),把響應報文中公網服務器目的地址172.45.0.129轉換為網關服務器私網地址192.168.32.130,此時響應報文中的源地址172.45.0.128不變,進而回應私網客戶端
根據連接追蹤機制,回應報文的轉換會由系統自動實現,因此只要進行源地址轉換(SNAT)轉換即可

SANT必須在POSTROUTING鏈上制定規則
這是因為報文是否轉發必須通過網關服務器內部進行判斷后才能決定是否轉發,PREROUTING鏈位置太早不能進行轉發,而INPUT和OUTPUT鏈不能進行轉發,而nat地址轉換不支持在FORWARD鏈上進行,因此必須在POSTROUTING鏈上進行

簡單總結來說:
根據連接追蹤機制原理:私網向公網發送請求報文,只需做源地址轉換(SNAT)把請求報文中的源地址從私網地址轉換為網關服務器公網地址即可,只要請求報文能夠通過,響應報文回復時會自動被放行
另外,源地址轉換SANT必須在POSTROUTING鏈設置



模擬實驗:

內網訪問外網
內網知道外網目的地址,而外網不知道內網具體地址
所有內網網關指向網關服務器內網網卡,外網無需設置路由
在服務器端172.45.0.128
刪除路由
route del -net 192.168.32.0/24
在網關服務器192.168.32.130
清空防火牆規則
iptables -F
在網關服務器
在POSTROUTING鏈進行源地址轉換
iptables -t nat -I POSTROUTING -s 192.168.32.0/24 -j SNAT --to-source 172.45.0.129
--to-source  指定把私網地址轉換為哪個公網地址
--random   如果公網服務器上已存在多個公網地址,則把私網地址隨機轉換為網關服務器已存在的多個公網地址中的其中一個

如果為撥號上網,則公網ip地址不固定
MASQUERADE  地址偽裝
支持動態撥號上網,識別存在的公網地址,自動進行源地址轉換;該模式也支持靜態地址轉換,但是並不推薦,因為該模式會消耗計算資源
iptables -t nat -I POSTROUTING -s 192.168.32.0/24 -j MASQUERADE 
注意:
(1)由於內網訪問外網可能是多個服務,因此端口不做限制
(2)源地址轉換時,是把內網地址轉換為網關服務器的公網地址,即--to-source的地址為網關服務器的公網地址172.45.0.129
測試:ping 172.45.0.128

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

DNAT

    DNAT
      --to-destination [ipaddr[-ipaddr]][:port[-port]]
    iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
    示例:

iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080

    1
    2

知識延伸:

目的地址轉換DNAT
內網(私網):192.168.32.129
轉發服務器內網網卡1:192.168.32.130 
         外網網卡2:172.45.0.129
外網(公網):172.45.0.128

訪問方向:供內網設置web服務,從公網訪問內網web服務器時,默認先訪問公司網關服務器的外網網關(因為公網之間才能相互通信)
請求報文從公網到達網關服務器時,經過目的地址轉換,把請求報文中目標地址由網關服務器公網地址172.45.0.129轉換為內網web服務器的地址192.168.32.129,請求報文中源地址172.45.0.128不變
根據連接追蹤機制,只要請求報文通過,響應報文即會被系統自動放行

DNAT必須在PRETOUTING鏈上設置
這是因為,請求報文中的目的地址為本機地址,如果不在OREROUTING鏈上設置,一旦進入網關服務器,就從進入INPUT鏈轉發給本機,本機找不到請求資源,將會回復無法找到請求資源。該請求報文也不會被轉發,無法到達內網web服務器

簡單總結來說:
根據連接追蹤機制原理:公網訪問內網服務器,只需要做目的地址轉換DNAT即可,把請求報文中的目的地址轉換為內網服務器地址,只要請求報文能夠通過,響應報文回復時會自動被放行,目的地址轉換DANT必須在PREROUTING鏈設置

    

模擬實驗:

外網訪問內網
要注意把內網地址指向網關服務器的內網網卡
在公網主機上無需設置路由(二者在同一網段,無需設置路由;如果有多個路由器則需要指定下一跳設備地址)
在PREROUTING鏈設置目的地址轉換
iptables -t nat -A PREROUTING -d 172.45.0.129 -p tcp  --dport 80 -j DNAT --to-destination 192.168.32.129
注意:
(1)由於公網訪問內網web服務,因此只需開放80端口即可
(2)指定轉換的目的地址為內網服務器地址,而不是網關服務器的內網地址,即--to-destination 為內網地址172.45.0.128,而不是網關服務器內網地址172.45.0.130

    1
    2
    3
    4
    5
    6
    7
    8

轉發

    REDIRECT:
      NAT表
      可用於:PREROUTING OUTPUT 自定義鏈
      通過改變目標IP和端口,將接受的包轉發至不同端口
      --to-ports port[-port]
    地址轉換的目的:
      安全:隱藏內網服務器,利用公網網關單個地址隱藏內網服務器地址
      資源:節省ip地址,一個公網ip地址對應多個內網ip地址
    示例:
    iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport80 -j REDIRECT --to-ports 8080

6、firewalld介紹

firewalld服務

    firewalld是CentOS7.0新推出的管理netfilter的工具
    firewalld是配置和監控防火牆規則的系統守護進程。可以實現iptables,ip6tables,ebtables的功能
    firewalld服務由firewalld包提供
    firewalld支持划分區域zone,每個zone可以設置獨立的防火牆規則
    歸入zone順序:
      先根據數據包中源地址,將其納為某個zone
      納為網絡接口所屬zone
      納入默認zone,默認為public zone,管理員可以改為其它zone
    網卡默認屬於public zone,lo網絡接口屬於trusted zone

firewalld zone分類

預定義服務
7、firewalld配置命令

    firewall-cmd --get-services 查看預定義服務列表
    /usr/lib/firewalld/services/*.xml預定義服務的配置
    三種配置方法
      firewall-config(firewall-config包)圖形工具
      firewall-cmd(firewalld包)命令行工具
      /etc/firewalld 配置文件,一般不建議

firewall-cmd命令選項

    常用選項
    –get-zones 列出所有可用區域
    –get-default-zone 查詢默認區域
    –set-default-zone= 設置默認區域
    –get-active-zones 列出當前正使用的區域
    –add-source=[–zone=] 添加源地址的流量到指定區域,如果無–zone= 選項,使用默認區域
    –remove-source= [–zone=] 從指定區域中刪除源地址的流量,如無–zone= 選項,使用默認區域
    –add-interface=[–zone=] 添加來自於指定接口的流量到特定區域,如果無–zone= 選項,使用默認區域
    –change-interface=[–zone=] 改變指定接口至新的區域,如果無–zone= 選項,使用默認區域
    –add-service= [–zone=] 允許服務的流量通過,如果無–zone= 選項,使用默認區域
    –add-port=<PORT/PROTOCOL>[–zone=] 允許指定端口和協議的流量,如果無–zone= 選項,使用默認區域
    –remove-service= [–zone=] 從區域中刪除指定服務,禁止該服務流量,如果無–zone= 選項,使用默認區域
    –remove-port=<PORT/PROTOCOL>[–zone=] 從區域中刪除指定端口和協議,禁止該端口的流量,如果無–zone= 選項,使用默認區域
    –reload 刪除當前運行時配置,應用加載永久配置
    –list-services 查看開放的服務
    –list-ports 查看開放的端口
    –list-all [–zone=] 列出指定區域的所有配置信息,包括接口,源地址,端口,服務等,如果無–zone= 選項,使用默認區域
    查看默認zone
      firewall-cmd–get-default-zone
    默認zone設為dmz
      firewall-cmd–set-default-zone=dmz
    在internalzone中增加源地址192.168.0.0/24的永久規則
      firewall-cmd–permanent --zone=internal --add-source=192.168.0.0/24
    在internalzone中增加協議mysql的永久規則
      firewall-cmd–permanent –zone=internal --add-service=mysql
    加載新規則以生效
      firewall-cmd–reload

其他規則

    當基本firewalld語法規則不能滿足要求時,可以使用以下更復雜的規則
    rich-rules 富規則,功能強,表達性語言
    Direct configuration rules 直接規則,靈活性差
    幫助:man 5 firewalld.direct

8、rich規則

rich規則

    rich規則語法:
    forward-port port=<PORTNUM>protocol=tcp|udp[to-port=<PORTNUM>] [to-addr=<ADDRESS>]

示例1:

轉發從192.168.0.0/24來的,發往80/TCP的流量到防火牆的端口8080/TCP
firewall-cmd --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 forward-port port=80 protocol=tcpto-port=8080'

    1
    2

示例2:

firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=172.25.X.10/32 forward-port port=443 protocol=tcpto-port=22'
firewall-cmd --reload
ssh -p 443 serverX.example.com

    1
    2
    3

管理rich規則

    rich規則比基本的firewalld語法實現更強的功能,不僅實現允許/拒絕,還可以實現日志syslog和auditd,也可以實現端口轉發,偽裝和限制速率
    rich語法:
    rule
      [source]
      [destination]
      service|port|protocol|icmp-block|masquerade|forward-port
      [log]
      [audit]
      [accept|reject|drop]
    man 5 firewalld.richlanguage

規則

    規則實施順序:
      該區域的端口轉發,偽裝規則
      該區域的日志規則
      該區域的允許規則
      該區域的拒絕規則
    每個匹配的規則生效,所有規則都不匹配,該區域默認規則生效

rich規則選項

rich規則示例:

拒絕從192.168.0.11的所有流量,當address 選項使用source或destination時,必須用family= ipv4|ipv6
    firewall-cmd --permanent --zone=classroom --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject‘
限制每分鍾只有兩個連接到ftp服務
    firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'
拋棄esp(IPsec 體系中的一種主要協議)協議的所有數據包
    firewall-cmd --permanent --add-rich-rule='rule protocol value=espdrop'
接受所有192.168.1.0/24子網端口5900-5905范圍的TCP流量
    firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=5900-5905 protocol=tcp accept'

    1
    2
    3
    4
    5
    6
    7
    8

rich日志規則

log [prefix="<PREFIX TEXT>"[level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]  
<LOGLEVEL>可以是emerg,alert,crit,error,warning,notice,info, debug.  
<DURATION>s:秒,m:分鍾,h:小時, d:天  
audit [limit value="<RATE/DURATION>"]  

    1
    2
    3
    4

rich日志規則示例:

接受ssh新連接,記錄日志到syslog的notice級別,每分鍾最多三條信息
    firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh" level="notice" limit value="3/m" accept
從2001:db8::/64子網的DNS連接在5分鍾內被拒絕,並記錄到日志到audit,每小時最大記錄一條信息
    firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300

    1
    2
    3
    4

規則示例:

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.X.10/32 service name="http" log level=notice prefix="NEW HTTP " limit value="3/s" accept'
firewall-cmd --reload
tail -f /var/log/messages
curl http://serverX.example.com

    1
    2
    3
    4

偽裝和端口轉發

    NAT網絡地址轉換,firewalld支持偽裝和端口轉發兩種NAT方式
    偽裝NAT
    firewall-cmd–permanent --zone=–add-masquerade
    firewall-cmd–query-masquerade 檢查是否允許偽裝
    firewall-cmd–add-masquerade 允許防火牆偽裝IP
    firewall-cmd–remove-masquerade 禁止防火牆偽裝IP
    示例:
    firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'
    端口轉發
    端口轉發:將發往本機的特定端口的流量轉發到本機或不同機器的另一個端口。通常要配合地址偽裝才能實現
    firewall-cmd–permanent --zone=–add-forward-port=port=:proto=[:toport=][:toaddr=]
    說明:toport=和toaddr=至少要指定一個

示例:

轉發傳入的連接9527/TCP,到防火牆的80/TCP到public zone 的192.168.0.254
firewall-cmd --add-masquerade 啟用偽裝
firewall-cmd --zone=public --add-forward-port=port=9527:proto=tcp:toport=80:toaddr=192.168.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM