天天看點

Linux防火牆配置(iptables, firewalld)

  • netfilter和底層實作
  • iptables
  • firealld

Linux中的防火牆

RHEL中有幾種防火牆共存:

  • iptables
  • firewalld
  • ip6tables
  • ebtables

這些軟體本身其實并不具備防火牆功能,他們的作用都是在使用者空間中管理和維護規則,隻不過規則結構和使用方法不一樣罷了,真正利用規則進行過濾是由核心的netfilter完成的。

擴充:整個linux内部結構可以分為三部分,從最底層到最上層依次是:硬體-->核心空間-->使用者空間。

CentOS7預設采用的是firewalld管理netfilter子系統,底層調用的仍然是iptables指令。不同的防火牆軟體互相間存在沖突,使用某個時應禁用其他的。

systemctl start/stop/enable/disable/status/is-active xxxx    //systemctl服務管理指令
      
Linux防火牆配置(iptables, firewalld)

Netfilter 

  netfilter是Linux 2.4核心引入的全新的包過濾引擎。由一些資料包過濾表組成,這些表包含核心用來控制資訊包過濾的規則集。iptables等等都是在使用者空間修改過濾表規則的便捷工具。

  netfilter在資料包必須經過且可以讀取規則的位置,共設有5個控制關卡。這5個關卡處的檢查規則分别放在5個規則鍊中(有的叫鈎子函數(hook functions)。也就是說5條鍊對應着資料包傳輸路徑中的5個控制關卡,鍊中的規則會在對應的關卡檢查和處理。任何一個資料包,隻要經過本機,必然經過5個鍊中的某個或某幾個。

  • PREROUTING      資料包剛進入網絡接口之後,路由之前,
  • INPUT                資料包從核心流入使用者空間。
  • FORWARD         在核心空間中,從一個網絡接口進入,到另一個網絡接口去。轉發過濾。
  • OUTPUT             資料包從使用者空間流出到核心空間。
  • POSTROUTING   路由後,資料包離開網絡接口前。

  鍊其實就是包含衆多規則的檢查清單,每一條鍊中包含很多規則。當一個資料包到達一個鍊時,系統就會從鍊中第一條規則開始檢查,看該資料包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該資料包;否則就繼續檢查下一條規則,如果該資料包不符合鍊中任一條規則,系統就會根據該鍊預先定義的預設政策來處理資料包。

資料包的傳輸過程

  1. 當一個資料包進入網卡時,它首先進入PREROUTING鍊,核心根據資料包目的IP判斷是否需要轉送出去。
  2. 如果資料包就是進入本機的,它就會沿着圖向下移動,到達INPUT鍊。資料包到了INPUT鍊後,任何程序都會收到它。本機上運作的程式可以發送資料包,這些資料包會經過OUTPUT鍊,然後到達POSTROUTING鍊輸出。
  3. 如果資料包是要轉發出去的,且核心允許轉發,資料包就會如圖所示向右移動,經過FORWARD鍊,然後到達POSTROUTING鍊輸出。
Linux防火牆配置(iptables, firewalld)

  可以看出,剛從網絡接口進入的資料包尚未進行路由決策,還不知道資料要走向哪裡,是以進出口處沒辦法實作資料過濾,需要在核心空間設定轉發關卡、進入使用者空間關卡和離開使用者空間關卡。

iptables

參考文檔:http://drops.wooyun.org/tips/1424

起源于freeBSD的ipfirewall(核心1.x時代),所有規則都在核心中;2.0x後更名為ipchains,可以定義多條規則并串用;現在叫iptables,使用表組織規則鍊。

iptablses按照用途和使用場合,将5條鍊各自切分到五張不同的表中。也就是說每張表中可以按需要單獨為某些鍊配置規則。例如,mangle表和filter表中都能為INPUT鍊配置規則,當資料包流經INPUT位置(進入使用者空間),這兩個表中INPUT鍊的規則都會用來做過濾檢查。

Linux防火牆配置(iptables, firewalld)

五張表,每張表側重于不同的功能

  • filter        資料包過濾功能。隻涉及INPUT, FORWARD, OUTPUT三條鍊。是iptables指令預設操縱的表。
  • nat          位址轉換功能。NAT轉換隻涉及PREROUTING, OUTPUT, POSTOUTING三條鍊。可通過轉發讓區域網路機器連接配接網際網路
  • mangle     資料包修改功能。每條鍊上都可以做修改操作。修改封包中繼資料,做防火牆标記等。
  • raw          快速通道功能。為了提高效率,優先級最高,符合raw表規則的資料包會跳過一些檢查。
  • security    需要和selinux結合使用,内置規則比較複雜,通常都會被關閉

  iptables還支援自定義規則鍊。自定義的鍊必須和某個特定的鍊關聯起來。可在某個鍊中設定規則,滿足一定條件的資料包跳轉到某個目标鍊處理,目标鍊處理完成後傳回目前鍊中繼續處理後續規則。

  因為鍊中規則是從頭到尾依次檢查的,是以規則的次序是非常重要的。越嚴格的規則應該越靠前。

iptablse服務管理

service --status-all

service iptables start|stop|restart|status
service iptables save   //定義的所有内容,在重新開機時都會失效。調用save指令可以把規則儲存到檔案/etc/sysconfig/iptables中。
iptables-save           //儲存規則
iptables-restore        //加載規則。開機的時候,會自動加載/etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables2     //加載自定義的規則檔案

//iptables服務配置檔案:   /etc/sysconfig/iptables-config
//iptables規則檔案:       /etc/sysconfig/iptables

echo "1">/proc/sys/net/ipv4/ip_forward   //打開iptables轉發:       

iptables指令參考

iptables [-t TABLE] COMMAND [CHAIN] [CRETIRIA]...  [-j  ACTION]

省缺表名為filter。指令中用到的序号(RULENUM)都基于1。

COMMAND 指令選項

-A|--append  CHAIN                                 //鍊尾添加新規則
-D|--delete  CHAIN [RULENUM]                       //删除鍊中規則,按需序号或内容确定要删除的規則
-I|--insert  CHAIN [RULENUM]                       //在鍊中插入一條新的規則,預設插在開頭
-R|--replace CHAIN  RULENUM                        //替換、修改一條規則,按序号或内容确定
-L|--list   [CHAIN [RULENUM]]                      //列出指定鍊或所有鍊中指定規則或所有規則
-S|--list-urles [CHAIN [RULENUM]]                  //顯示鍊中規則
-F|--flush [CHAIN]                                 //清空指定鍊或所有鍊中規則
-Z|--zero [CHAIN [RULENUM]]                        //重置指定鍊或所有鍊的計數器(比對的資料包數和流量位元組數)
-N|--new-chain CHAIN                               //建立自定義規則鍊
-X|--delete-cahin [CHAIN]                          //删除指定表中使用者自定義的規則鍊
-E|--rename-chain OLDCHAIN NEWCHAIN                //重命名鍊,移動任何引用
-P|-policy CHAIN TARGET                            //設定鍊的預設政策,資料包未比對任意一條規則就按此政策處理      

CRETIRIA 條件比對  

分為基本比對和擴充比對,擴充比對又分為隐式比對和顯示比對

基本比對

-p|--proto  PROTO                      //按協定比對,如tcp、udp、icmp,all表示所有協定。 (/etc/protocols中的協定名)
-s|--source ADDRESS[/mask]...          //按資料包的源位址比對,可使用IP位址、網絡位址、主機名、域名
-d|--destination ADDRESS[/mask]...     //按目标位址比對,可使用IP位址、網絡位址、主機名、域名
-i|--in-interface INPUTNAME[ +]        //按入站接口(網卡)名比對,+用于通配。如 eth0, eth+ 。一般用在INPUT和PREROUTING鍊
-o|--out-interface OUTPUTNAME[+]       //按出站接口(網卡)名比對,+用于通配。如 eth0, eth+ 。一般用在OUTPUT和POSTROUTING鍊

可使用 ! 可以否定一個子句,如-p !tcp
      

擴充比對

-m|--match MATCHTYPE  EXTENSIONMATCH...    //擴充比對,可能加載extension

如: -p tcp  -m tcp  --dport 80

隐式擴充比對(對-p PROTO的擴充,或者說是-p PROTO的附加比對條件)

-m PROTO 可以省略,是以叫隐式

-m tcp   //-p tcp的擴充
    --sport  [!]N[:M]                      //源端口, 服務名、端口、端口範圍。
    --dport  [!]N[:M]                      //目标端口,服務名、端口、端口範圍
    --tcp-flags CHECKFLAGS FLAGSOFTRUE  //TCP标志位:SYN(同步),ACK(應答),RST(重置),FIN(結束),URG(緊急),PSH(強迫推送)。多個标志位逗号分隔。
                         //CHECKFLAGS為要檢查的标志位,FLAGSOFTRUE為必須為1的标志位(其餘的應該為0)
    --syn                               //第一次握手。 等效于 --tcpflags syn,ack,fin,rst syn   四個标志中隻有syn為1
-m udp   //-p udp的擴充
    --sport N[-M] 
    --dport N[-M]
-m icmp  //隐含條件為-p icmp
    --icmp-type  N             //8:echo-request  0:echo-reply      

顯示擴充比對

-m state
    --state    //連接配接狀态檢測,NEW,ESTABLISHED,RELATED,INVALID
-m multiport 
    --source-ports   PORT[,PORT]...|N:M            //多個源端口,多個端口用逗号分隔,
    --destination-ports PORT[,PORT]...|N:M         //多個目的端口
    --ports                          //多個端口,每個包的源端口和目的端口相同才會比對
-m limit
    --limit   N/UNIT    //速率,如3/minute, 1/s, n/second , n/day
    --limit-burst N     //峰值速率,如100,表示最大不能超過100個資料包
-m connlimit
    --connlimit-above N  //多于n個,前面加!取反
-m iprange
    --src-range IP-IP
    --dst-range IP-IP
-m mac                    
    --mac-source         //mac位址限制,不能用在OUTPUT和POSTROUTING規則鍊上,因為封包要送到網卡後,才能由網卡驅動程式透過ARP 通訊協定查出目的地的MAC 位址
-m string
    --algo [bm|kmp]      //比對算法
    --string "PATTERN"   //比對字元模式
-m recent
    --name               //設定清單名稱,預設為DEFAULT
    --rsource            //源位址
    --rdest              //目的位址
    --set                //添加源位址的包到清單中
    --update             //每次建立連接配接都更新清單
    --rcheck             //檢查位址是否在清單
    --seconds            //指定時間。必須與--rcheck或--update配合使用
    --hitcount           //命中次數。必須和--rcheck或--update配合使用
    --remove             //在清單中删除位址
-m time
    --timestart h:mm
    --timestop  hh:mm
    --days DAYS          //Mon,Tue,Wed,Thu,Fri,Sat,Sun; 逗号分隔
-m mark
    --mark N            //是否包含标記号N
-m owner 
    --uid-owner 500   //用來比對來自本機的封包,是否為某特定使用者所産生的,可以避免伺服器使用root或其它身分将敏感資料傳送出
    --gid-owner O     //用來比對來自本機的封包,是否為某特定使用者群組所産生的
    --pid-owner 78    //用來比對來自本機的封包,是否為某特定程序所産生的
    --sid-owner 100   //用來比對來自本機的封包,是否為某特定連接配接(Session ID)的響應封包
      

ACTION 目标政策(TARGET)

-j|--jump TARGET                //跳轉到目标規則,可能加載target extension
-g|--goto  CHAIN                //跳轉到指定鍊,不再傳回      
  • ACCEPT             規則驗證通過,不再檢查目前鍊的後續規則,直接跳到下一個規則鍊。
  • DROP                直接丢棄資料包,不給任何回應。中斷過濾。
  • REJECT             拒絕資料包通過,會傳回響應資訊。中斷過濾。
    • --reject-with  tcp-reset|port-unreachable|echo-reply
  • LOG                  在/var/log/messages檔案中記錄日志,然後将資料包傳遞給下一條規則。詳細位置可檢視/etc/syslog.conf配置檔案
    • --log-prefix "INPUT packets"
  • ULOG                更廣範圍的日志記錄資訊
  • QUEUE              防火牆将資料包移交到使用者空間,通過一個核心子產品把包交給本地使用者程式。中斷過濾。
  • RETURN            防火牆停止執行目前鍊中的後續規則,并傳回到調用鍊。主要用在自定義鍊中。
  • custom_chain    轉向自定義規則鍊
  • DNAT                目标位址轉換,改變資料包的目标位址。外網通路内網資源,主要用在PREROUTING。完成後跳到下一個規則鍊
    • --to-destination ADDRESS[-ADDRESS][:PORT[-PORT]]
  • SNAT                源位址轉換,改變資料包的源位址。内網通路外網資源。主機的IP位址必須是靜态的,主要用在POSTROUTING。完成後跳到下一個規則鍊。
    • --to-source ADDRESS[-ADDRESS][:PORT[-PORT]]
  • MASQUERADE   源位址僞裝,用于主機IP是ISP動态配置設定的情況,會從網卡讀取主機IP。直接跳到下一個規則鍊。
    • --to-ports 1024-31000
  • REDIRECT        資料包重定向,主要是端口重定向,把包分流。處理完成後繼續比對其他規則。能會用這個功能來迫使站點上的所有Web流量都通過一個Web高速緩存,比如Squid。
    • --to-ports 8080
  • MARK                 打防火牆标記。繼續比對規則。
    • --set-mark 2
  • MIRROR           發送包之前交換IP源和目的位址,将資料包傳回。中斷過濾。

輔助選項

-t|--table TABLE     //指定操作的表,預設的表為filter
-n|--numeric         //用數字形式顯示位址和端口,顯示主機IP位址而不是主機名
-x|--exact           //計數器顯示精确值,不做機關換算
-v|--verbose  (x3)   //檢視規則清單時,顯示更詳細的資訊
-line-numbers        //檢視規則表時,顯示在鍊中的序号
-V|--version 
-h|--help   
[option]  --help     //檢視特定選項的幫助,如iptables -p icmp --help

--fragment -f               //match second or further fragments only
--modprobe=<command>        //try to insert modules using this command
--set-counters PKTS BYTES   //set the counter during insert/append      

state  TCP連結狀态

  • NEW                 第一次握手,要起始一個連接配接(重設連接配接或将連接配接重導向) 
  • ESTABLISHED   資料包屬于某個已經建立的連接配接。第二次和第三次握手   (ack=1)
  • INVALID           資料包的連接配接編号(Session ID)無法辨識或編号不正确。如SYN=1 ACK=1 RST=1   
  • RELATED          表示該封包是屬于某個已經建立的連接配接,所建立的新連接配接。如有些服務使用兩個相關的端口,如FTP,21和20端口一去一回,FTP資料傳輸(上傳/下載下傳)還會使用特殊的端口

隻允許NEW和ESTABLISHED進,隻允許ESTABLISHED出可以阻止反彈式木馬。

使用示例

iptables -F           //删除iptables現有規則
iptables -L [-v[vv] -n]   //檢視iptables規則
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT       //在INPUT鍊尾添加一條規則
iptables -I INPUT 2 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT     //在INPUT鍊中插入為第2條規則
iptables -D  INPUT 2      //删除INPUT鍊中第2條規則
iptables -R INPUT 3 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT    //替換修改第三條規則
iptables -P INPUT DROP    //設定INPUT鍊的預設政策為DROP

//允許遠端主機進行SSH連接配接
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT 

//允許本地主機進行SSH連接配接
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 
iptables -A INTPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT 

//允許HTTP請求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT 

//限制ping 192.168.146.3主機的資料包數,平均2/s個,最多不能超過3個
iptables -A INPUT -i eth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT 

//限制SSH連接配接速率(預設政策是DROP)
iptables -I INPUT 1 -p tcp --dport 22 -d 192.168.146.3 -m state --state ESTABLISHED -j ACCEPT  
iptables -I INPUT 2 -p tcp --dport 22 -d 192.168.146.3 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT 
 
//防止syn攻擊(限制syn的請求速度)
iptables -N syn-flood 
iptables -A INPUT -p tcp --syn -j syn-flood 
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN 
iptables -A syn-flood -j DROP 

//防止syn攻擊(限制單個ip的最大syn連接配接數)
iptables –A INPUT –i eth0 –p tcp --syn -m connlimit --connlimit-above 15 -j DROP 
 
iptables -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP   //利用recent子產品抵禦DOS攻擊
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH   //單個IP最多連接配接3個會話
Iptables -I INPUT -p tcp --dport 22 -m state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP  //隻要是新的連接配接請求,就把它加入到SSH清單中。5分鐘内你的嘗試次數達到3次,就拒絕提供SSH清單中的這個IP服務。被限制5分鐘後即可恢複通路。
 
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP    //防止單個IP通路量過大
iptables –A OUTPUT –m state --state NEW –j DROP  //阻止反彈木馬
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m -j ACCEPT   //防止ping攻擊
 
//隻允許自己ping别人,不允許别人ping自己
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

//對于127.0.0.1比較特殊,我們需要明确定義它
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
 
//SNAT 基于原位址轉換。許多内網使用者通過一個外網 口上網的情況。将我們内網的位址轉換為一個外網的IP,共用外網IP通路外網資源。
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1

//當外網位址不是固定的時候。将外網位址換成 MASQUERADE(動态僞裝):它可以實作自動讀取外網網卡擷取的IP位址。
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE

//DNAT 目标位址轉換。目标位址轉換要做在到達網卡之前進行轉換,是以要做在PREROUTING這個位置上
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.2      

firewalld

dynamic firewall daemon。支援ipv4和ipv6。Centos7中預設将防火牆從iptables更新為了firewalld。firewalld相對于iptables主要的優點有:

  • firewalld可以動态修改單條規則,而不需要像iptables那樣,在修改了規則後必須得全部重新整理才可以生效;
  • firewalld在使用上要比iptables人性化很多,即使不明白“五張表五條鍊”而且對TCP/IP協定也不了解也可以實作大部分功能。  

1.firewalld的主要概念

1.1.過濾規則集合:zone

  • 一個zone就是一套過濾規則,資料包必須要經過某個zone才能入站或出站。不同zone中規則粒度粗細、安全強度都不盡相同。可以把zone看作是一個個出站或入站必須經過的安檢門,有的嚴格、有的寬松、有的檢查的細緻、有的檢查的粗略。
  • 每個zone單獨對應一個xml配置檔案,檔案名為<zone名稱>.xml。自定義zone隻需要添加一個<zone名稱>.xml檔案,然後在其中添加過濾規則即可。
  • 每個zone都有一個預設的處理行為,包括:default(省缺),   ACCEPT,   %%REJECT%%,  DROP 
  • firewalld提供了9個zone:
    • drop        任何流入的包都被丢棄,不做任何響應。隻允許流出的資料包。
    • block    任何流入的包都被拒絕,傳回icmp-host-prohibited封包(ipv4)或icmp6-adm-prohibited封包(ipv6)。隻允許由該系統初始化的網絡連接配接
    • public     預設的zone。部分公開,不信任網絡中其他計算機,隻放行特定服務。 
    • external    隻允許選中的服務通過,用在路由器等啟用僞裝的外部網絡。認為網路中其他電腦不可信。
    • dmz         允許隔離區(dmz)中的電腦有限的被外界網絡通路,隻允許選中的服務通過。
    • work          用在工作網絡。你信任網絡中的大多數計算機不會影響你的計算機,隻允許選中的服務通過。
    • home        用在家庭網絡。信任網絡中的大多數計算機,隻允許選中的服務通過。
    • internal     用在内部網絡。信任網絡中的大多數計算機,隻允許選中的服務通過。
    • trusted     允許所有網絡連接配接,即使沒有開放任何服務,那麼使用此zone的流量照樣通過(一路綠燈)。

  

zone配置檔案示例:public.xml

<?xml version="1.0" encoding="utf-8"?>
<zone target="default">
  <short>Public</short>
  <description>For use in public areas...</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
</zone>      

1.2.service

  • 一個service中可以配置特定的端口(将端口和service的名字關聯)。zone中加入service規則就等效于直接加入了port規則,但是使用service更容易管理和了解。
  • 定義service的方式:添加<service名稱>.xml檔案,在其中加入要關聯的端口即可。

service示例:ssh.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH)...</description>
  <port protocol="tcp" port="22"/>
