firewall-cmd 使用總結


 firewalld的簡要說明:
    firewalld 、firewall-cmd 、firewall-offline-cmd它們Python腳本,通過定義的在/usr/lib/firewalld下面的xml配置信息,
  在啟動時自動載入默認iptables配置,並應用到系統中,當使用firewalld-cmd添加防火牆規則時,它實際是轉換成
  iptables規則后,在應用到系統中。
  

  firewalld定義了幾個概念:
    zone: 它是安全域的范圍,就類似於Window上的域網絡,工作網絡,家庭網絡,Internet網絡等,不同的安全作用域
        其安全級別不同,安全程度不同,家庭zone的安全規則就是最寬松的。
    service: 它是zone里面的定義一個規則集,它將iptables中單獨根據 入接口,出接口,源目端口,協議等定義單獨規則
        整合為一個規則集合,方便識別和管理。
    protocol: 定義協議規則
    port,source-port :基於端口定義規則,port我的理解:定義源和目標為指定端口的規則。
    source: 定義源地址規則
    interface: 定義基於出入接口的規則。
    direct: 直接定義原始iptables規則。

  白名單控制誰能操作firewalld 對規則做增刪改:
    注: firewalld的白名單機制是控制,誰能操縱firewall-cmd來對現有規則進行增刪改等操作。
    此選項支持四種控制方式:
    1. context : 根據SELinux的進程domain(域)的安全上下文類型來定義Whitelist(白名單)
    2. command: 根據命令的絕對路徑做Whitelist.
    3. uid
    4. user: 可以使用用戶名 或 UID來做Whitelist

  全局選項:
    --state   #顯示當前firewalld服務的運行狀態。
    --runtime-to-permanent    #將運行時配置保存為永久配置。


  全局刷新配置:
    --reload    #重新加載防火牆permanent(永久的)的規則配置,覆蓋當前運行時配置,
          在運行時添加的非permanent規則,都將丟失。
    --complete-reload    #完全重新加載防火牆,甚至netfilter內核模塊。這很可能會終止活動連接,
              因為狀態信息會丟失。此選項僅在出現嚴重防火牆問題時使用。
              例如,如果存在狀態信息問題,則無法使用正確的防火牆規則建立連接。

  全局開啟日志記錄功能:
    --get-log-denied    #查看是否啟用了在所有規則中啟用拒絕日志記錄。
    --set-log-denied=[all |unicast |broadcast |multicast |off]
        #設置啟用或禁用在所有規則添加拒絕或刪除日志記錄功能。

  在進行一下操作前需要知道:
    增刪查改:
      增: --add- 或 --new- #注: add:新增子選項 ; new:新建新項目
      刪: --remove- 或 --delete-
      查: --query-
      改: --change-
    查看修改前: firewall-cmd --reload
    然后查看:
      --info-[zone |service |ipset |icmptype |helper]=[zone |service |ipset |icmptype |helper]


      --path-[zone |service | icmptype |helper |ipset]=[zone |service | icmptype |helper |ipset]


      --list-[all-zones |services |ports |protocols |source-ports |icmp-blocks |forward-ports |interfaces |sources]


      --get-[zones |services |icmptypes ]=[zones |services |icmptypes]

      --get-zone-of-interface=網卡接口 #查看此網卡接口當前被附加到那個zone
      --get-zone-of-source=<source>[/<mask>]|<MAC>|ipset:<ipset>

      --get-[default-zone |active-zones |target |ipsets |ipset-types |descripton |short |helpers]


  zone選項:
    注:
     zone可設置target,即iptables的動作,默認public的動作是僅允許icmp報文.
    

    --set-default-zone=<zone>         #設置默認zone, 默認為:public

    創建zone有兩種方法:
      --new-zone=<zone> #直接指定zone名稱創建.
      --new-zone-from-file=<filename> [--name=<zone>]
    #根據/etc/firewalld/zones/ 或 /usr/lib/firewalld/zones/下已有的zone.xml來創建.
      例:
       firewall-cmd --new-zone=test --permanent  
       firewall-cmd --reload    #任何操作完成后,都必須刷新后,才能查看到。

       注: 實際上firewalld也采用了多層結構來管理iptables規則,--permanent實際上是將當前在內存
        中的修改刷寫到磁盤的配置文件中,這個配置文件就是默認zone的配置文件,默認在
          /etc/firewalld/zone/public.xml 
        --reload則是將內存中的數據同步到運行時的firewalld管理的runtime數據結構中。

 

