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報文.
dom
--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 #任何操做完成後,都必須刷新後,才能查看到。tcp
注: 實際上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
ui
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’xml
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]