</service>      

1.3.過濾規則

  • source             根據資料包源位址過濾,相同的source隻能在一個zone中配置。
  • interface          根據接收資料包的網卡過濾
  • service             根據服務名過濾(實際是查找服務關聯的端口,根據端口過濾),一個service可以配置到多個zone中。
  • port                 根據端口過濾
  • icmp-block        icmp封包過濾,可按照icmp類型設定
  • masquerade      ip位址僞裝,即将接收到的請求的源位址設定為轉發請求網卡的位址(路由器的工作原理)。
  • forward-port      端口轉發
  • rule                  自定義規則,與itables配置接近。rule結合--timeout可以實作一些有用的功能,比如可以寫個自動化腳本,發現異常連接配接時添加一條rule将相應位址drop掉,并使用--timeout設定時間段,過了之後再自動開放。

 1.4.過濾規則優先級

  1. source               源位址
  2. interface            接收請求的網卡
  3. firewalld.conf中配置的預設zone

2.firewalld配置檔案

2.1.firewalld配置方式

  • firewall-config       GUI工具
  • firewall-cmd         指令行工具
  • 直接編輯xml檔案    編輯後還需要reload才生效

2.2.firewall-cmd指令

firewall-cmd --version
firewall-cmd --help
firewall-cmd --state                               //檢視firewalld服務狀态
firewall-cmd --reload                              //修改配置檔案後,動态加載,不會斷開連接配接。
firewall-cmd --complete-reload                     //完全重新加載看,會斷開連接配接。類似重新開機。
firewall-cmd --panic-on/--panic-off/--query-panic  //panic模式開啟/關閉/查詢。panic模式會丢棄所有出入站的資料包,一段時間後所有連接配接都會逾時中斷。
firewall-cmd --get-active-zones                    //檢視所有綁定了source, interface和預設的zone,以及各個zone的生效條件。
firewall-cmd --set-default-zone=ZONE               //設定預設的zone,也可以修改firewalld.conf中的DefaultZone選項。