在默認zone 或 指定zone下可做的操作:
    --add-port=<portid>[-<portid>]/<protocol>
    --add-source-port=<portid>[-<portid>]/<protocol>
    --add-protocol=<protocol>
    --add-service=<service>
    注:
       service就相當於port,source-port,protocol的集合,可將這些單獨的元素,打包成一個服務來通過
       調用它,一並創建port,source-port,protocol規則。
      創建服務和創建zone一樣,也是兩種方式:
    --new-service=<service>     #指定服務名稱來創建
    --new-service-from-file=<filename> [--name=<service>]    #根據已有xml文件來創建

在服務下可做的操作:
    --service=<service> --add-port=<portid>[-<portid>]/<protocol>
    --service=<service> --add-source-port=<portid>[-<portid>]/<protocol>
    注:
     port 和 source-port都可以定義多個,但是測試發現,定義多個后,僅第一個會在iptables中的filter表中
    創建允許規則。
    若需要定義多個自定義端口,最好使用范圍來創建允許一個端口范圍的規則。
    --service=<service> --add-protocol=<protocol>      #它可以被創建為單獨的一條運行某協議的iptables規則.
    --service=<service> --add-module=<module>        #不知道如何使用
    --service=<service> --set-description=<description>      #定義一個具體功能描述說明
    --service=<service> --set-short=<description>       #定義一個簡短描述名
    --service=<service> --set-destination=<ipv>:<address>[/<mask>]    #定義目標地址. 因為對於服務來說,它的源只能是自己。

   例:
    #創建服務的示例:
    firewall-cmd --new-service=test --permanent
    firewall-cmd --service=test --add-port=9090/tcp --permanent
    firewall-cmd --service=test --add-source-port=10001-10003/tcp --permanent
    firewall-cmd --service=test --add-protocol=udp --permanent
    firewall-cmd --service=test --set-description='This is a test service !' --permanent
    cat /etc/firewalld/services/test.xml
      

    firewall-cmd --add-service=test --premanent #這樣就執行創建iptables規則了。
    firewall-cmd --reload
    iptables -n -v -L

    在默認zone 或 指定zone下,添加網卡接口 和 源地址規則:
   --add-interface=<interface>
    注:
          將指定物理網卡的接口添加到zone中.默認是添加到public zone中.
     firewalld執行此操作后,會在INPUT鏈 和 FORWARD鏈中添加入站 和 轉發規則。
      firewall-cmd --add-interface=eth1 --permanent
      firewall-cmd --reload
      iptables -v -n -L |grep -C3 'eth1‘

        

      --add-source=<source>[/<mask>]|<MAC>|ipset:<ipset>
    注:
        將指定源地址添加到指定zone中,默認:public.
    firewalld 執行此操作后, 會在INPUT鏈 和 FORWARD鏈中添加入站 和 轉發規則.
    firewall-cmd --add-source=10.0.0.0/24 --permanent
    firewall-cmd --reload
    iptables -v -n -L |grep -B3 ‘10.0.0.0/24’

      

 

ICMP相關的規則:
    --add-icmp-block=<icmptype>
    --add-icmp-block-inversion

    在默認zone 或 指定zone下啟用NAT功能:
    注:
        它支持DNAT(端口轉發) 和 SNAT(源地址轉換)
       --add-forward-port=port=<portid>[-<portid>]:proto=<protocol>[:toport=<portid>[-<portid>]][:toaddr=<address>[/<mask>]]
    例:
     firewall-cmd  --add-forward-port=port=10003:proto=tcp:toport=22:toaddr=192.168.0.12
       注:
      添加一條臨時規則,若--reload將被刪除.
      此規則創建一個DNAT規則,將訪問防火牆10003端口的報文轉發給192.168.0.12的22號端口上。
      firewall-cmd執行此命令,實現DNAT的步驟如下:
      1.在mangle中添加一條規則去匹配目標端口是10003的報文,然后將其打上標記。
      2.在nat條中添加一條DNAT規則,通過匹配標記,將其源地址修改為192.168.0.12后,從轉發filter表.
      3.在filter表中添加一條轉發規則,只要匹配指定標記,就直接轉發。
      4.開啟系統的轉發功能。

   

  #啟用IPv4的動態IP偽裝(即動態SNAT),它僅在POST_public_allow 鏈中添加了一條出接口非環回口的SNAT規則.
    --add-masquerade  


