Linux網路——配置防火牆的相關命令 摘要:本文主要學習瞭如何在Linux系統中配置防火牆。 iptables命令 iptables準確來講並不是防火牆,真正的防火牆是運行於系統內核中的netfilter,而iptables僅僅是操作netfilter的一個工具,其所負責的主要功能便是與用戶交互, ...
Linux網路——配置防火牆的相關命令
摘要:本文主要學習瞭如何在Linux系統中配置防火牆。
iptables命令
iptables準確來講並不是防火牆,真正的防火牆是運行於系統內核中的netfilter,而iptables僅僅是操作netfilter的一個工具,其所負責的主要功能便是與用戶交互,獲取到用戶的要求,並轉化成netfilter可以接受的信息。
鏈的概念
當客戶端訪問伺服器的WEB服務時,客戶端是起點,WEB服務所監聽的套接字(IP地址和埠)是終點。當WEB服務需要響應客戶端請求時,WEB服務所監聽的IP與埠變成了起點,客戶端變成了終點。
如果想要防火牆能夠達到防火的目的,就需要在內核中的netfilter框架里設置關卡,所有進出的報文都要通過這些關卡,經過檢查後,符合放行條件的才能放行,符合阻攔條件的則需要被阻止,於是就出現了INPUT關卡和OUTPUT關卡。如果客戶端發來的報文訪問的目標地址不是本機,而是其他伺服器,這個時候就會用到PREROUTING關卡、FORWARD關卡和POSTROUTING關卡。這些關卡在iptables中被稱之為鏈。
簡要說明:INPUT鏈、OUTPUT鏈主要用在“主機防火牆”中,即主要針對伺服器本機驚醒保護的防火牆。FORWARD鏈、PREROUTING鏈、POSTROUTING鏈多用在“網路型防火牆”中,例如使用Linux防火牆作為網關伺服器在公司與Inetnet之間進行安全控制。
鏈的詳細說明:
1 INPUT鏈表示當收到訪問防火牆本機地址的數據包(入站)時應用的規則。 2 OUTPUT鏈表示當防火牆本機向外發送數據包(出站)時應用的規則。 3 FORWARD鏈表示當接收到需要通過防火牆中轉發送給其他地址的數據包(轉發)時應用的規則。 4 PREROUTING鏈表示在對數據包做路由選擇之前應用的規則。 5 POSTROUTING鏈表示在對數據包做路由選擇之後應用的規則。
表的概念
每個經過這個關卡的報文,都要將這條鏈上的所有規則匹配一遍,如果有符合條件的規則,則執行規則對應的動作。但是每個鏈上的規則可能不止一個,所以把具有相同功能規則的集合叫做表,通過規則表管理規則。
預設的iptables規則表有:
1 filter表是iptables的預設表,用於過濾包,如果沒有自定義表,那麼就預設使用filter表。 2 nat表用於網路地址轉換。 3 mangle表用於指定如何處理數據包,它能修改數據標記位。 4 raw表可以實現不追蹤某些數據包,預設系統的數據包都會被追蹤,用於處理異常。 5 security表用於強制訪問控制(MAC)的網路規則,在CentOS中沒有該表。
規則表應用優先順序:security,raw,mangle,nat,filter。
各條規則的應用順序:鏈內部的過濾遵循“匹配即停止”的原則,如果對比完整個鏈也沒有找到和數據包匹配的規則,則會按照鏈的預設策略進行處理。
包過濾流程
安裝
CentOS的版本7中,預設沒有安裝iptables工具,所以需要手動安裝:
1 [root@localhost ~]# yum install -y iptables-services 2 ... 3 ============================================================================================================================= 4 Package 架構 版本 源 大小 5 ============================================================================================================================= 6 正在安裝: 7 iptables-services x86_64 1.4.21-28.el7 base 52 k 8 為依賴而安裝: 9 iptables x86_64 1.4.21-28.el7 base 433 k 10 ... 11 完畢! 12 [root@localhost ~]#
啟動服務
使用管理服務的systemctl命令,啟動並查看iptables服務:
1 [root@localhost ~]# systemctl status iptables 2 ● iptables.service - IPv4 firewall with iptables 3 Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled) 4 Active: inactive (dead) 5 6 8月 16 10:38:38 localhost.localdomain systemd[1]: Stopped IPv4 firewall with iptables. 7 8月 16 10:39:29 localhost.localdomain systemd[1]: Stopped IPv4 firewall with iptables. 8 [root@localhost ~]# systemctl start iptables 9 [root@localhost ~]# systemctl status iptables 10 ● iptables.service - IPv4 firewall with iptables 11 Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled) 12 Active: active (exited) since 五 2019-08-16 10:41:24 CST; 2s ago 13 Process: 1582 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS) 14 Main PID: 1582 (code=exited, status=0/SUCCESS) 15 16 8月 16 10:41:24 localhost.localdomain systemd[1]: Starting IPv4 firewall with iptables... 17 8月 16 10:41:24 localhost.localdomain iptables.init[1582]: /usr/libexec/iptables/iptables.init:行22: /etc/init.d/func…或目錄 18 8月 16 10:41:24 localhost.localdomain iptables.init[1582]: iptables: Applying firewall rules: /usr/libexec/iptables/i…到命令 19 8月 16 10:41:24 localhost.localdomain systemd[1]: Started IPv4 firewall with iptables. 20 Hint: Some lines were ellipsized, use -l to show in full. 21 [root@localhost ~]#
基本語法
1 iptables [指定表] [選項] [條件] -j [策略]
指定表說明
1 -t 表名:用來指定操作的表,有filter、nat、mangle或raw,預設使用filter。
選項說明
查看的選項:
1 -L 鏈名:查看指定表指定鏈的規則,不指定鏈則查看指定表的所有規則。 2 -v:查看詳細信息。 3 -n:以數字格式顯示主機地址和埠號。 4 -x:顯示計數器的精確值。 5 --line-numbers:查看規則時,顯示其在鏈上的編號。
管理規則的選項:
1 -A 鏈名:添加新規則於指定鏈的尾部。 2 -I 鏈名 數字:添加新規則於指定鏈的指定位置,預設為首部。 3 -R 鏈名 數字:替換指定的規則為新的規則。 4 -D 鏈名 數字:根據規則編號刪除規則。
管理鏈的選項:
1 -N 鏈名:新建一個自定義的規則鏈。 2 -X 鏈名:刪除指定表指定自定義鏈的規則,不指定鏈則刪除指定表的所有自定義鏈的規則。 3 -F 鏈名:清空指定表指定鏈的規則,不指定鏈則清空指定表的所有規則。 4 -E 原鏈名 新鏈名:重命名鏈。 5 -Z:清空鏈及鏈中預設規則的計數器。 6 -P 鏈名 策略, 設置鏈路的預設策略。
條件說明
1 -s IP地址:匹配源地址,這裡不能指定主機名稱,必須是IP。主要有3種,IP、IP/MASK、0.0.0.0/0.0.0.0。地址可以取反,加一個“!”表示除了哪個IP之外。 2 -d IP地址:匹配目標地址,規則同-s。 3 --sport 埠號-埠號:指定源埠,不能指定多個非連續埠,只能指定單個埠。 4 --dport 埠號-埠號:指定目標埠,規則同--sport。 5 -i 網卡:從指定網卡流入的數據,流入一般用在INPUT和PREROUTING上。 6 -o 網卡:從指定網卡流出的數據,流出一般在OUTPUT和POSTROUTING上。 7 -p 協議:匹配協議,這裡的協議通常有3種,TCP、UDP、ICMP。 8 -m 埠號,埠號:表示啟用多埠擴展。
策略說明
1 ACCEPT:接收數據包。 2 DROP:丟棄數據包。 3 REJECT:被拒絕時,提示被拒絕的原因。 4 REDIRECT:將數據包重新轉向到本機或另一臺主機的某一個埠,通常功能實現透明代理或對外開放內網的某些服務。 5 SNAT:源地址轉換。 6 DNAT:目的地址轉換。 7 MASQUERADE:IP偽裝。 8 LOG:日誌功能。
保存配置
1 [root@localhost ~]# service iptables save 2 iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 確定 ] 3 [root@localhost ~]#
使用舉例
查看規則:
1 [root@localhost ~]# iptables -nvL 2 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) 3 pkts bytes target prot opt in out source destination 4 584 45376 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 5 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 6 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 7 1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 8 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 9 10 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) 11 pkts bytes target prot opt in out source destination 12 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 13 14 Chain OUTPUT (policy ACCEPT 4 packets, 464 bytes) 15 pkts bytes target prot opt in out source destination 16 [root@localhost ~]#
添加規則:
1 [root@localhost ~]# iptables -A INPUT -m state --state NEW -p tcp --dport 3306 -j ACCEPT 2 [root@localhost ~]# iptables -nvL 3 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) 4 pkts bytes target prot opt in out source destination 5 754 57856 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 6 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 7 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 8 1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 9 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 10 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:3306 11 12 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) 13 pkts bytes target prot opt in out source destination 14 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 15 16 Chain OUTPUT (policy ACCEPT 4 packets, 592 bytes) 17 pkts bytes target prot opt in out source destination 18 [root@localhost ~]#
刪除規則:
1 [root@localhost ~]# iptables -D INPUT 6 2 [root@localhost ~]# iptables -t filter -nvL 3 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) 4 pkts bytes target prot opt in out source destination 5 807 61588 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 6 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 7 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 8 1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 9 1 229 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 10 11 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) 12 pkts bytes target prot opt in out source destination 13 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 14 15 Chain OUTPUT (policy ACCEPT 19 packets, 2004 bytes) 16 pkts bytes target prot opt in out source destination 17 [root@localhost ~]#
firewalld命令
在CentOS系統的版本7中,firewalld防火牆取代了iptables防火牆,作為系統中netfilter內核模塊的管理工具。firewalld使用了daemon和service替代了iptables的service部分,其底層還是使用iptables的command作為防火牆規則管理入口。
同iptables比較
firewalld跟iptables比起來至少有兩大好處:
1)firewalld支持動態更新規則。使用iptables時,每一個單獨的更改都需要清空舊的規則並重新讀取所有規則,這種方式被稱為靜態防火牆件。而使用firewalld修改規則後,不需要重新載入所有規則,只需要將變更部分保存並更新到運行中的iptables即可,這種方式被稱為動態防火牆。
2)firewalld使用區域和服務而不是鏈式規則。即使不明白“五張表五條鏈”,而且對TCP/IP協議也不理解也可以實現大部分功能,在使用上要比iptables人性化很多。
配置方式
firewalld的配置方法主要有三種:圖形化工具、命令行工具、配置文件。
配置文件
firewalld的配置文件有兩個存儲位置:
1 /etc/firewalld/:用於用戶創建和自定義配置文件,覆蓋預設配置。 2 /usr/lib/firewalld/:用於預設和備用配置。
firewalld的配置文件結構非常簡單,主要包含兩個文件和三個目錄:
1 文件firewalld.conf是主配置文件,只有5個配置項: 2 1)DefaultZone表示使用的zone。預設值為public。 3 2)MinimalMark表示標記的最小值。預設值為100。 4 3)CleanupOnExit表示當退出firewalld後是否清除防火牆規則。預設值為yes。 5 4)Lockdown表示是否可以通過lockdown-whitelist.xml文件操作firewalld。預設值為no。 6 5)IPv6_rpfilter用來判斷所接受到的包是否是偽造的。預設值為yes。 7 文件lockdown-whitelist.xml規定了當Lockdown為yes的時候,哪些程式可以對firewalld進行操作。 8 文件direct.xml使用類似iptables的語法來進行規則的增刪,如果用到direct就會有這個文件。 9 目錄zones用來保存zone配置文件。 10 目錄services用來保存service配置文件。 11 目錄icmptypes用來保存和icmp類型相關的配置文件。
區域(zone)說明
所謂的區域就是一個信賴等級,某一等級下對應有一套規則集。劃分方法包括:網路介面、IP地址、埠號等等。
一般情況下,會有如下的這些預設區域:
1 drop:丟棄所有進入的數據包。 2 block:拒絕所有進入的數據包。 3 public:只接受部分選定的數據包。 4 external:應用在NAT設定時的對外網路。 5 dmz:非軍事區。 6 work:使用在公司環境。 7 home:使用在家庭環境。 8 internal:應用在NAT設定時的對內網路。 9 trusted:接受所有的數據包。
查看用戶配置目錄里的zone配置文件:
1 [root@localhost ~]# ls /etc/firewalld/zones 2 public.xml 3 [root@localhost ~]#
查看public.xml配置文件的內容:
1 [root@localhost ~]# cat /etc/firewalld/zones/public.xml 2 <?xml version="1.0" encoding="utf-8"?> 3 <zone> 4 <short>Public</short> 5 <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> 6 <service name="dhcpv6-client"/> 7 <service name="ssh"/> 8 </zone> 9 [root@localhost ~]#
可以看到配置文件中僅開放了 dhcpv6-client 服務和 ssh 服務。
服務(service)說明
iptables時代習慣使用埠號來匹配規則,但是如果某一個服務的埠號改變了,那就要同時更改iptables的規則,十分不方便,同時也不方便閱讀理解。
service配置文件使用服務名來命名,比如ssh的配置文件是ssh.xml,可以通過修改配置文件的內容來實現對規則的修改。
查看ssh.xml配置文件的內容:
1 [root@localhost ~]# cat /usr/lib/firewalld/services/ssh.xml 2 <?xml version="1.0" encoding="utf-8"?> 3 <service> 4 <short>SSH</short> 5 <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> 6 <port protocol="tcp" port="22"/> 7 </service> 8 [root@localhost ~]#
名詞解釋
target:策略,當區域在處理包的時候,如果沒有顯式指明策略,則使用區域的target表示的策略。有四個可選值:default(不處理並返回上一級)、ACCEPT(通過)、%%REJECT%%(拒絕並回覆)、DROP(丟棄不回覆),預設為default。
service:服務。
port:埠,使用port可以不通過service而直接對埠進行設置。
interface:介面,可以理解為網卡。
source:源地址,可以是ip地址也可以是ip地址段。
icmp-block:icmp報文阻塞,可以按照icmp類型進行設置。
masquerade:ip地址偽裝,也就是按照源網卡地址進行NAT轉發。
forward-port:埠轉發。
rule:自定義規則。
匹配zone
對於一個接受到的請求具體使用哪個zone,firewalld是通過三種方法來判斷的:
1)source,請求報文的源地址。
2)interface,接收請求的網卡。
3)firewalld.conf中配置的預設zone。
基本語法
1 firewall-cmd [--zone=區域] [--permanent] [選項]
可選配置說明
1 --zone:指定區域,不指定則使用預設區域。 2 --permanent:是否將改動寫入到區域配置文件中。
選項說明
查看和更改狀態:
1 --state:查看防火牆的狀態。 2 --reload:重新載入防火牆,中斷用戶的連接,將臨時配置清掉,載入配置文件中的永久配置。 3 --complete-reload:重新載入防火牆,不中斷用戶的連接(防火牆出嚴重故障時使用)。
使用應急模式:
1 --panic-on:開啟緊急模式,強制關閉所有網路連接。 2 --panic-off:關閉緊急模式。 3 --query-panic:查看是否為應急模式。
查看和操作區域:
1 --get-zones:查看所有區域。 2 --get-default-zone:查看預設的區域。 3 --set-default-zone=區域:更改預設的區域。 4 --get-active-zones:查看正在使用的區域。
查看區域配置:
1 --list-all:查看區域的所有配置,類似於iptables -nL。 2 --list-all-zones:查看所有區域的所有配置。
反向查詢區域:
1 firewall-cmd --get-zone-of-interface=介面:根據介面查詢區域。 2 firewall-cmd --get-zone-of-source=IP地址/子網掩碼:根據地址查詢區域。
操作區域綁定的地址:
1 --list-sources:查看區域綁定的地址。 2 --add-source=IP地址/子網掩碼:添加地址綁定的區域,地址綁定過則報錯。 3 --remove-source=IP地址/子網掩碼:刪除地址綁定的區域。 4 --change-source=IP地址/子網掩碼:更新地址綁定的區域,地址沒有綁定則添加。 5 --query-source=IP地址/子網掩碼:查詢地址和區域是否綁定。
操作區域開放的介面:
1 --list-interfaces:查看區域開放的介面。 2 --add-interface=介面:添加區域開放的介面。 3 --remove-interface=介面:刪除區域開放的介面。 4 --change-interface=介面:更新區域開放的介面。 5 --query-interface=介面:查詢區域是否開放介面。
配置區域的策略:
1 --get-target:查詢區域的策略。--permanent是必選的。 2 --set-target=策略:設置區域的策略。--permanent是必選的。
配置區域的服務:
1 --list-services:查看區域啟用的服務。 2 --add-service=服務:在區域啟用服務。 3 --remove-service=服務:在區域禁用服務。 4 --query-service=服務:查看區域是否啟用服務。
配置區域的埠:
1 --list-ports:查看區域啟用的埠。 2 --add-port=埠號/協議:在區域啟用埠。 3 --remove-port=埠號/協議:在區域禁用埠。 4 --query-port=埠號/協議:查看區域是否啟用埠。
配置區域的埠轉發:
1 --list-forward-ports:查看區域的埠轉發。 2 --add-forward-port=port=本地埠號:proto=協議:toport=目標埠號:toaddr=目標IP/子網掩碼:添加區域的埠轉發。 3 --remove-forward-port=port=本地埠號:proto=協議:toport=目標埠號:toaddr=目標IP/子網掩碼:刪除區域的埠轉發。 4 --query-forward-port=port=本地埠號:proto=協議:toport=目標埠號:toaddr=目標IP/子網掩碼:查詢區域是否有埠轉發。
配置區域按照icmp類型進行阻塞:
1 --list-icmp-blocks:查看區域阻塞的icmp類型。 2 --add-icmp-blocks=icmptype:添加區域阻塞的icmp類型。 3 --remove-icmp-blocks=icmptype:刪除區域阻塞的icmp類型。 4 --query-icmp-blocks=icmptype:查詢icmp類型是否在區域阻塞。
配置地址轉換:
1 --add-masquerade:開啟SNAT(源地址轉換)。 2 --remove-masquerade:關閉SNAT(源地址轉換)。 3 --query-masquerade:查詢SNAT(源地址轉換)是否開啟。
通過rich規則配置區域:
1 --list-rich-rules:查看rich規則。 2 --add-rich-rule='rich規則':添加rich規則。 3 --remove-rich-rule='rich規則':刪除rich規則。 4 --query-rich-rule='rich規則':查詢查看單條rich規則。