firewall-cmd --zone=xxxx --list-all
//反向查詢:  根據source或interface查詢對應的zone
firewall-cmd --get-zone-of-interface=interface
firewall-cmd --get-zone-of-source=source[/mask]
//更多用法在後面列出......      

部分指令共同的參數說明:

  • --zone=ZONE              指定指令作用的zone,省缺的話指令作用于預設zone
  • --permanent               有此參數表示指令隻是修改配置檔案,需要reload才能生效;無此參數則立即在目前運作的執行個體中生效,不過不會改動配置檔案,重新開機firewalld服務就沒效果了。
  • --timeout=seconds      表示指令效果持續時間,到期後自動移除,不能和--permanent同時使用。例如因調試的需要加了某項配置,到時間自動移除了,不需要再回來手動删除。也可在出現異常情況時加入特定規則,過一段時間自動解除。    

 

2.3.配置檔案存儲位置

firewalld的配置檔案以xml為主(主配置檔案firewalld.conf除外),有兩個存儲位置:

  • /etc/firewalld/              存放修改過的配置(優先查找,找不到再找預設的配置)
  • /usr/lib/firewalld/         預設的配置

修改配置的話隻需要将/usr/lib/firewalld中的配置檔案複制到/etc/firewalld中修改。恢複配置的話直接删除/etc/firewalld中的配置檔案即可。