direct選項:
    注:
      此選項支持直接編寫iptables規則.
      --add-chain {ipv4|ipv6|eb} <table> <chain>
      --add-rule {ipv4|ipv6|eb} <table> <chain> <priority> <arg>...
     注:
       priority: 就是規則插入的行號,越靠前越優先。
       arg: iptables相關規則選項。

     Whitelist選項:
    firewall-cmd --lockdown-on      #先開啟功能,在設置誰能操縱firewall-cmd.
    firewall-cmd --add-lockdown-whitelist-command=<command>
          --add-lockdown-whitelist-context=<context>
          --add-lockdown-whitelist-uid=<uid>
          --add-lockdown-whitelist-user=<user>


rich富語言選項用法:
  firewall-cmd [--zone=zone] [--add|--list|--query|--remove]-rich-rule='rule' [--timeout=seconds]
      注:
       --timeout: 設置規則超時時間,若超時則自動刪除,單位:秒

    rule: 簡略版
      [source]
      [destination]
      service|port|protocol|icmp-block|masquerade|forward-port
      [log]
      [audit]
      [accept|reject|drop]

      rule:詳細版
      [family="ipv4|ipv6"]
      [source |destination] address="address[/mask]" [invert="True|yes"]
      [[service name="service name" ]| [port port="number_or_range" protocol="tcp|udp"] | [protocol value="協議名"] ]
      [ icmp-block name="icmptype name" ]
      [masquerade]
      [forward-port port="number_or_range" protocol="tcp|udp" to-port="number_or_range" to-addr="address"]
      [log [prefix=prefix text] [level=log level] limit value=rate/duration]
      [audit]
      [accept | reject [type="reject type"] | drop]


masquerade:創建動態SNAT
  【即:自動判斷用戶要去的網絡,查詢路由后,將SNAT用戶的源地址轉換為可去往該網絡的IP】
  創建SNAT:
    firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=192.168.0.0/24 masquerade accept"
    注:
     更簡單的動態SNAT配置:
      firewall-cmd --permanent --add-masquerade
      firewall-cmd --permanent --query-masquerade   #可查看是否啟動成功.
                若內部有多個網段時,它可自動識別不同網段,並完成SNAT.
        跟它類似的SNAT配置為:
      firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=1.1.1.0/24 invert=yes"
        注:
         invert=yes: 表示反轉的意思,即只要不是1.1.1.0/24網絡的都做SNAT.和直接寫--add-masquerade類似.
      驗證:
        #查看自動配置的轉發規則,即SNAT回來的數據包,給予轉發放行.
          iptables -vnL |grep -C5 192.168.0.0/24
        #查看自動配置的NAT表中的POSTROUTING鏈的的轉化記錄.
          iptables -vnL -t nat |grep -C5 192.168.0.0/24

    客戶端:
      #客戶端與SNAT服務器之間是192.168.0.0/24網絡,SNAT端連接Internet.
      #注意添加默認路由時,一定要指明是global,或使用via關鍵字,指明下一跳.
      #否則創建的路由將是link類型的,系統將認為,我們其實是在一個網絡中.於是
      #當我們ping 1.1.1.2時,系統將認為,客戶端和1.1.1.0/24在一個局域網中,
      #於是發生ARP查詢,這樣肯定是查不到1.1.1.2的MAC的,就導致不通!
      ip route default via 192.168.0.1 dev eth0
      ping 1.1.1.2

端口轉發:
  #將源地址是172.24.8.0/24網絡的,訪問我的5432端口,則將其轉發到我的22號端口.並記錄日志,日志前綴為[ADMIN LOGIN]
  #而且限制每分鍾只記錄一條日志.
  firewall-cmd --add-rich-rule="rule family=ipv4 source address=172.24.8.0/24 forward-port port=5432 \
         protocol=tcp to-port=22 log prefix='[ADMIN LOGIN]' limit value=1/m accept"

  簡單的允許對任意源做端口轉發:
    firewall-cmd --add-forward-port=port=5432:proto=tcp:toport=22 --timeout=100
      注:
      格式:
        [--permanent] [--zone=zone]  \
        --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]] \
        [--timeout=seconds]

 


免責聲明!

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



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