2.4.配置檔案結構

  • firewalld.conf                       主配置檔案,鍵值對格式
    • DefaultZone         預設使用的zone,預設值為public
    • MinimalMark        标記的最小值,預設為100
    • CleanupOnExit     退出firewalld後是否清除防火牆規則,預設為yes
    • Lockdown            是否其他程式允許通過D-BUS接口操作,使用lockdown-whitelist.xml限制程式,預設為no
    • IPv6_rpfilter         類似rp_filter,判斷接收的包是否是僞造的(通過路由表中的路由條目,查找uRPF),預設為yes     
  • lockdown-whitelist.xml
  • direct.xml                           direct功能,直接使用防火牆的過濾規則,便于iptables的遷移
  • zones/                                zone配置檔案
  • services/                             service配置檔案
  • icmptypes/                          icmp類型相關的配置檔案

2.5.zone檔案中配置規則

<?xml version="1.0" encoding="utf-8"?>
<zone target="default">   <!--target屬性為zone的預設處理行為,可選值:default(省缺),   ACCEPT,   %%REJECT%%,  DROP -->
    <short>Demo</short>
    <description>demo...</description>
    <source address="address[/mask]">
    <interface name="ifcfg-em1"/>     <!--也可在網卡配置檔案ifcfg-*中配置,隻需要加入 ZONE=public -->  
    <service name="ssh"/>
    <port port="portid[-portid]" protocol="tcp|udp"/>
    <icmp-block name="echo-request"/>   <!--ping封包-->
    <masquerade/>
    <forward-port port="portid[-portid]" protocol="tcp|udp" [to-port="portid[-portid]"] [to-addr="ipv4address"]/>

    <rule [family="ipv4|ipv6"]>
               [ <source address="address[/mask]" [invert="bool"]/> ]
               [ <destination address="address[/mask]" [invert="bool"]/> ]
               [
                 <service name="string"/> |
                 <port port="portid[-portid]" protocol="tcp|udp"/> |
                 <protocol value="protocol"/> |
                 <icmp-block name="icmptype"/> |
                 <masquerade/> |
                 <forward-port port="portid[-portid]" protocol="tcp|udp" [to-port="portid[-portid]"] [to-addr="address"]/>
               ]
               [ <log [prefix="prefixtext"] [level="emerg|alert|crit|err|warn|notice|info|debug"]/> [<limit value="rate/duration"/>] </log> ]
               [ <audit> [<limit value="rate/duration"/>] </audit> ]
               [ <accept/> | <reject [type="rejecttype"]/> | <drop/> ]
     </rule>
</zone>      

2.6.使用firewall-cmd配置規則

//zone的預設的行為
firewall-cmd --permanent [--zone=zone] --get-target
firewall-cmd --permanent [--zone=zone] --set-target=target

//配置source,相同的source隻能在一個zone中配置,否則會提示Error: ZONE_CONFLICT 。
firewall-cmd [--permanent] [--zone=zone] --list-sources                        //顯示綁定的source
firewall-cmd [--permanent] [--zone=zone] --query-source=source[/mask]          //查詢是否綁定了source
firewall-cmd [--permanent] [--zone=zone] --add-source=source[/mask]            //綁定source,如果已有綁定則取消。
firewall-cmd [--zone=zone] --change-source=source[/mask]                       //修改source,如果原來未綁定則添加綁定。
firewall-cmd [--permanent] [--zone=zone] --remove-source=source[/mask]         //删除綁定   

//interface   如eth0, 也可以在網卡配置檔案ifcfg-*中加入  ZONE=ZONE名
firewall-cmd [--permanent] [--zone=zone] --list-interfaces
firewall-cmd [--permanent] [--zone=zone] --add-interface=interface
firewall-cmd [--zone=zone] --change-interface=interface
firewall-cmd [--permanent] [--zone=zone] --query-interface=interface
firewall-cmd [--permanent] [--zone=zone] --remove-interface=interface

//service
firewall-cmd [--permanent] [--zone=zone] --list-services
firewall-cmd [--permanent] [--zone=zone] --add-service=service [--timeout=seconds]   
firewall-cmd [--permanent] [--zone=zone] --remove-service=service
firewall-cmd [--permanent] [--zone=zone] --query-service=service

//port
firewall-cmd [--permanent] [--zone=zone] --list-ports
firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid]/protocol [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid]/protocol
firewall-cmd [--permanent] [--zone=zone] --query-port=portid[-portid]/protocol

//icmp-block, 預設允許所有ICMP通過
firewall-cmd --get-icmptypes //檢視所有支援的ICMP類型:
                  // destination-unreachable echo-reply echo-request parameter-problemr-solicitation source-quench time-exceeded
firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks
firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=icmptype [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=icmptype
firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=icmptype

//masquerade
firewall-cmd [--permanent] [--zone=zone] --add-masquerade [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-masquerade
firewall-cmd [--permanent] [--zone=zone] --query-masquerade

//端口轉發
firewall-cmd [--permanent] [--zone=zone] --list-forward-ports
firewall-cmd [--permanent] [--zone=zone] --add-forward-port=port=PORT[-PORT]:proto=PROTOCAL[:toport=PORT[-PORT]][:toaddr=ADDRESS[/MASK]][--timeout=SECONDS]
firewall-cmd [--permanent] [--zone=zone] --remove-forward-port=port=PORT[-PORT]:proto=PROTOCAL[:toport=PORT[-PORT]][:toaddr=ADDRESS[/MASK]]
firewall-cmd [--permanent] [--zone=zone] --query-forward-port=port=PORT[-PORT]:proto=PROTOCAL[:toport=PORT[-PORT]][:toaddr=ADDRESS[/MASK]]
 
//rule規則,  \'rule\'是将xml配置中的<和/>符号去掉後的字元串,如 \'rule family="ipv4" source address="1.2.3.4" drop\'
firewall-cmd [--permanent] [--zone=zone] --list-rich-rules
firewall-cmd [--permanent] [--zone=zone] --add-rich-rule=\'rule\' [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-rich-rule=\'rule\'
firewall-cmd [--permanent] [--zone=zone] --query-rich-rule=\'rule\'      

參考文檔

http://drops.wooyun.org/tips/1424

http://blog.chinaunix.net/uid-26000296-id-4111127.html

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html#sec-Introduction_to_firewalld

http://blog.chinaunix.net/uid-26495963-id-3279216.html

http://www.linuxso.com/linuxpeixun/10332.html

http://www.cnblogs.com/excelib/p/5155951.html

http://www.cnblogs.com/excelib/p/5150647.html

http://www.cnblogs.com/Anker/p/3269106.html

Linux防火牆配置(iptables, firewalld)